简易加密壳

代码已开源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"