欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

python处理重定位数据

python处理重定位数据

DLL 脱壳 需要处理重定位  一般情况下 是把需重定位的地址RVA dump下来  然后 直接使用工具ReloREC.exe处理就可以了
其实我是看了  加密解密三 才知道这样处理重定位的= =
总觉得不保险  ReloREC.exe 处理 时需要输入 放置重定位表的偏移    万一偏移取得不好 重定位表过大  覆盖了 其它数据
怎么办(没试过RelocREC.exe是否可以 将重定位作为新节直接附加在PE的末尾)  虽然这样的可能性比较小  但总觉得是个疙瘩。。。。我更喜欢的就是 根据重定位地址的RVA生成一份重定位表的结构 
然后 将这个结构 作为新节  增加进PE文件 这样就不用担心 覆盖有效数据了,最后修改下 PE头里重定位字段就可以了
仔细看了下 PE格式 终于成功写出了 个脚本 直接生成重定位表结构 原先以为应该很复杂 现在写完才知道很简单
和RelocREC.exe一样先得有 一份重定位表RVA的BIN 才行, 然后可以通过LoadPE添加新节就可以了
-f: 重定位表RVA的BIN 
-o: 输出的重定位表结构的BIN文件名
脚本如下:
#!/usr/bin/env python
#-*-coding:UTF8-*- 
import struct as st
import sys
import getopt as go 
def makereloc(filename, newreloc):
    f = open(filename, "rb")
    fnew = open(newreloc, "wb")
    reloc = list((0, 8))
    flag = False
    while True:
        i = st.unpack('i', f.read(4))
        if reloc[0] != i[0] & 0xfffff000: 
            if reloc[0] != 0:
                if reloc[1] % 4 != 0:
                    reloc[1] += 2
                    #重定位表 4字节对齐 对齐处理
                    reloc.append(0) 
                for each in range(0, len(reloc)):
                    if each < 2:
                        format = "i"
                    else:
                        format = "H"
                    fnew.write(st.pack(format, reloc[each]))
            reloc = [i[0] & 0xfffff000, 8]
            if reloc[0] == 0:
                break 
        reloc[1] += 2
        reloc.append(i[0] & 0xfff | 0x3000)
    f.close()
    fnew.close() 
def main(argc, argv):
    try:
        opts, arg = go.getopt(argv[1:], "f: o:", ["file=", "output="])
    except go.GetoptErrot, e:
        print "not correct commandline"
        sys.exit(0)
    output = ".reloc"
    input = ""
    for opt, value in opts:
        if opt in ("-f", "--file"):
            input = value
        if opt in ("-o", "--output"):
            output = value 
    if input == '':
        input = raw_input("enter reloc file: ").strip()
    makereloc(input, output) 
if __name__ == "__main__":
    main(len(sys.argv), sys.argv)
以 加密解密三 光盘里 chap13\13.5 DLL文件脱壳\脱壳后目录下的dumped_.dll做个示范
直接载入dumped_.dll 可以看到  DLL没有重定位

现在用运行脚本 指定参数-f Relo.bin
生成文件.reloc
现在用LoadPE添加节 修改好PE头 
再度载入dumped_.dll

可以看到已经重定位了
不放心的话  可以把光盘目录下的修复过重定位表的dumped__.dll中 重定位结构dump出来 二进制比较一下  我这边比较下来完全一样
个人水平比较菜  拍砖轻点

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功