有时我们需要搜索特定字节,如 0x55 0x8B 0xEC。
要搜索字节或二进制模式,我们可以使用 idc.find_binary(ea,flag,searchstr,radix=16)。
ea 是我们要搜索的地址,flag 是方向或条件,有许多不同类型的标志。其名称和值如下所示:
Returns BADADDR - not found
#define SEARCH_UP 0x00 // search backward
#define SEARCH_DOWN 0x01 // search forward
#define SEARCH_NEXT 0x02 // start the search at the next/prev item
// useful only for find_text() and find_binary()
// for other Find.. functions it is implicitly set
#define SEARCH_CASE 0x04 // search case-sensitive
// (only for bin&txt search)
#define SEARCH_REGEX 0x08 // enable regular expressions (only for txt)
#define SEARCH_NOBRK 0x10 // don't test ctrl-break
#define SEARCH_NOSHOW 0x20 // don't display the search progress
先了解一下常用的flag。
searchstr 是我们要搜索的模式。
在 IDAPython 的 find_binary 函数中,如果没有显式指定 radix 参数,那么默认的进制解释可能会依赖于当前的 IDP 模块(即 IDA 的处理器模块)。这意味着对二进制模式的解释可能会根据 IDA 配置分析的架构或处理器类型而有所不同。
Python>pattern = '55 8B EC'
addr = idc.get_inf_attr(INF_MIN_EA)
for x in range(0, 5):
addr = idc.find_binary(addr, SEARCH_DOWN, pattern);
if addr != idc.BADADDR:
print(hex(addr), idc.generate_disasm_line(addr, 0))
Python>
0x401000 push ebp
0x401000 push ebp
0x401000 push ebp
0x401000 push ebp
0x401000 push ebp
在第一行,我们定义搜索模式。
搜索模式可以是以 0x 开头的十六进制格式,如 0x55 0x8B 0xEC 或 IDA 十六进制视图55 8B EC 中的字节。
除非我们使用 idc.find_text(ea,flag,y,x,searchstr),否则不能使用 \x55\x8B\xEC 格式。
idc.get_inf_attr(INF_MIN_EA) 用于获取可执行文件中的第一个地址。然后,我们将
idc.find_binary(ea, flag, searchstr, radix=16) 的返回值赋值给一个名为 addr 的变量。
可以通过将 addr 与 idc.BADADDR 进行比较来检验我们确实搜索到了结果。
还注意到上面输出的地址没有递增,这是因为我们没有传递 SEARCH_NEXT 标志。如果没有传递该标志,当前地址将用于搜索模式。下面是带 SEARCH_NEXT 标志的更正版本: