简易加密壳
代码已开源:https://github.com/yeanhoo/encryptPacker
加壳器实现
- 将需要加壳程序映射到内存
- 加载壳Dll
- 读取壳代码函数节区内偏移
- 保存需要加壳程序必须信息
- 加密需要加壳程序节区
- 复制壳节区
- 将程序必须信息写入到PE头空闲处
- 设置新OEP指向壳代码开始函数
- 保存到文件
壳代码实现
- 混淆代码
- 检测虚拟机
- 检测调试器
- 获取API
- 解密节区
- 修复IAT、重定位、TLS等信息
- HOOK IAT
- 跳转到原始OEP
壳代码VS配置:
配置属性->高级->字符集->使用多字节字符集
C/C++->语言->符合模式->否
C/C++->代码生成->安全检查->禁用安全检查(/GS-)
C/C++->代码生成->运行库->多线程(/MT)
C/C++->优化->优化->已禁用
链接器->清单文件->生成清单->否
链接器->调试->生成调试信息->否
链接器->高级->无入口点->是
OD脱加密壳通用模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| // 临时变量,用来保存API地址 MOV dwEAX,0
// 当EIP执行到这个地址的时候API放在EAX中 MOV dwGetProcAddr,00410000 // 当EIP执行到这个地址的时候IAT刚刚被填充为申请的那段内存地址 // 其地址中保存的是加密后的API地址,以及动态解密代码 MOV dwWriteIATAddr,00420000 MOV dwOEPAddr,00401000 // IEP执行到OEP就可以dump了 // 清除所有软件断点 BC // 清除所有硬件断点 BPHWCALL
// 设置硬件执行断点 BPHWS dwGetProcAddr,"x" BPHWS dwWriteIATAddr,"x" BPHWS dwOEPAddr,"x"
FIND: RUN
CASE1: CMP eip,dwGetProcAddr JNE CASE2 MOV dwEAX,eax JMP FIND
CASE2: CMP eip,dwWriteIATAddr JNE CASE3 MOV [edi],dwEAX JMP FIND
CASE3: CMP eip,dwOEPAddr JNE FIND MSG "OEP"
|