-
-
请教各位牛人一个问题
-
发表于:
2005-11-29 00:10
3927
-
目标进程中的一段代码如下:
0047E2A2 |> \5F pop edi ; 到此解密完毕
0047E2A3 |. 5E pop esi
0047E2A4 |. 5B pop ebx
0047E2A5 \. C3 retn
0047E2A6 90 nop
0047E2A7 90 nop
0047E2A8 90 nop
0047E2A9 90 nop
0047E2AA 90 nop
0047E2AB 90 nop
现在我在我自己的程序中动态修改OO47E2A2处的代码
MOV EAX, 我自己定义的函数地址
JMP EAX
就是让目标进程在指定位置跳到我自己程序的函数中,以执行我自己定义的函数,我的函数的作用就是先还原目标代码,然后再CALL 0047E2A2以期望目标进程继续执行,可是现在的问题来了,我发现当执行到0047E2A5 retn后程序出现异常,就是RET到一个未知位置了,请问各位如何才能使我的程序正常返回,并使目标进程继续正常执行呢?请各位指教一下,感谢!
下面是我的程序中定义函数:(我把完整的注释给加上来今天,忘各位相助)
TMyProc = function:integer; stdcall;//这是MyProc的定义
function MyProc:integer; stdcall; //这是MyProc实现
var
dwSize: cardinal;
begin
WriteProcessMemory(ProcessHandle, //目标进程句柄
AddOldProc, //目标进程中被修改的地址,为0047E2A2
@OldProc[2], //目标进程原数据保存结构体
8,
dwSize);//整个这个函数的目的很简单,恢复目标进程中被修改的代码
*************问题就在这个调用里***********************
Result := Old; //Old的定义; AddOldProc := pointer($0047E2A2);
// Old: TMyProc;
// Old := AddOldProc;
//这个调用是希望跳到目标进程0047E2A2处,执行目标进程原始的代码
//问题的原因其实就的堆栈被破坏了,但是我不知道如何做才能不破坏堆栈,使目标进程继续执行
*************问题就在这个调用里***********************
WriteProcessMemory(ProcessHandle, 目标进程0047E2A2处地址, @MyProc, 8, dwSize); //再修改目标进程代码,以期望下一次继续跳到我的函数中
end;
不知道我的注释是不是很清楚了,烦请各位看一看,谢谢
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!