任意調用EXE可執行文件中的函數

兩步解決exe無導出表與重定位表問題

As we know,可執行文件(.exe)是沒有導出表和重定位表的,想要調用一個 .exe 文件中的函數,我知道的有兩種思路。思路一:給二進制文件添加劇定位表區段以及導出表,在沒有深入理解 PE 結構的狀況下,不建議這麼作!這種方法又困難又耗時;思路二:修改程序的dll特徵碼,使用相對虛擬地址來調用函數,具體步驟:編程

  • 下載一個 PE Editor 之類的 PE 編輯器,修改二進制文件的入口點爲0
  • 在 dll 特徵碼那一欄,必須勾選可執行鏡像以及 dll,其它的可視狀況勾選


使用RVA相對地址調用函數

將 test.c 編程成 .exe 文件,源碼以下,使用 gcc test.c -o test.exewindows

#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 之類的反彙編器能夠輕鬆找到這個地址
  • 在調用以前,必定要聲明這個函數,函數的參數形式要與 IDA 中查看到的一致,諸如 typedef int(* func1)(int,int); 或者 typedef void(* func2)(int);,注意函數是指針類型
  • 注意強制類型轉換,好比 HMODULE 類型是不能夠直接加減運算的,須要轉換成 PBYTE 類型,即 BYTE *

END

相關文章
相關標籤/搜索