在 IDAPython 中定位 disasm 模式的更有效方法是什么?

逆向工程 艾达 蟒蛇 Python
2021-06-24 12:05:57

这是我的第一个“严肃的”IDAPython 脚本。正如我八九不离十怀疑,它的执行waaaayyyyy太慢了,所以我想问问关于这一些指针:

fp = MinEA()
end = MaxEA()

while fp < end:
    prev_inst = idc.prev_head(fp,MinEA())
    prev_prev = idc.prev_head(prev_inst,MinEA())
    next_inst = idc.next_head(fp,MaxEA())
    if idc.SegName(fp) == '.text' or idc.SegName(fp) == '.code':
        if idc.GetMnem(fp) == 'call':
            if (idc.GetOpnd(fp,0) == 'ds:GetProcAddress') or (idc.GetOpnd(fp,1) == 'ds:GetProcAddress'):
                if(idc.GetMnem(prev_inst) == 'push'):
                    if(idc.GetMnem(next_inst) == 'mov' and idc.GetMnem(prev_prev) == 'mov'):
                        print "GetProcAddress Found at %02X" % hex(fp)

此代码正在寻找这种类型的行为(动态 API 加载): 在此处输入图片说明

2个回答

我通常通过遍历导入的代码引用来解决这个问题。

就像是

for ref in CodeRefsTo(LocByName('GetTickCount'),True):
    print "%08x" % ref

这非常强大,因为除非我弄错了,否则这也正确引用了这样的片段:

mov     esi, ds:LoadLibraryW
push    edi             ; lpLibFileName
call    esi ; LoadLibraryW

其中代码引用作为最后一行正确返回,而不是第一行。

然后我通常使用PrevHead向后遍历代码GetMnem直到找到匹配的参数。

这是一个评论式的答案,但我想尽我所能。

另外,我希望您了解我在编程方面不是最好的,并且在自我逆转方面,所以这个答案可能远非最好的。

这个程序集有一些非常奇怪的东西,任何逆向工程师可能都会立即注意到,我很高兴你已经注意到了,那就是 1 步。你会发现还有在每个操作码字节的末尾,字节模式... 37 12是什么,我主要是说,这意味着你可以有可能检查操作码字节的结尾是相同的。这是一种定位 disasm 模式的方法。另外,顺便说一下,有一些用于 Python 的 find 签名库。这是一个,https ://pypi.python.org/pypi/libsigscan-python/20170124(我不确定它们是否与 IDAPyton 一起工作,顺便说一句,谁知道,也许 IDAPython 具有操作码字节查找功能)

希望这有帮助!祝你好运 :)

参考:

http://ask-leo.com/what_is_signature_scanning.html