1?嘗試在反匯編代碼中找到一個函數的二進制代碼
? ? 有的時候需要一個函數的二進制代碼,注入到另外的一些地方;以此程序為示例,
八叉樹的C++實現與原理解析-CSDN博客
Ollydbg打開可執行文件,我想先找到此函數的二進制代碼體,
createOctree(OctreeNode<T> * &root,int maxdepth,double xmin,double xmax,double ymin,double ymax,double zmin,double zmax)
一直在里面晃來晃去的找,?在第四列會給出一些函數的名字,但是確實沒有?createOctree?這個文本;
執行如下的菜單,
彈出如下的窗口,
?
這是程序中包含的所有文本,沒有?createOctree ;
那么系統的函數名,像調用的Win32 API會被識別標記,自己的函數名,應該是編譯之后變成了某種標記,不再是文本的函數名;
然后又找;發現,在第4列,有Arg1、Arg2這些東西,這應是函數的參數,被識別出來;
createOctree函數,有8個參數,代碼只有此函數有8個參數,找到一個有Arg1-Arg8的Call,這個被Call的地址,應該就是createOctree函數的起始地址;
上圖就是一個有8個參數的Call,0040E764,這地址應該就是?createOctree函數的起始,轉到此地址,
上圖應該就是?createOctree函數的起始;
那么如何找到函數的結尾呢;應該是找到call對應的ret,就結束了;問題是此call里面又包含多個call,不知怎么找到對應函數起始的call的ret;下回再說;
然后看一下代碼里有?system("cls");?這是從代碼調用一個DOS命令;
在反匯編代碼中識別出字符串?"cls",看到有2個地方都調用了0040C3CE,
轉到0040C3CE,這里應該就是system("cls")這個調用的執行部分的開始,
?
然后往下看一下,看到一個ret,在ret之前有command.com、cmd.exe這些字樣,這就對了,cls是一個DOS命令,DOS命令是屬于command.com或者cmd.exe;到這個ret,system("cls")這個語句的執行部分也許就結束了;
?
有時間繼續;?