简单说明了IDA的反汇编输出窗口内容、如何使用IDAPython对单条指令进行简单分析。后续的笔记将先分别从段(segment)、函数(function)、块(block)、指令(instruction)多个粒度,对IDAPython经常使用到的数据结构和函数API进行说明,然后再到分析必不可少的交叉引用(cross-references)和数据搜索(searching for code or data)。
segment的基本操作
如下是对段(segments)进行一些基本的操作。idautils.Segments()
会返回一个迭代器,可以使用循环遍历当前文件的所有段对象。对于每一个段对象可以使用idc.get_segm_name
获取段名、idc.get_segm_start
获取段起始地址、idc.get_segm_end
获取段的结束地址。
1 | import idautils |
在实际的代码中,有时候需要对当前地址ea
所在的段进行分析。idc.get_segm_start(ea)
和idc.get_segm_end(ea)
分别可以获取到地址ea
所在的段的起始地址和结束地址;idc.get_next_seg(ea)
可以获取到ea
所在段的下一个段起始地址,然后没有找到对应的寻找上一个段起始地址的API。使用idc.get_segm_name(ea)
则可以获取到当前地址ea
所在段的段名。如下:
1 | Python>ea = idc.here() |
同样的,也可以根据段名来获取到段相关属性:idc.get_segm_by_sel(idc.selector_by_name(str_SectionName))
。需要首先使用idc.selector_by_name(str_SectionName)
获取到段名为str_SectionName
的段选择器(selector),然后使用idc.get_segm_by_sel()
来获取到段的起始地址。如下:
1 | Python>str_SectionName = ".text" |
idc模块中常用的段操作函数
api | 作用 |
---|---|
get_segm_attr(segea, attr) | 根据段中的地址segea获取段的attr属性 |
get_segm_start(ea) | 获取段起始地址 |
get_segm_end(ea) | 获取段结束地址 |
get_segm_name(ea) | 获取段名 |
包含更多段操作的模块:ida_segment
idc
模块中对段的操作实际上是对ida_segment
模块中函数的封装,在ida_segment
模块中还有更多段的数据结构和方法,例如:
- 新增段:
add_segm
- 删除段:
del_segm
- 根据段名获取段:
get_segm_by_name
- 根据当前地址获取段名:
get_segm_name
- 设置段名:
set_segm_name
- 设置段的起始地址:
set_segm_start
、set_segm_end
- ……