为什么两条箭头线的地址不同?
我在.exe文件中的机器代码中插入蓝线,并期望在ADD指令之后将其与AND相同的地址中的值,但显然AND根据反汇编程序在不同的地址中占用.
我想到它可能是因为地址偏移但是C5 - BE = 7而F8 - EF = 9因此偏移量甚至不匹配,我不知道地址转换之间发生了什么; 如何0x0193A4EF在机器代码中给出的地址计算出来0x0131132A?
您正在使用RIP相对偏移量.
在解码指令时,反汇编程序对您说谎.
正确的解码是:
66 01 1D 2A 13 31 01 add WORD PTR [rip+0x131132a],bx
66 81 25 2A 13 31 01 7F FF and WORD PTR [rip+0x131132a],0xff7f
Run Code Online (Sandbox Code Playgroud)
由于RIP始终处于移动状态,因此您需要RIP在下一条指令的开头处进行,而不是应用偏移:6291BE + 7 + 131132A = 193A4EF完全按照列出的方式应用.
因为下一条指令长度为9个字节,并且您使用相同的RIP偏移量,所以现在需要添加9个字节,因此目标变为:6291C5 + 9 + 131132A = 193 A4F8,再次与列出的完全相同.
如果您希望两条指令都链接到同一地址,则需要使用不同的RIP偏移量.
始终将使用RIP寻址的指令长度添加到该指令的起始地址,然后应用偏移量.
我想知道为什么你的汇编程序不会自动为你做这个.许多汇编器都有REL伪寻址模式来解决这个问题.
参见例如NASM手册的第3.3节:
在64位模式下,NASM将默认生成绝对地址.REL关键字使其生成RIP相关地址.
好处REL是你不必费心自己计算偏移量,只需输入你之后链接的任何内容REL.汇编程序将弄清楚其余部分.
其他评论
无论您使用什么反汇编程序来分析代码都会被破坏.
该and值是FF7F,因为X64的是小端.如果它7FFF在指令字节中表示你(和你的反汇编程序)应该知道CPU将读取FF7F,因为最低有效字节首先出现.
请放弃那块垃圾并找一个像样的反汇编程序来分析你的机器代码.