首页 > 解决方案 > IDA python 查找问题

问题描述

我的目标是在进程的整个内存范围中搜索以下模式:

pop *
pop *
retn

我尝试过使用 FindText,但它似乎只返回已经在 IDA 中针对其指令进行解析的区域的结果。所以要使用 FindText id 需要弄清楚如何解析整个内存范围的指令(这似乎很密集)。

所以我切换到 FindBinary 但我也遇到了一个问题。我正在搜索的模式只需要匹配字节的前 5 位,其余的是通配符。所以我的目标是搜索:

01011***
01011*** 
11000011

我发现了声称 IDA 有 ? 字节的通配符,但我无法让它工作,即使它做到了,它似乎只适用于完整的 8 位。所以对于这种方法,我需要找到一种方法来搜索位模式,然后解析结果周围的位。这似乎是最可行的路线,但到目前为止,我无法在文档中找到任何可以搜索这样的位的内容。

有谁知道一种方法来完成我想要的?

标签: pythonassemblyida

解决方案


在经典的 stackoverflow 风格中,我花了几个小时试图弄清楚,然后在寻求帮助后 20 分钟我找到了我需要的确切功能,get_byte()

def find_test():
    base = idaapi.get_imagebase()
    while True:
        res = FindBinary(base, SEARCH_NEXT|SEARCH_DOWN, "C3")
        if res==BADADDR: break
        if 0b01011 == get_byte(res-1) >> 3 and 0b01011 == get_byte(res-2) >> 3: 
            print "{0:X}".format(res)
        base=res+1

现在,如果我能弄清楚如何在每条指令中使用通配符来做到这一点。因为对于这个解决方案,我需要知道至少一个完整的模式字节


推荐阅读