谁能告诉我如何清除包含以下块的代码:

call $+5
pop reg
add reg, 08BE96h
[...]


换句话说,我需要将所有此类块更改为:

mov reg, offset


编辑#1

列出所有块EA:

ea = ScreenEA()
for funcea in Functions(SegStart(ea), SegEnd(ea)):
    E = list(FuncItems(funcea))
    for e in E:
        if idc.GetMnem(e) == "call" and idc.GetOpnd(e, 0) == "$+5" and idc.GetMnem(e + 5) == "pop":
            print "%x" % e


评论

您是否要求完整的idc / idapython脚本?

好吧,如果存在这样的脚本...

肯定有可能通过IDC(PatchByte)修补IDA数据库内容。如果没有其他人答复,我稍后将尝试提出自己的版本。

#1 楼

这是扫描此模式当前关注的功能的粗略实现:

call $+5
pop <reg>
op <reg>, imm32


并将其更改为

/>让它适应于扫描不同的范围并支持更多说明,作为练习留给读者。




评论


谢谢,但是我发现您的脚本需要更正,因为它破坏了我的代码。我将在几天后发布结果。

–伊利亚·马特维奇科夫(Ilya Matveychikov)
13年5月23日在19:32

#2 楼

呼叫$ + 5为5 byte(e8 00000000)
流行注册表为1 byte
如果需要3 and more bytes成为call $+5,则添加注册表为mov reg , const

您首先需要计算返回地址+常量的值

,然后使用pop reg + 0xbe96

留下5 byte mov REG, computed value,您需要点此删除,以便如果您不点个字节,执行路径将保持不变,则剩下的垃圾字节会更改执行路径