As we know,可執行文件(.exe)是沒有導出表和重定位表的,想要調用一個 .exe 文件中的函數,我知道的有兩種思路。思路一:給二進制文件添加劇定位表區段以及導出表
,在沒有深入理解 PE 結構的狀況下,不建議這麼作!這種方法又困難又耗時;思路二:修改程序的dll特徵碼
,使用相對虛擬地址來調用函數,具體步驟:編程
將 test.c 編程成 .exe 文件,源碼以下,使用 gcc test.c -o test.exe
windows
#include <stdio.h> void func(){ printf("You have successed!!!\n"); } int main(){ func(); return 0; }
生成的這個 .exe 不能直接用 LoadLibrary()+GetProcAddress() 來調用函數。先按照以前的步驟,修改這個文件特徵碼,將入口點改成0,勾選可執行鏡像以及dll
,而後這個 .exe 才能正確被裝載到主調程序的內存中
這時候咱們須要寫主調程序來調用上述的 .exe 中的 func 函數。call_exe.c 的源碼以下:編輯器
#include <stdio.h> #include <windows.h> typedef void (*func1)(); int main(){ HMODULE hdll = NULL; hdll = LoadLibrary("test.exe"); if(hdll != NULL){ printf("YES\n"); /* func1 myfunc = ((func1)((PBYTE)hdll+0x1560)); myfunc(); */ ((func1)((PBYTE)hdll+0x1560))(); }else{ printf("NO\n"); } FreeLibrary(hdll); return 0; }
特別說明:函數
0x1560
這個地址就是 test.exe 中 func 的相對虛擬地址,對逆向熟悉的朋友應該瞭解,使用 IDA 之類的反彙編器能夠輕鬆找到這個地址typedef int(* func1)(int,int);
或者 typedef void(* func2)(int);
,注意函數是指針類型PBYTE
類型,即 BYTE *