python 脚本处理IDA的Dif文件

dif文件例子:

This difference file has been created by IDA

armhook
This difference file has been created by IDA

armhook
000001CC: 04 53
000001CD: B0 A8
000001CE: 2D 01
000001CF: E5 EB

0006A320: 02 F0
0006A321: 02 47
0006A322: 02 2D
0006A323: 02 E9
0006A324: 02 30
0006A325: 02 00
0006A326: 02 9F
0006A327: 02 E5
0006A328: 02 DA
0006A329: 02 62
0006A32A: 02 FE
0006A32B: 02 EB
0006A32C: 02 04
0006A32D: 02 B0
0006A32E: 02 2D
0006A32F: 02 E5
0006A330: 02 F0
0006A331: 02 87
0006A332: 02 BD
0006A333: 02 E8

0006A350: 02 68
0006A351: 02 69
0006A352: 02 20
0006A353: 02 61
0006A354: 02 72
0006A355: 02 6D
0006A356: 0C 20
0006A357: 02 68
0006A358: 02 6F
0006A359: 02 6F
0006A35A: 02 6B
0006A35B: 03 00
0006A35C: 02 50
0006A35D: 02 23
0006A35E: 02 07
0006A35F: 02 00

对应的idadiff.py脚本代码

#!/usr/bin/env python
# coding=cp936 

# 将ida导出的.dif 补丁到程序中
import re
from sys import argv,exit

def patch(file, dif, revert=False):
  code = open(file,'rb').read()
  dif = open(dif,'r').read()
  m = re.findall('([0-9a-fA-F]+): ([0-9a-fA-F]+) ([0-9a-fA-F]+)', dif)
  for offset,orig,new in m:
    o, orig, new = int(offset,16), orig.decode('hex'), new.decode('hex')
    if revert:
      if code[o]==new:
        code = code[:o]+orig+code[o+1:]
      else:
        raise Exception("patched byte at %s is not %02X" % (offset, ord(new)))
    else:
      if code[o]==orig:
        code = code[:o]+new+code[o+1:]
      else:
        raise Exception("original byte at %s is not %02X" % (offset, ord(orig)))
  open(file,'wb').write(code)

def main():
  if len(argv)<3:
    print "Usage: %s <binary> <IDA.dif file> [revert]" % (argv[0])
    print "For example: idadif executable.exe executable.dif"
    print "Applies given IDA .dif file to patch binary; use revert to revert patch."
    exit(0)
  
  file, dif, revert = argv[1], argv[2], False
  if len(argv)>3:
    revert = True
    print "Reverting patch %r on file %r" % (dif, file)
  else:
    print "Patching file %r with %r" % (file, dif)
  
  try:
    patch(file, dif, revert)
    print "Done"
  except Exception, e:
    print "Error: %s" % str(e)
    exit(1)

if __name__ == "__main__":
  main()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值