乐趣区

关于python:LyScript-获取上或下一条汇编指令

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()

输入成果如下:

退出移动版