本章介绍脱壳的后 2 个步骤,转存可执行文件和重建导入函数表。

转存

按照上一章内容转到 OEP 解密出原始代码并且操作 IDA 重新分析程序,准备执行转存操作。

也可以不用断点,因为程序并没有运行后再加密回去。

使用脚本来进行dump:

import idaapi

def main():
  start_ea = 0x400000
  end_ea = 0x40b200
  byte_array = bytearray()
  for ea in range(start_ea, end_ea):
    byte_array.append(idaapi.get_byte(ea))
  with open("C:/xxxx/dump.exe", "wb") as fp:
	  fp.write(byte_array)
   
if __name__ == "__main__":
  main()

在上面的脚本当中,我们dump的地址范围是 0x400000 到 0x40b200。

这个地址范围是HEADER段到OVERLAY段的地址。

保存脚本文件,例如 DUMPER.py,之后打开菜单 FILE-SCRIPT FILE 运行,生成文件。

IAT介绍

IAT (Import Address Table,导入地址表) 是 PE 程序中用于管理外部函数调用的重要数据结构。

IAT 的作用:

IAT 的工作原理:

  1. 编译链接阶段: 编译器和链接器会在 PE 文件中创建 IAT,并用占位符填充需要导入的函数地址。
  2. 加载阶段: 操作系统加载器会根据 PE 文件中的导入表信息,找到相应的 DLL 文件。
  3. 地址解析: 加载器会解析 DLL 文件中的导出函数地址,并将这些地址填入 IAT 中的占位符。
  4. 函数调用: 当 PE 程序调用外部函数时,会先跳转到 IAT 中对应的地址,然后间接跳转到实际的函数地址。

SO系列文章里面也有重定位的内容,是差不多的。