在 IDA Pro 中搜索指令序列

逆向工程 艾达 静态分析
2021-06-11 10:02:06

如何在 IDA Pro 中搜索指令序列?

我确实设法使用文本搜索字符串li.*r4.*-1(用于指令li r4, -1搜索单个指令,但我未能匹配多个指令或换行符。

通过使用二进制搜索似乎可以做到这一点,但这需要将程序集转换为相应的二进制操作码。

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将要使用的寄存器,但知道这将是这种模式slwiadd那么我会写一个脚本(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]" );
}