IDA中搜索
我们已经讨论过如何在列表选择视图中进行搜索,那么如果您需要搜索IDA中的其他位置,该怎么办?
文本搜索
在搜索文本内容时,相同的快捷键对(Alt–T开始,Ctrl–T继续)几乎在IDA显示文本的任何地方都可以使用:
-
反汇编 (IDA 视图) -
十六进制视图 -
反编译输出 (伪代码) -
输出窗口 -
结构和枚举窗口 -
列表选择视图
这种搜索会匹配当前视图中的任何文本,例如指令和注释(如果有)。
对于主窗口,此操作也可以通过搜索 > 文本... 菜单项访问。
提示“(慢!)”指的是在进行文本搜索时,IDA必须渲染搜索范围内的所有文本行,这可能会非常慢,尤其是对于大二进制文件。然而,如果您需要正则匹配或在注释中搜索文本,等待是值得的。
二进制搜索
可以通过快捷键对Alt–B/Ctrl–B或搜索 > 字节序列... 来访问此功能,该功能允许在数据库中搜索字节序列(包括字符串文本)和模式(包括调试期间的进程内存)。
输入行接受以下输入:
-
字节序列(以空格分隔):
01 02 03 04
-
带通配符字节的字节序列:
68 ? ? ? 0
将匹配68 C4 1A 48 00
和68 D8 1A 48 00
。 -
一个或多个选定基数(十六进制、十进制或八进制)的数字: 根据当前处理器字节序,数字会转换为所需的最小字节数。例如,
04469E0
在x86(一个小端处理器)上会转换为E0 69 44
。 -
带引号的字符串文本: 例如
"Error"
。该字符串将根据编码选择器中指定的编码转换为字节。如果选择了“所有编码”,将使用所有配置的编码进行搜索。 -
宽字符字符串常量(例如
L"test"
): 仅使用UTF-16将此类字符串转换为原始字节。
立即数搜索
如前所述,同一指令操作数可以在IDA中以不同方式表示。例如,一个这样的指令:
test dword ptr [eax], 10000h
也可以显示为:
test dword ptr [eax], 65536
甚至:
test dword ptr [eax], AW_HIDE
因此,如果您对 10000h
进行文本搜索,IDA 会找到第一种变化形式但找不到其他两种。在x86上,您可以使用二进制搜索 10000
十六进制(将转换为字节序列 00 00 01
),但这对使用非字节边界指令编码的处理器不起作用,或者如果无关的指令恰好匹配该字节序列,则可能会给出许多误报。因此,立即数值搜索更为理想的理由如下:
-
它只检查具有数值操作数或数据项的指令,提高搜索速度并减少误报。 -
它比较操作数的数值,因此任何表示方式的变化都不会影响匹配,这意味着它会找到上述三种变化中的任何一种。
可以通过快捷键对Alt–I/Ctrl–I或搜索 > 立即数值... 来使用。
该值可以使用C语法(十进制、十六进制、八进制)在任何数值基中输入。
搜索方向
默认情况下,所有搜索都从当前位置向“下”执行,即朝着增加的地址。您可以通过在单独的搜索对话框中勾选“向上搜索”或者预先通过搜索 > 搜索方向 进行更改。当前设置的值将显示在菜单项以及IDA的状态栏中。
“下一次搜索”命令和快捷键(Ctrl–T,Ctrl–B,Ctrl–I)也使用此设置。
查找所有出现的匹配
此复选框允许您将整个数据库或视图中的搜索结果列出,您可以随时检查,而不是一次次查看每次搜索命中。
选择搜索类型
这不是一个权威指南,但这里有一些建议:
-
由程序显示的文本(例如提示或错误信息): 引号子字符串的二进制搜索(注意:如果字符串不是硬编码而是在外部文件或资源流中,则此方法不起作用)。 -
魔数或错误代码: 直接搜索(在某些情况下,数值的二进制搜索也可以)。 -
没有明显交叉引用的地址: 地址值的二进制搜索(仅当引用实际直接使用该值而不是以某种方式计算它时才成功)。 -
特定指令操作码模式: 字节序列的二进制搜索(可能带有通配符字节)。 -
没有固定编码的指令: 助记符和/或操作数的文本搜索(可能为正则)。
交流群
添加小助手微信加入: OxCSorder
更多文章
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):IDA 技巧(48) IDA 中的搜索
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论