2013-03-07 20 views
2

我有2個FARPROC,我想用另一個使用ASM替換另一個的地址。如何使用ASM將FARPROC的內存地址移動到另一個函數?

什麼是FARPROC? 「[int(FAR WINAPI * FARPROC)()]在C語言中,FARPROC聲明表示一個具有未指定參數列表的回調函數。但是,在C++中,聲明中的空參數列表表示函數沒有參數。微妙的區別可以打破粗心的代碼下面是處理這種情況的一種方式:」

現在,多數民衆贊成覆蓋,這是我的代碼:

HMODULE h = LoadLibrary("myDLL.dll"); 
    FARPROC p = GetProcAddress(h, "[email protected]"); 

    if(!p) MessageBox(hwnd, "injected, but function not found", "Loader", NULL); 

    HMODULE dllHmodule = GetModuleHandle("InjectFunctions.dll"); 
    FARPROC injproc = GetProcAddress(dllHmodule, "[email protected]"); 

    if(!injproc) MessageBox(hwnd, "injproc is null", "Loader", NULL); 

    __asm{ 
     mov eax, p 
     ADD injproc [EAX],8 
    } 

我的問題是我如何使它所以當程序加載這個DLL調用p它會調用injproc?

+0

聽起來像你試圖做一些惡意的東西:) – OregonTrail 2013-03-07 16:57:50

+1

知道如何做這些事情並不是惡意的,它只是惡意使用這些東西的邪惡,我打算不這樣做:) – CyanPrime 2013-03-07 16:59:02

回答

1

外部DLL中的每個引用的函數都會在可執行文件標題區域的導入地址表中獲取一個條目。該條目的一部分是該函數的地址。這就是你打電話去其他地方的補丁。應該有很多關於如何在開放的互聯網上實現這個功能的例子,儘管我沒有方便的鏈接。

如果你想自己做,請從msdn下載Portable Executable規範,看看這些頭文件的格式是什麼。

相關問題