简单的活着

ida script

Posted on By Mista Cai

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) 还原namedisable_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) : 获取startend之间的heads(指令或数据)列表。
  • idautils.Funtions(start, end) : 获取startend之间的函数列表。默认获取所有函数。
  • idautils.Segments():返回二进制镜像中的段(节)列表。

idaapi

  • idaapi.FlowChart(f) :用来确定基本块的类。fidaapi.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:把文件打开,并把字符串变换为数据类型

###