如何在 IDA Pro 中搜索指令序列?
我确实设法使用文本搜索字符串li.*r4.*-1
(用于指令li r4, -1
)搜索单个指令,但我未能匹配多个指令或换行符。
通过使用二进制搜索似乎可以做到这一点,但这需要将程序集转换为相应的二进制操作码。
如何在 IDA Pro 中搜索指令序列?
我确实设法使用文本搜索字符串li.*r4.*-1
(用于指令li r4, -1
)搜索单个指令,但我未能匹配多个指令或换行符。
通过使用二进制搜索似乎可以做到这一点,但这需要将程序集转换为相应的二进制操作码。
如果您有一组固定的说明,您正在搜索例如:
li r4,0
li r5,16
li r6,32
假设您已经找到了一个位置,您可以查看二进制十六进制视图,找到您想要的字节模式并在二进制搜索中使用它,只需确保在每个字节之间写入一个空格,就像01 02 03 04
这样 IDA 将它们视为一个字节序列,而不是作为 word/int 类型的搜索。
如果你有一个像软匹配这样的正则表达式
slwi r0,r3,2
add r4,r4,r0
但你不知道r4
将要使用的寄存器,但知道这将是这种模式slwi
和add
那么我会写一个脚本(IDC或Python),其使用外条款文本搜索,然后检查下一条指令搜索匹配预期的测试,或移动到下一个外部子句。
因此,以下 idc 文件/代码执行外循环(我使用它来查找未设置为引用的地址偏移量),但它可能是一个很好的起始基础
#include <idc.idc>
static fixAllOffsets( strtext)
{
auto ea, offset;
auto last;
Message("Start\n");
ea = FindText(0x100000, SEARCH_DOWN | SEARCH_REGEX, 0, 0, strtext);
last = 0;
while( ea != BADADDR && ea != last)
{
Message("%a\n", ea);
// INSERT you next line checks here
last = ea;
ea = FindText(ea+6, SEARCH_DOWN | SEARCH_REGEX, 0, 0, strtext);
}
Message("End\n");
}
static main()
{
fixAllOffsets( "0x9[EF][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]" );
}