首页 > 编程语言 >LyScript 获取上或下一条汇编指令

LyScript 获取上或下一条汇编指令

时间:2022-11-19 14:01:12浏览次数:46  
标签:汇编 eip get dbg next 指令 LyScript disasm

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

  • 插件地址: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()

输出效果如下:

标签:汇编,eip,get,dbg,next,指令,LyScript,disasm
From: https://blog.51cto.com/lyshark/5870400

相关文章

  • LyScript 插件实现自定义反汇编
    LyScript插件默认提供了一个get_disasm_code()方法可以直接获取到指定行数的反汇编代码,但如果需要自定义获取或者是需要自己封装一个反汇编方法,则你可以用如下两种方式来得......
  • LyScript 寻找ROP漏洞指令片段
    ROP绕过片段简单科普一下,你可以理解成一个可以关闭系统自身内存保护的一段机器指令,这段代码需要我们自己构造,这就涉及到在对端内存搜寻这样的指令,LyScript插件增强了指令片......
  • JVM指令手册
    一、栈和局部变量操作将常量压入栈的指令aconst_null将null对象引用压入栈iconst_m1将int类型常量-1压入栈iconst_0将int类型常量0压入栈iconst_1将int类型常量1......
  • Day2学习:dos的常用指令
     day2学习:dos的常用指令打开方式同时按下win键+r打开运行窗,然后输入cmd,回车也可以在同时按下win+x,或者"开始"菜单上右键,在弹出菜单上选择"命令行提示符"或"命令提......
  • day2学习:dos的常用指令
    day2学习:dos的常用指令打开方式同时按下win键+r打开运行窗,然后输入cmd,回车也可以在同时按下win+x,或者"开始"菜单上右键,在弹出菜单上选择"命令行提示符"或"命令提示......
  • 【转】iOS Siri Shortcut快捷指令-- 不错不错!!
    原文网址:iOSSiriShortcut-简书(jianshu.com)最近研究了一下SiriShortcut和大家分享一下1.在开发者账号中申请的bundelid中要记得勾选SiriKitimage.png2.......
  • RISC-V 特权指令结构
    机器模式机器模式(缩写为M模式,M-mode)是RISC-V中hart(hardwarethread,硬件线程)可以执行的最高权限模式。在M模式下运行的hart对内存,I/O和一些对于启动和配置系......
  • Ubuntu上如何用指令运行nginx,还有查看相应的进程
    1、运行nginxnginx是web服务器,要执行起来才能够看到相应的进程信息sudo ./nginx(注意是在什么目录下使用这个命令)./ 表示当前目录下,如果不加上./就找不到nginx../......
  • vue2 指令
    v-text :<pv-text="username"></p> 使用v-text会覆盖原内容,使用不多差值表达式:{{}} v-html:  ......
  • 8086汇编 王爽版本 笔记集合
    8086汇编语言王爽版个人笔记这篇博客是个导航第一部分:绪论第二部分:访问寄存器和内存第三部分:汇编语言程序(书中4、5、6章)第四部分:内存寻址方式(书中7、8章)第五部分:......