|
主题 : : 实验八还是没弄清楚,求人帮忙啊.. [已解决] |
回复[ 5次 ]
点击[ 369次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-04-11 21:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2007-12-10 17:12 |
首先我知道
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
- | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-04-11 21:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2007-12-10 17:12 |
虽然最后的结果是可以跳到mov ax,4c00h这里来.但是不明白为什么EBF6不是往前面跳10个字节.而是8个字节呢?
我也知道jmp看的是偏移地址.问题是s处的地址是0BF4:0008,机器码是EBF6,往前跳10个.0008-0010=????但是对应的汇编码却又是JMP 0000,这个0000是根据哪里得来的?
这叫一个纠结啊...哎. | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-04-11 21:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:11
信誉值:0
注册日期:2009-03-19 18:06 |
首先要明确,EBF6中,F6是位移,而且是二进制的补码形式。转化为10进制,是-10,转化为16进制数,是-Ah,不是什么-10h
靠后的那个jmp指令位置是1454:0020,占用2个字节。因此,在执行这条指令以前(已取出,放入了缓冲器),ip自加2,指向了下一条指令的首地址1454:0022,然后执行指令EBF6,0022h-Ah=0018h(16进制减法),翻译成汇编指令是jmp 0018
靠前的那个复制过去的指令,复制的是机器码EBF6,占用了1454:0008开始的两个字节单元。因此,执行这条指令时,ip是指向1454:00a0的。00a0-a=0000.翻译成汇编指令是jmp 0000.
总结:一个exe程序中,所有的汇编代码都已经被转化为机器代码,也就是二进制的形式了。debug中的指令,是根据内存单元中的机器代码翻译过来的。因此,执行复制时复制的是二进制数据,不是指令本身。同一个数据,比如上面的EBF6,在不同的地方,可以解释为不同的汇编指令jmp 0018 和jmp 0000.当然,如果不包含位移,只包含绝对地址,那么机器指令处在内存中的任何位置,都解释为相同的汇编指令。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-04-11 21:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:11
信誉值:0
注册日期:2009-03-19 18:06 |
你们忘记ip要首先自加,按照自加后的ip作为基准进行计算 | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-04-11 23:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2007-12-10 17:12 |
多谢楼上的.清楚了一些.一条指令进入缓冲器中后ip就会增加这条指令的长度了.也明白了2处EBF6翻译成不同的汇
编代码的原因了.因为jmp 只是针对偏移地址.和目的地址无关,然而在算这个偏移地址时.必须当做此条指令已经进
入了缓冲区.也就是ip要先增加N个字节.N取决于此条指令的长度.然后再根据JMP的偏移量算出jmp的真实的物理地
址. | | |
|
|
|
|
[第5楼]
[ 回复时间:2009-04-11 23:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2007-12-10 17:12 |
此贴由 贴主 于 [ 2009-04-11 23:41 ] 结贴。 结贴原因:问题已解决 | | |