打印一行指令并没有什么用处。
IDAPython 的强大之处在于遍历所有指令,交叉引用地址并搜索代码或数据。指令、交叉引用地址以及搜索代码或数据,将在后面详细介绍。
我们从遍历所有程序段开始。
for seg in idautils.Segments():
print(idc.get_segm_name(seg), hex(idc.get_segm_start(seg)), hex(idc.get_segm_end(seg)))
.text 0x401000 0x402000
.idata 0x402000 0x4020d4
.rdata 0x4020d4 0x403000
.data 0x403000 0x404000
.gfids 0x404000 0x405000
idautils.Segments() 函数返回了一个可迭代类型的对象。所以,直接对返回结果使用 foreach 即可。该函数返回的结果类型实际上是一个 List,里面的 item 表示的是每个段的起始地址。
有了这个地址,我们可以获取段的更多信息:
idc.get_segm_name(ea),获取段的名字idc.get_segm_start(ea),获取段的起始地址idc.get_segm_end(ea),获取段的结束地址这个 ea 参数可以是段里面的任意一个地址。
idc.get_next_seg(ea),获取下一个段的起始地址,ea是当前段的任意地址。print(hex(idc.here()))
0x401ad3
print(hex(idc.get_next_seg(idc.here())))
0x402000
如果,想通过段名来获取起始地址,可以使用:
idc.selector_by_name('.text')
Out[69]: 1
idc.selector_by_name() 返回 segment selector。
segment selector 实际上是一个 int 值,从 1 开始递增。
再通过idc.get_segm_by_sel(int) 函数,即可获取段起始地址。这个函数参数需要传递一个 segment selector: