lbr*_*dnr 4 debugging x86 assembly lldb
好的,所以我开始使用装配工作.我从以下说明开始:
test al, al
jne 0x1000bffcc
Run Code Online (Sandbox Code Playgroud)
使用调试器,我希望代码不跳转到地址,0x1000bffcc所以我在jne指令上设置断点,然后使用以下lldb命令反转al寄存器:
expr $al = 1
Run Code Online (Sandbox Code Playgroud)
这很好用,所以我继续,直到我偶然发现以下非常相似的指令对:
test al, al
je 0x1000bffcc
Run Code Online (Sandbox Code Playgroud)
虽然这看起来很相似,但反转al寄存器似乎没有影响.它一直在跳跃着地址0x1000bffcc.所以我做了一些研究,并发现测试AND与al自身运行逻辑,然后设置零标志或ZF相应.这导致两个问题:
al在第一个例子中反转寄存器有帮助?非常感谢你的帮助!
test al, al
jne 0x1000bffcc
Run Code Online (Sandbox Code Playgroud)
该test指令执行逻辑和两个操作数,并根据结果设置CPU标志寄存器(不存储在任何地方).如果al为零,则anded结果为零并设置Z标志.如果al非零,则清除Z标志.(其他标志,如C arry ,o V erflow,S ign,P arity等也会受到影响,但此代码没有指令测试它们.)
jne如果未设置Z标志,该指令会改变EIP.有一个叫做同一操作的另一个助记符jnz.
如果你让test指令执行然后al在条件跳转指令之前改变,那么条件跳转仍然会在改变之前做任何事情al.那是因为价值al不再影响条件跳跃.如果在测试之前更改了值,那么它将按预期工作.
至于为什么改变它有时会产生影响:必须是因为修改后的值al正在影响其他逻辑.
要使用调试器使指令不跳转,请更改标志以设置Z标志.它可能被称为ZF,或者您可能必须修改EFLAGS寄存器中的位.如何执行此操作因调试器和可能的修订版而异.