系列汇总
- 写一个PE的壳_Part 1:加载PE文件到内存
- 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc)
- 写一个PE的壳_Part 3:Section里实现PE装载器
- 写一个PE的壳_Part 4:修复对ASLR支持+lief构建新PE
- 写一个PE的壳_Part 5:PE格式修复+lief源码修改
- 写一个PE的壳_Part 6:简单的混淆
文章目录
处理完Part 4,Part 5会轻松很多;Part 6主要是对Part 4 中的最终结果中加入简单的混淆
1.清理
step 1:移除不必要信息
- 当前现状
我们已经使用 -nostartfiles
和 -nostdlib
编译选项,在最终的二进制文件中移除了C的标准库和运行时库;但是结果PE中可能还有其他不必要的section和符号信息
给cal.exe打包的后的section分布如下
- 加入改变
我们将新增2个编译选项:-fno-ident
和 -fno-asynchronous-unwind-tables
进一步清除section
-fno-ident:忽略#ident命令
-fno-asynchronous-unwind-tables:用来不生成CFI指令,禁止生成.eh_frame和.eh_frame_hdr section
同时使用strip.exe
移除符号信息和调试信息,进一步减小文件体积
因此,compile_stub函数更改如下
def compile_stub(input_cfile, output_exe_file, more_parameters = []):
cmd = (["mingw32-gcc.exe", input_cfile