我在目标进程中注入了自己的DLL,然后要在目标进程中写入一个5个字节的CALL XXX代码,XXX为我的DLL中的代码,请问在我的DLL代码中要如何保存和恢复哪些数据?假设目标进程中某处原来的代码是这样的
:0058CC24 53 push ebx
:0058CC25 32DB xor bl, bl
:0058CC27 E835000000 call 0058CC61
:0058CC2C 83F852 cmp eax, 00000052
:0058CC2F 741D je 0058CC4E
:0058CC31 83F856 cmp eax, 00000056
:0058CC34 7418 je 0058CC4E
:0058CC36 3D76030000 cmp eax, 00000376 <-替换这里
:0058CC3B 7411 je 0058CC4E 替换后
:0058CC24 53 push ebx
:0058CC25 32DB xor bl, bl
:0058CC27 E835000000 call 0058CC61
:0058CC2C 83F852 cmp eax, 00000052
:0058CC2F 741D je 0058CC4E
:0058CC31 83F856 cmp eax, 00000056
:0058CC34 7418 je 0058CC4E
:0058CC36 3D76030000 call xxx <-替换这里
:0058CC3B 7411 je 0058CC4EDLL中
XXX: cmp eax, 00000376 原来的代码复制到这里继续执行
... 这里要怎么做才能使程序不至于崩溃?
ret
:0058CC24 53 push ebx
:0058CC25 32DB xor bl, bl
:0058CC27 E835000000 call 0058CC61
:0058CC2C 83F852 cmp eax, 00000052
:0058CC2F 741D je 0058CC4E
:0058CC31 83F856 cmp eax, 00000056
:0058CC34 7418 je 0058CC4E
:0058CC36 3D76030000 cmp eax, 00000376 <-替换这里
:0058CC3B 7411 je 0058CC4E 替换后
:0058CC24 53 push ebx
:0058CC25 32DB xor bl, bl
:0058CC27 E835000000 call 0058CC61
:0058CC2C 83F852 cmp eax, 00000052
:0058CC2F 741D je 0058CC4E
:0058CC31 83F856 cmp eax, 00000056
:0058CC34 7418 je 0058CC4E
:0058CC36 3D76030000 call xxx <-替换这里
:0058CC3B 7411 je 0058CC4EDLL中
XXX: cmp eax, 00000376 原来的代码复制到这里继续执行
... 这里要怎么做才能使程序不至于崩溃?
ret
解决方案 »
- CHtmlView加载内存流HTML内容,若碰上HTML内容有file:///则出错。
- CListCtrl SetItemData老出错
- 数据用send发出去后,recv一次应该接收多少?怎么知道接收完成了?
- 兄弟姐妹...啥也别说了..进来看吧
- 求教,不知道我的程序什么地方没有释放资源,运行期间一直申请分配内存.[救命啊,死了4次机器了]
- 哪里有网络入侵啊,检测什么方面的网站
- 奇怪的小问题!服务端发送消息时总是会莫名其妙多发一条乱码消息!(在线等待!)
- 急急:高分给你:我准备用OpenGL开发一个工艺流程的仿真,大家推荐几本书啊?
- 我想重载CString的等号操作符,让它可以用于unsigned short 类型的变量,请问需要怎样做?能否给出代码,或者例子
- 我编写ATL COM的时候遇到问题,是一个关于 ADO Exception 的问题,请大家帮忙
- 请问我做的一个COM组件,是独立运行的.exe形式的COM服务器,我想在WIN98注册,但在98下注册不了,所有MFC所需的动态库我都已经带上了,请
- 我要在我的程序中加入一段代码,用来分析用户输入的SQL where语句的语法是否正确,以及column name是否在表中存在,我应该如何入手,现在
把有关的寄存器push,再pop
如果在98内可以修改页属性或进入RING0修改!!!
2000内可以由于加强了内存管理用内存读写API方便点!!!要获得RING0困难点你可以去www.driverdevelop.com看看例子!!!
...//做你要干的事 //完成后,将原来的指令恢复
...
popad
jmp 0058CC36最好不要在不同的地方执行原来的指令,因为x86指令长度不固定,你可能取出的不是一个完整的指令,所以将指令恢复后在jmp回去。需要保存所有使用的寄存器值,如果你的代码使用了FPU/MMX的话,还要保存fpu的寄存器,具体可以查MMX指令表里面有。
不能破坏栈中的数据,否则就不能正确返回
跳回去的时候栈不一致也容易处理啊,add esp,4就可以了吧。
jmp 后面的数值是offset ,目标地址是jmp下一条指令的地址+offset就是了。要注意:是下一条指令的地址。jmp 有near jmp and far jmp , far jmp 的机器码是0xe9,near jmp 好像是0xeb。最烦人的是计算offset.至于堆栈的处理,还是比较容易的。
http://www.csdn.net/expert/topic/951/951819.xml?temp=.8591577
AndrewSchulmanDavidMaxeyMattPietrek,《未公开的Windows核心技术》,清华大学出版社,1993年。王志东,“Windows中文环境”,《Windows软件的应用与开发》,1993.5。
...//做你要干的事 //完成后,将原来的指令恢复
...
popad
jmp 0058CC36另外 jmp 不会将返回地址压栈(call才会将返回地址压栈). 如果说堆栈乱了,可能
是在你的DLL代码中出现了问题!
你的DLL中的代码形式(返汇编后的汇编指令)必须与Kevin_qing给出的代码相同,
绝对不能通过 ret 之类的语句返回! 只能再次通过jmp返回