版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lovefengruoqing/article/details/79177769
问题
一直在用微软自带的汇编debug软件,今天突然有了需要修改ip指令的需求,我以为debug里面有自带的修改ip地址的方法,但是查了很多资料,发现并没有。
思路
后来我研究了一下,其实可以通过朝当前的ip指向的地址内写入一个jmp到目的地的指令,然后单步执行这个指令,那么ip就自动跳转到目的地去了。
方法
1.我朝内存中写入了一段汇编代码,比如这样:
0AE8:0100 mov ax,0
0AE8:0103 mov bx,1
0AE8:0106 add ax,bx
0AE8:0108 add bx,2
0AE8:010B cmp bx,10d
0AE8:010F jl 106
2.现在我的ip指向的并不是0100
这个地址,比如指向的是0112
,按r查看寄存器当前状态
-r
AX=0000 BX=0011 CX=0000 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000
DS=0AE8 ES=0AE8 SS=0AE8 CS=0AE8 IP=0112 NV UP EI PL ZR NA PE NC
0AE8:0112 A2D899 MOV [99D8],AL DS:99D8=00
3.然后朝ip指向的当前地址写入一段跳转指令
-a 112
0AE8:0112 jmp 100
0AE8:0114
-r
AX=0000 BX=0011 CX=0000 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000
DS=0AE8 ES=0AE8 SS=0AE8 CS=0AE8 IP=0112 NV UP EI PL ZR NA PE NC
0AE8:0112 EBEC JMP 0100
-t
AX=0000 BX=0011 CX=0000 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000
DS=0AE8 ES=0AE8 SS=0AE8 CS=0AE8 IP=0100 NV UP EI PL ZR NA PE NC
0AE8:0100 B80000 MOV AX,0000
可以看到写入跳转指令以后,单步执行,ip马上就跳转到指定的地址去了,即将执行的正是mov ax,0
这一指令。
总结
其实想了想,上面的步骤并不是很严谨,如果你想直接用debug来验证自己的汇编代码,第一步就应该先将ip指向自己想要内存区域,第二步才是朝ip指向的内存中写入汇编代码,第三步才是进行调试。
当然如果你说要怎么修改寄存器的值,还是上面的思路,想好代码,写入内存,然后单步执行。
还有,差点忘了一点,也许上面的代码还有点问题,我ip所指向的内存离我写入汇编代码的地方太近了,也许我调整ip的时候,会覆盖了我所键入的代码。因此,最好还是要检查下代码被改了没,然后再进行执行调试。