恶意代码分析小技巧-dump文件修复
跟着大佬得文章进行dump,修复对应区段,继续分析的时候出现了下图所示的问题,,有些地址上的数据是红色的,查了下是重定位错误
对重定位修复后,如下图所示:
dump修复流程
1.在Xdbg中,内存布局 中找到需要dump的地址,选中右键选择将内存转存到文件
2. dump后的文件使用CFF打开,选择Section Headers ,如下图所示,需要对Raw Address 和 Raw Size对应的数据进行修改,因为文件是从内存中dump出来的,在内存中属于展开状态
3. 使用Virtual Address替换所有的Raw Address,使用Virtual Size按照0x1000对齐后替换所有的Raw Size,替换完成后如下所示:
4.使用IDA打开修复Sections后的文件,如下图所示,但是查看发现存在红色数据,也就是错误数据,如下图,排查发现都是重定位表中的数据
5.修复重定位表,利用python脚本修复,脚本和修复过程中打印信息如下
#coding:utf-8
import pefile
import struct
def read_data_at_address(file_path,dump_base,data_size):
reloc_rvas,image_base = get_rvas(file_path)
with open(file_path, "r+b") as file:
# 将文件指针移动到指定地址
for reloc_rva in reloc_rvas:
file.seek(int(reloc_rva, 16))
# 读取指定大小的数据
data = file.read(data_size)
dqword = struct.unpack('<Q', data)[0]
# 计算新数据
new_data = dqword - dump_base + image_base
file.seek(int(reloc_rva, 16))
# 将计算得到的新数据写入
file.write(struct.pack('<Q', new_data))
print("rva = [{}] : old data = [{} ] ==> new data [{}]".format(reloc_rva,hex(dqword), hex(new_data)))
def get_rvas(filename):
pe = pefile.PE(filename)
image_base = pe.OPTIONAL_HEADER.ImageBase
relocation_rvas = []
for section in pe.DIRECTORY_ENTRY_BASERELOC:
for sec in section.entries:
rva = hex(sec.rva)
relocation_rvas.append(rva)
return relocation_rvas,image_base
def main():
filename = "./rundll32_0000000002D70000.bin"
read_data_at_address(filename,0x2D70000,0x8)
if __name__ == "__main__":
main()
6.修复完成后的文件拖入IDA进行分析,查看重定位数据位置,如下图所示,修复完成,可正常分析