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
#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
,您需要点此删除,以便如果您不点个字节,执行路径将保持不变,则剩下的垃圾字节会更改执行路径
评论
您是否要求完整的idc / idapython脚本?好吧,如果存在这样的脚本...
肯定有可能通过IDC(PatchByte)修补IDA数据库内容。如果没有其他人答复,我稍后将尝试提出自己的版本。