首先我知道
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
是把s2处的内容复制到s处.也就是s2处的EBF6复制到s处正好覆盖掉s处的2个nop,当程序走到s0:jmp short s
时.按道理说应该执行EBF6对应的汇编码.但是
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=0010 NV UP EI PL NZ NA PO NC
0BF4:0010 2E CS:
0BF4:0011 8B04 MOV AX,[SI] CS:0020=F6EB
-t
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=0013 NV UP EI PL NZ NA PO NC
0BF4:0013 2E CS:
0BF4:0014 8905 MOV [DI],AX CS:0008=9090
-t
-- 下步是执行s0:jmp short s
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=0016 NV UP EI PL NZ NA PO NC
0BF4:0016 EBF0 JMP 0008
-t
跳到s处后发现s处的2个nop被EBF6覆盖掉了,此时的IP=0008,如果执行EBF6,而F6是-10的补码.
那不是IP=IP-10=8-10=-2????????但是奇怪的是EBF6对应的机器码却是JMP 0000,也就是向前跳了8个字节.
为什么F6的补码是-10.不是8呢?这个地方老是搞不明白.求高手解答.
--下步就是s处的代码.
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=0008 NV UP EI PL NZ NA PO NC
0BF4:0008 EBF6 JMP 0000
- |