IDA Python
主要依赖的包
import idaapi 允许以类的形式,访问更多底层的数据
import idautils 常用的一个模块,大多处理都是需要这个模块
import idc 兼容IDC函数的模块
术语
idb:IDA打开应用时,会为其创建一个数据库,后缀为idb。
基础函数
Python>ea = here() # 返回当前光标位置
Python>print hex(ea)
0x408261L
Python>hex(MinEA()) # 返回idb起始地址
0x401000L
Python>hex(MaxEA()) # 返回idb结束地址
0x423000L
节 segment
import idautils
import idc
for seg i idautils.Segments():
print idc.SegName(seg), idc.SegStart(seg), idc.SegEnd(seg)
idc.NextSeg(ea)
:获取下一节,ea
为当前地址范围内任意地址。
函数 function
import idautils
import idc
for func in idautils.Functions():
print hex(func), idc.GetFunctionName(func)
idautils.Functions()
返回所有函数的起始地址列表。
Python>func = idaapi.get_func(ea) # 获取函数结构类idaapi.func_t
Python>print type(func)
<class 'idaapi.func_t'>
Python>dir(func) # 查看该类的导出函数和属性
['__class__', '__del__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__gt__', '__hash__', '__init__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__swig_destroy__', '__weakref__', '_print', 'analyzed_sp', 'argsize', 'clear', 'color', 'compare', 'contains', 'does_return', 'empty', 'endEA', 'extend', 'flags', 'fpd', 'frame', 'frregs', 'frsize', 'intersect', 'is_far', 'llabelqty', 'llabels', 'overlaps', 'owner', 'pntqty', 'points', 'referers', 'refqty', 'regargqty', 'regargs', 'regvarqty', 'regvars', 'size', 'startEA', 'tailqty', 'tails', 'this', 'thisown']
IDC
IDC 是 IDA 扩展的一种脚本语言,用于自动化,或者扩展查询 IDA 数据库。
idc是IDA Python兼容IDC的模块。
Python>idc.GetFunctionName(ea)
sub_408250
Python>idc.GetDisasm(ea)
test eax, eax
Python>idc.SegName(ea) # 获取ea地址的段
.text
Python>idc.GetMnem(ea)
test
idc.GetFunctionName(ea)
返回一个函数名,ea
可以是函数中的任意二进制地址。idc.Demangle(name, disable_mask)
还原name
,disable_mask
标明如何还原name
的掩码,通常用GetLongPrm(INF_SHORT_DN)
或GetLongPrm(INF_LONG_DN)
获取该掩码。idc.GetDisasm(ea)
获取ea
地址的反汇编指令。idc.GetMnem(ea)
获取ea
地址的反汇编指令操作码。idc.NextHead(ea, maxea)
获取下一条指令或数据。ea
-maxea
搜索范围。idc.SegEnd(ea)
获取当前段的结束地址。ea
可以是该段的任意地址。类似的,idc.SegStart(ea)
和idc.SegName(ea)
。-
idc.wait()
等待自动分析结束。 idc.AskFile()
def AskFile(forsave, mask, prompt):
"""
Ask the user to choose a file
@param forsave: 0: "Open" dialog box, 1: "Save" dialog box
@param mask: the input file mask as "*.*" or the default file name.
@param prompt: the prompt to display in the dialog box
@return: the selected file or None.
"""
return idaapi.askfile_c(forsave, mask, prompt)
idc.Message(msg)
显示消息到消息窗口。msg:要打印的信息。
idautils
idautils.Heads(start, end)
: 获取start
和end
之间的heads(指令或数据)
列表。idautils.Funtions(start, end)
: 获取start
和end
之间的函数列表。默认获取所有函数。idautils.Segments()
:返回二进制镜像中的段(节)列表。
idaapi
idaapi.FlowChart(f)
:用来确定基本块的类。f
是idaapi.func_t
类型,用idaapi.get_func(ea)
` 获取。idaapi.get_func(ea)
:获取一个指针,指向idaapi.func_t
类。idaapi.get_imagebase()
:获取镜像基址。
python
执行
- 代码从没有缩进的地方开始执行,(非函数或类型定义)
if __name__ == '__main__':
区分被调用还是主动执行;被调用时__name__
为模块名,文件被执行时,__name__
为__main__
。
JSON
- json.load:把文件打开,并把字符串变换为数据类型
###