0x15 加壳与脱壳

1. 脱壳技巧 1 2 3 4 6


  • 脱壳的基本步骤

    • 找OEP -> [还原IAT] -> dump文件 -> 修复IAT
      • 通过在 OEP 位置查找 FF15 和 FF25 可以找到 IAT 设置硬件写入断点,重新运行程序
  • 具体的步骤见课上笔记

    • aspck: 抹除重定位
    • FSG: IAT表中间有 FFFF

2. 加壳原理


  • 什么是加壳

    • 利用特殊的算法,对可执行文件里的资源数据或代码进行压缩加密。添加对应的Stub代码段
    • 用于对加密后的文件解密,以及充当PE加载器的角色,对目标程序执行修复重定位、修复(加密)IAT等操作。
    • 常见的手段有:伪装OEP特征,反反汇编,IAT加密,函数偷取(通常偷取OEP),代码虚拟化等
  • 手动添加区段的步骤

    1. 区段头表中添加区段信息
    2. 文件头表中添加区段个数
    3. 修改扩展头中镜像大小
    4. 修改OEP为新的区段RVA
    5. 填充文件,主要是跳转原OEP的代码
  • 添加新区段

    • 新区段的文件偏移计算方式: 原文件大小(需要经过文件对齐粒度对齐)
    • 新区段rva计算方式 : 上一个区段的rva + 上一个区段的大小(内存粒度对齐后的大小)
    • 新区段的文件属性 : 可读可写可执行
    • 扩展头映像大小的设置 : 新区段的rva + 新区段的大小(不对齐, 文件粒度对齐, 内存粒度对齐的大小均可)
  • 移植区段修复重定位

    • 重定位项 = 重定位项 - stub.dll加载基址 + 被加壳程序默认加载基址 - stub.dll代码段rva + 被加壳程序新区段rva
  • 修复IAT

    • 遍历INT , 通过GetProcAddress获取函数地址并填写到IAT