LyScript 插件默认并没有提供上一条与下一条汇编指令的获取性能,当然你能够应用 LyScriptTools
工具包间接调用内置命令失去,不过这种形式显然在效率上并不现实,咱们须要在 LyScript 插件 API 根底上本人封装实现这个性能。
- 插件地址:https://github.com/lyshark/Ly…
获取下一条汇编指令: 下一条汇编指令的获取须要留神如果是被命中的指令则此处应该是 CC 断点占用一个字节,如果不是则失常获取到以后指令即可。
- 1. 咱们须要查看以后内存断点是否被命中,如果没有命中则阐明此处咱们须要获取到原始的汇编指令长度,而后与以后 eip 地址相加取得。
-
2. 如果命中了断点,则此处有两种状况
- 1.1 如果是用户下的断点,则此处调试器会在指令地位替换为 CC,也就是汇编中的 init 停机指令,该指令占用 1 个字节,须要 eip+ 1 失去。
- 1.2 如果是零碎断点,EIP 所停留的地位,则咱们须要失常获取以后指令地址,此处调试器没有改变汇编指令仅仅只下下了异样断点。
from LyScript32 import MyDebug
# 获取以后 EIP 指令的下一条指令
def get_disasm_next(dbg,eip):
next = 0
# 查看以后内存地址是否被下了绊子
check_breakpoint = dbg.check_breakpoint(eip)
# 阐明存在断点,如果存在则这里就是一个字节了
if check_breakpoint == True:
# 接着判断以后是否是 EIP,如果是 EIP 则须要应用原来的字节
local_eip = dbg.get_register("eip")
# 阐明是 EIP 并且命中了断点
if local_eip == eip:
dis_size = dbg.get_disasm_operand_size(eip)
next = eip + dis_size
next_asm = dbg.get_disasm_one_code(next)
return next_asm
else:
next = eip + 1
next_asm = dbg.get_disasm_one_code(next)
return next_asm
return None
# 不是则须要获取到原始汇编代码的长度
elif check_breakpoint == False:
# 失去以后指令长度
dis_size = dbg.get_disasm_operand_size(eip)
next = eip + dis_size
next_asm = dbg.get_disasm_one_code(next)
return next_asm
else:
return None
if __name__ == "__main__":
dbg = MyDebug()
dbg.connect()
eip = dbg.get_register("eip")
next = get_disasm_next(dbg,eip)
print("下一条指令: {}".format(next))
prev = get_disasm_next(dbg,12391436)
print("下一条指令: {}".format(prev))
dbg.close()
获取后果如下:
获取上一条汇编指令: 上一条指令的获取难点就在于,咱们无奈确定以后指令的上一条指令到底有多长,所以只能用笨办法,逐行扫描比照汇编指令,如果找到则取出其上一条指令即可。
from LyScript32 import MyDebug
# 获取以后 EIP 指令的上一条指令
def get_disasm_prev(dbg,eip):
prev_dasm = None
# 失去以后汇编指令
local_disasm = dbg.get_disasm_one_code(eip)
# 只能向上扫描 10 行
eip = eip - 10
disasm = dbg.get_disasm_code(eip,10)
# 循环扫描汇编代码
for index in range(0,len(disasm)):
# 如果找到了, 就取出他的上一个汇编代码
if disasm[index].get("opcode") == local_disasm:
prev_dasm = disasm[index-1].get("opcode")
break
return prev_dasm
if __name__ == "__main__":
dbg = MyDebug()
dbg.connect()
eip = dbg.get_register("eip")
next = get_disasm_prev(dbg,eip)
print("上一条指令: {}".format(next))
dbg.close()
输入成果如下: