打印一行指令并没有什么用处。

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 表示的是每个段的起始地址。

有了这个地址,我们可以获取段的更多信息:

这个 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: