我的目的是要修改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
.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
估计不行吧!