• LyScriptTools 反汇编API接口封装


    LyScriptTools模块实在LyScript模块反汇编基础上封装而成,其提供了更多的反汇编方法,可以更好的控制x64dbg完成自动化反汇编任务,API参考手册如下。

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

    is系列函数: 该系列是反汇编模块中的判断语句,主要用于验证当前或指定一个内存地址指令类型,如果是返回true否则返回false,该函数默认不传参数使用的是当前EIP所指向的位置,传入参数(十进制)则对指定位置进行判断。

    1. from LyScript32 import MyDebug
    2. from LyScriptTools32 import Module
    3. from LyScriptTools32 import Disassemble
    4. if __name__ == "__main__":
    5. dbg = MyDebug()
    6. connect_flag = dbg.connect()
    7. print("连接状态: {}".format(connect_flag))
    8. # 反汇编类
    9. dasm = Disassemble(dbg)
    10. ref = dasm.is_jmp()
    11. print("是否是JMP: {}".format(ref))
    12. dbg.close()

    实现效果如下:

    为了防止通用方法不够用,LyScriptTools中提供了自定义方法is_它可以判断任何类型的指令前缀,此处必须传递两个参数没有缺省值。

    1. from LyScript32 import MyDebug
    2. from LyScriptTools32 import Module
    3. from LyScriptTools32 import Disassemble
    4. if __name__ == "__main__":
    5. dbg = MyDebug()
    6. connect_flag = dbg.connect()
    7. print("连接状态: {}".format(connect_flag))
    8. # 反汇编类
    9. dasm = Disassemble(dbg)
    10. eip = dbg.get_register("eip")
    11. ref = dasm.is_(eip,"cmp")
    12. print("是否是CMP: {}".format(ref))
    13. dbg.close()

    验证效果如下:

    详细反汇编API参数列表如下:

    from LyScriptTools32 import Disassemble

    如下API定义中,地址后面带有0说明可以指定缺省值,缺省值默认取当前EIP位置。

    Disassemble 类内函数名函数作用
    is_call(address=0)是否是跳转指令
    is_jmp(address=0)是否是jmp
    is_ret(address=0)是否是ret
    is_nop(address=0 )是否是nop
    is_cond(address=0)是否是条件跳转指令
    is_cmp(address=0)是否cmp比较指令
    is_test(address=0 )是否是test比较指令
    is_(address,cond)自定义判断条件
    get_assembly(address=0)得到指定位置汇编指令,不填写默认获取EIP位置处
    get_opcode(address=0)得到指定位置机器码
    get_disasm_operand_size(address=0)获取反汇编代码长度
    assemble_code_size(assemble)计算用户传入汇编指令长度
    get_assemble_code(assemble)用户传入汇编指令返回机器码
    write_assemble(address,assemble)将汇编指令写出到指定内存位置
    get_disasm_code(address,size)反汇编指定行数
    get_disasm_one_code(address = 0)向下反汇编一行
    get_disasm_operand_code(address=0)得到当前内存地址反汇编代码的操作数
    get_disasm_next(eip)获取当前EIP指令的下一条指令
    get_disasm_prev(eip)获取当前EIP指令的上一条指令

    我们来举一个使用案例,其实和模块调用原理是一样的,调用时先初始化,然后就可以使用内部的函数了。

    1. from LyScript32 import MyDebug
    2. from LyScriptTools32 import Module
    3. from LyScriptTools32 import Disassemble
    4. if __name__ == "__main__":
    5. dbg = MyDebug()
    6. connect_flag = dbg.connect()
    7. print("连接状态: {}".format(connect_flag))
    8. # 反汇编类
    9. dasm = Disassemble(dbg)
    10. ref = dasm.is_jmp()
    11. print("是否是JMP: {}".format(ref))
    12. dbg.close()
  • 相关阅读:
    设计模式:外观模式(Facade Pattern),理解为小爱同学模式
    P1219 [USACO1.5] 八皇后 Checker Challenge
    Qt在空窗口中创建自己的按钮
    Spring事务实现的方式及底层原理
    Vue路由和Node.js环境搭建
    一文让你彻底了解Linux内核文件系统(大总结)
    力扣经典150题第三十九题:赎金信
    单模连接器损耗与影响因素
    前后端分离项目,vue+uni-app+php+mysql订座预约小程序系统设计与实现
    java毕业设计蛋糕店会员系统Mybatis+系统+数据库+调试部署
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/126168414