我的目的是要修改EXE的函数调用。EXE中有个函数地址是0x0085E9,我的DLL中有个函数New(),我要在DllMain()将中EXE中函数调用指令call 010085E9,改为call New()。通过反汇编,我找到了要修改的地方
.text:010088C6                 push    esi
.text:010088C7                 mov     ecx, ebx
.text:010088C9                 push    [ebp+wParam]
.text:010088CC                 call    sub_10085E9 //调用偏移为0x0085E9的函数于是我在DLLMain()中使用了以下代码
DllMain(...)
{
    char        loader[MAX_PATH];
    HMODULE     hExe;
    DWORD       *p;
    DWORD       temp;    //获取加载者的首地址,也就是我要修改的EXE的首地址
    GetModuleFileName(NULL,loader,MAX_PATH);
    hExe = GetModuleHandle(loader);    p = (DWORD*)((DWORD)hExe + 0x0088cc+1); //指向偏移为0x0088cd的地址
    
    temp = (DWORD)New - (DWORD)p - 4;
    *p = temp;
}我不大懂汇编,不知道它压的两个参数是什么东西,随便用了两个DWORD参数。由于我覆盖了原来的call指令,所以我要在我的New()函数中调用它原来的call要调用的函数,以恢复原状。
void New(DWORD a, DWORD b)
{
    .....
    p = (DWORD*)((DWORD)hExe + 0x0085E9)
    _asm
    {
        push b
        push a
        call p
    }
}现在的状况是EXE已经进入我的函数,但回去后没有像原来那样正常执行。不知是无法正确回去,还是堆栈不正确回去后无法正常运行。我这样计算p不知道是否正确,因为call使用的应该是相对地址,我这里得到的是绝对地址,不过从调试中改变p的值出现的非法操作提示信息来看,这个值应该是正确的。上面的代码没有出现非法操作,只是执行的时候没有任何信息,不知执行到哪去了。程序无法在debug下正确运行,我也法跟踪调试。我对汇编,堆栈,stdcall、 extern "C"这些函数调用方式都不大了解,请大家指导指导。下面是偏移为0x0085e9的函数用IDA pro反汇编出来的代码
.text:010085E9 sub_10085E9     proc near               ; CODE XREF: sub_10086B7+215p
.text:010085E9
.text:010085E9 arg_0           = word ptr  8
.text:010085E9 hWnd            = dword ptr  0Ch
.text:010085E9
.text:010085E9                 push    esi
.text:010085EA                 mov     esi, ecx
.text:010085EC                 call    sub_1008585
.text:010085F1                 movzx   ecx, [esp+arg_0]
.text:010085F6                 mov     edx, 9C5Bh
.text:010085FB                 cmp     ecx, edx
.text:010085FD                 jg      short loc_100864F
.text:010085FF                 jz      short loc_1008639
.text:01008601                 sub     ecx, 3F0h
.text:01008607                 jz      short loc_1008619
.text:01008609                 dec     ecx
.text:0100860A                 dec     ecx
.text:0100860B                 jz      loc_10086A3
.text:01008611                 dec     ecx
.text:01008612                 jz      short loc_1008639
.text:01008614                 jmp     loc_10086B3
.text:01008619 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:01008619
.text:01008619 loc_1008619:                            ; CODE XREF: sub_10085E9+1Ej
.text:01008619                 push    0               ; lParam
.text:0100861B                 push    0               ; wParam
.text:0100861D                 push    0F0h            ; Msg
.text:01008622                 push    [esp+0Ch+hWnd]  ; hWnd
.text:01008626                 call    ds:SendMessageW
.text:0100862C                 dec     eax
.text:0100862D                 neg     eax
.text:0100862F                 sbb     eax, eax
.text:01008631                 inc     eax
.text:01008632                 mov     dword_100D44C, eax
.text:01008637                 jmp     short loc_10086B3
.text:01008639 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:01008639
.text:01008639 loc_1008639:                            ; CODE XREF: sub_10085E9+16j
.text:01008639                                         ; sub_10085E9+29j
.text:01008639                 test    eax, eax
.text:0100863B                 jz      short loc_10086B3
.text:0100863D                 cmp     dword ptr [esi+4Ch], 0
.text:01008641                 jz      short loc_10086B3
.text:01008643                 push    dword ptr [eax+8]
.text:01008646                 mov     ecx, esi
.text:01008648                 call    sub_10083FF
.text:0100864D                 jmp     short loc_10086B3
.text:0100864F ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:0100864F
.text:0100864F loc_100864F:                            ; CODE XREF: sub_10085E9+14j
.text:0100864F                 mov     edx, 9C5Ch
.text:01008654                 cmp     ecx, edx
.text:01008656                 jz      short loc_10086A3
.text:01008658                 jle     short loc_10086B3
.text:0100865A                 cmp     ecx, 9C62h
.text:01008660                 jle     short loc_1008692
.text:01008662                 cmp     ecx, 9C77h
.text:01008668                 jz      short loc_1008682
.text:0100866A                 cmp     ecx, 9CA9h
.text:01008670                 jnz     short loc_10086B3
.text:01008672                 test    eax, eax
.text:01008674                 jz      short loc_10086B3
.text:01008676                 push    dword ptr [eax+8]
.text:01008679                 mov     ecx, esi
.text:0100867B                 call    sub_1008DD2
.text:01008680                 jmp     short loc_10086B3
.text:01008682 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:01008682
.text:01008682 loc_1008682:                            ; CODE XREF: sub_10085E9+7Fj
.text:01008682                 test    eax, eax
.text:01008684                 jz      short loc_10086B3
.text:01008686                 push    dword ptr [eax+8]
.text:01008689                 mov     ecx, esi
.text:0100868B                 call    sub_10081B3
.text:01008690                 jmp     short loc_10086B3
.text:01008692 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:01008692
.text:01008692 loc_1008692:                            ; CODE XREF: sub_10085E9+77j
.text:01008692                 test    eax, eax
.text:01008694                 jz      short loc_10086B3
.text:01008696                 push    ecx
.text:01008697                 mov     ecx, esi
.text:01008699                 push    dword ptr [eax+8]
.text:0100869C                 call    sub_10084B1
.text:010086A1                 jmp     short loc_10086B3
.text:010086A3 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:010086A3
.text:010086A3 loc_10086A3:                            ; CODE XREF: sub_10085E9+22j
.text:010086A3                                         ; sub_10085E9+6Dj
.text:010086A3                 test    eax, eax
.text:010086A5                 jz      short loc_10086B3
.text:010086A7                 push    0
.text:010086A9                 mov     ecx, esi
.text:010086AB                 push    dword ptr [eax+8]
.text:010086AE                 call    sub_10082EA
.text:010086B3
.text:010086B3 loc_10086B3:                            ; CODE XREF: sub_10085E9+2Bj
.text:010086B3                                         ; sub_10085E9+4Ej ...
.text:010086B3                 pop     esi
.text:010086B4                 retn    8
.text:010086B4 sub_10085E9     endp

解决方案 »

  1.   

    压的是返回地址和参数,EXTERN"C" 是申明c样式的函数,即参数从右往左入栈,同__cdecl,而__stdcall是从左往右
      

  2.   

    你上面说的都是压参数.函数调用过程就是调用者压入参数,call sub.call指令会保存当前的栈框架(就是当前的栈基址EBP和指令指针EIP),然后转到sub处执行.
      

  3.   

    这样他就可以进入你DLL中执行你DLL中的代码?
    估计不行吧!