• LyScript 插件实现自定义反汇编


    LyScript 插件默认提供了一个get_disasm_code()方法可以直接获取到指定行数的反汇编代码,但如果需要自定义获取或者是需要自己封装一个反汇编方法,则你可以用如下两种方式来得到。

    第一步直接获取到指定EIP位置的反汇编代码,这段代码可以这样来写。

    from LyScript32 import MyDebug
    
    if __name__ == "__main__":
        dbg = MyDebug()
        conn = dbg.connect()
    
        # 获取当前EIP地址
        eip = dbg.get_register("eip")
        print("eip = {}".format(hex(eip)))
    
        # 向下反汇编字节数
        count = eip + 15
        while True:
            # 每次得到一条反汇编指令
            dissasm = dbg.get_disasm_one_code(eip)
    
            print("0x{:08x} | {}".format(eip, dissasm))
    
            # 判断是否满足退出条件
            if eip >= count:
                break
            else:
                # 得到本条反汇编代码的长度
                dis_size = dbg.assemble_code_size(dissasm)
                eip = eip + dis_size
    
        dbg.close()
        pass
    

    输出效果如下。

    第二步得到当前EIP机器码,获取到当前EIP指针所在位置的机器码,你可以灵活运用反汇编代码的组合实现。

    from LyScript32 import MyDebug
    
    # 得到机器码
    def GetHexCode(dbg,address):
        ref_bytes = []
        # 首先得到反汇编指令,然后得到该指令的长度
        asm_len = dbg.assemble_code_size( dbg.get_disasm_one_code(address) )
    
        # 循环得到每个机器码
        for index in range(0,asm_len):
            ref_bytes.append(dbg.read_memory_byte(address))
            address = address + 1
        return ref_bytes
    
    if __name__ == "__main__":
        dbg = MyDebug()
        conn = dbg.connect()
    
        # 获取当前EIP地址
        eip = dbg.get_register("eip")
        print("eip = {}".format(hex(eip)))
    
        # 得到机器码
        ref = GetHexCode(dbg,eip)
        for i in range(0,len(ref)):
            print("0x{:02x} ".format(ref[i]),end="")
    
        dbg.close()
        pass
    

    输出效果如下所示:

    如果将如上两种方法结合在一起,那么你就可以获取到x64dbg反汇编窗口中的三个主要参数区中的内容了。

    from LyScript32 import MyDebug
    
    # 得到机器码
    def GetHexCode(dbg,address):
        ref_bytes = []
        # 首先得到反汇编指令,然后得到该指令的长度
        asm_len = dbg.assemble_code_size( dbg.get_disasm_one_code(address) )
        # 循环得到每个机器码
        for index in range(0,asm_len):
            ref_bytes.append(dbg.read_memory_byte(address))
            address = address + 1
        return ref_bytes
    
    if __name__ == "__main__":
        dbg = MyDebug()
        conn = dbg.connect()
    
        # 获取当前EIP地址
        eip = dbg.get_register("eip")
        print("eip = {}".format(hex(eip)))
    
        # 向下反汇编字节数
        count = eip + 20
        while True:
            # 每次得到一条反汇编指令
            dissasm = dbg.get_disasm_one_code(eip)
    
            print("0x{:08x} | {:50} | ".format(eip, dissasm),end="")
    
            # 得到机器码
            ref = GetHexCode(dbg, eip)
            for i in range(0, len(ref)):
                print("0x{:02x} ".format(ref[i]), end="")
            print()
    
            # 判断是否满足退出条件
            if eip >= count:
                break
            else:
                # 得到本条反汇编代码的长度
                dis_size = dbg.assemble_code_size(dissasm)
                eip = eip + dis_size
    
        dbg.close()
        pass
    

    获取效果图如下:

  • 相关阅读:
    图论-桥/割点/双连通分量/缩点/LCA
    未解决的问题
    hdu2586(LCA最近公共祖先)
    LCA最近公共祖先(least common ancestors)
    111
    poj1703 Find them, Catch them 并查集
    关于背包的注意事项
    codeforces343A A. Rational Resistance
    hdu(1171)多重背包
    HTML5事件—visibilitychange 页面可见性改变事件
  • 原文地址:https://www.cnblogs.com/LyShark/p/16521385.html
Copyright © 2020-2023  润新知