有时我们需要搜索特定字节,如 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 配置分析的架构或处理器类型而有所不同。

例子1

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 标志的更正版本: