我從C++ exe導出函數[使用_declspec(dllexport)]。該函數在由exe本身調用時工作正常。我正從另一個exe文件(測試項目的exe文件 - 我將調用這個exe2文件)加載這個exe文件(讓我們調用這個exe1文件),使用靜態鏈接,例如我使用exe1的.lib文件,同時編譯exe2和exe2,在啓動時將它加載到內存中,就像任何DLL。這會導致函數執行失敗。從exe加載exe
確切的問題是在反彙編函數中的switch case語句中顯示的。
彙編代碼時EXE1調用函數
switch (dwType)
0040FF84 mov eax,dword ptr [dwType]
0040FF87 mov dword ptr [ebp-4],eax
0040FF8A cmp dword ptr [ebp-4],0Bh
0040FF8E ja $LN2+7 (40FFD2h)
0040FF90 mov ecx,dword ptr [ebp-4]
0040FF93 jmp dword ptr (40FFE0h)[ecx*4]
考慮的最後兩個指令。 mov將傳入的參數移動到ecx中。在40EFF0h處,我們提供了相應案例陳述的各種說明。因此,當EXE2調用函數
switch (dwType)
0037FF84 mov eax,dword ptr [dwType]
0037FF87 mov dword ptr [ebp-4],eax
0037FF8A cmp dword ptr [ebp-4],0Bh
0037FF8E ja $LN2+7 (37FFD2h)
0037FF90 mov ecx,dword ptr [ebp-4]
0037FF93 jmp dword ptr [ecx*4+40FFE0h]
點什麼出錯的JMP將帶我們到相關情況的說明,
彙編代碼? 該指令地址爲。該代碼現在已被加載到內存中的不同位置。當編譯exe1時,編譯器認爲我們將始終啓動它,因此它總是會在0x0040000加載[與所有windows exes一樣]。因此它將40FFE0h這樣的一些值硬編碼到指令中。只有在第二種情況下,40FFE0和垃圾內存一樣好,因爲我們正在尋找的指令地址表不在那裏。
我該如何解決這個問題,而無需將exe1轉換爲dll?
試圖做同樣的事情,並得出同樣的結論。 – Chad 2013-08-17 12:30:32