• LyScript 获取上一条与下一条指令


    LyScript 插件默认并没有提供上一条与下一条汇编指令的获取功能,当然你可以使用LyScriptTools工具包直接调用内置命令得到,不过这种方式显然在效率上并不理想,我们需要在LyScript插件API基础上自己封装实现这个功能。

    LyScript项目地址:https://github.com/lyshark/LyScript

    获取下一条汇编指令: 下一条汇编指令的获取需要注意如果是被命中的指令则此处应该是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()
    
    折叠

    输出效果如下:

  • 相关阅读:
    leetcode做题笔记168. Excel表列名称
    Objective-C网络数据捕获:使用MWFeedParser库下载Stack Overflow示例
    Vim 常用命令记录
    『力扣刷题本』:移除链表元素
    始祖双碳新闻 | 2022年8月15日-8月19日碳中和行业早知道
    RK3568平台开发系列讲解(图像篇)BMP图像处理
    非全自研可视化表达引擎RuleLinK可视化之路
    Java基础-----正则表达式
    [配置] 安卓 | 将微信公众号文章保存到Notion
    jdk11新特性——JShell交互性工具
  • 原文地址:https://www.cnblogs.com/LyShark/p/16527744.html