IDAPython使用

IDAPython 模块介绍

  • idc 封装IDA的IDC函数的兼容模块
  • idautils 高级实用功能
  • idaapi 访问底层数据

使用方式

菜单栏

File->script command
IDAPython使用
切换为Python,在右侧输入脚本代码即可Run。
回显会在左下角会打印。

脚本执行框

IDAPython使用
在Python行输入后回车即可运行。

常用命令

https://bbs.pediy.com/thread-258831.htm

获取元素

获取当前光标所在地址
idc.ScreenEA()函数或者here()函数

获取当前地址所在的段(segment)名称
idc.SegName(ea)

获取当前地址的反汇编语句
idc.GetDisasm(ea)

获取当前反汇编语句的操作符
idc.GetMnem(ea)

获取操作数
idc.GetOpnd

获取载入程序的最小的有效地址
idaapi.MinEA()

获取载入的程序最大的有效地址
idaapi.MaxEA()

idainfo.is_32bit(), idainfo.is_64bit():判断IDA是32位的还是64位的,也就是可以通过上面的接口获取再调用,直接import idainfo是没有用的。

idaapi.Assemble(head, line):从head地址开始反汇编,寻找直到遇到line这条指令时停止,返回两个变量,一个表示是否成功,另外一个是最后这条line指令的字节表示,例如:ret就会是'\xc3'这一个字节来表示,有些指令可能由多个字节表示。

idaapi.get_inf_structure():获取当前打开的IDA的版本的信息,返回的是一个结构体,貌似是idainfo。

idaapi.Assemble(head, line):从head地址开始反汇编,寻找直到遇到line这条指令时停止,返回两个变量,一个表示是否成功,另外一个是最后这条line指令的字节表示,例如:ret就会是'\xc3'这一个字节来表示,有些指令可能由多个字节表示。
idaapi.GetMnem(addr):获取addr地址处的指令。
idaapi.MakeCode(addr):从addr地址开始尝试将数据转换为汇编代码。
idaapi.next_not_tail(addr):往下走一个指令,如果不是尾部,则返回下一条指令的起始地址。
idaapi.GetDisasm(addr):获取addr地址开始的一条汇编指令。
idaapi.GetFlags(addr):获取addr地址处的一系列标志位,可用来判断属于code还是data。
idaapi.isCode(Flags):通过Flags判断是否是汇编代码。
idaapi.MakeUnkn(addr, size):取消对addr地址处的size大小的定义,暂不清楚该地址是代码还是数据时可以使用。
idaapi.GetOpnd(addr, index):取addr地址处的指令的第index个操作数,从零开始,从左开始,依次为intel汇编语法中的目的操作数、源操作数。
idaapi.get_name_ea(min_ea, name):从min_ea地址开始,寻找名为name的有效地址,该name可以为函数名、label名。
idaapi.get_dword(addr):从addr地址处获取一个dword数据。
idaapi.MakeDword(addr):将addr开始的一个DWORD大小的数据定义为双字形式,举一反三,Q代表四字节数据,API形式一致。
idaapi.Segname(addr):得到addr地址所处的区段名。
idaapi.MakeFunction(addr):将addr地址处定义为一个函数,相当于快捷键P。
BADADDR: 常量,代表错误的地址。
idaapi.GetSpd(addr):获取addr地址处的栈指针SP的值,而在IDA中显示的值则是SP到BP基址针的差值,例如获取到的值为-4,在IDA中显示栈指针的情况时则为4。(栈从高地址向低地址增长,即向下增长,所以一般SP<BP)
idaapi.SetSpDiff(addr, diff):设置addr地址处的Sp指针与Bp指针的差值,在平衡堆栈时需要用到。
idaapi.next_head(head, BADADDR):遍历下一条指令,除非遇到BADADDR,返回下一条指令的地址。
idaapi.ua_mnem(addr):返回addr地址处的指令类型。
idaapi.MakeName(addr, ''):给addr地址处一个标记label。

https://d1nn3r.github.io/2019/06/10/IDAPython/
https://www.52pojie.cn/thread-1117330-1-1.html

上一篇:【DB宝36】使用Docker分分钟搭建漂亮的prometheus+grafana监控


下一篇:学习笔记--区分Java中类与对象