首页
社区
课程
招聘
[原创]PeCompact 2.x 通用简单脱壳法
发表于: 2005-2-16 15:29 14135

[原创]PeCompact 2.x 通用简单脱壳法

2005-2-16 15:29
14135
今天还有朋友在问PeCompact2.x的脱壳方法,我再这里把我的通用脱法提一下(在看其它高手们文章的基础上总结的,在此表示感谢).
  [法则]:
   PeCompact2.x是制造了两个异常(00000000内存写异常和Single Step单步循环异常),我们可以轻松通过查看SEH链来进行脱壳

下面我说一下通用简单脱壳法:

1、去掉所有异常忽略,保留kernel32里的内存读写异常忽略
2、F9,run
3、遇到写[00000000]内存异常,暂停
4、查看SEH 链,也可从esp+4获得第一个SE Handle,Ctrl+G,来到此地址
5、向下找jmp eax,大概在$+CB处,记住此地址
6、ollydbg重新载入,下硬件执行断点: he 第5步的地址,F9,Shift+F9,中断
7、F8
8、dump,imprec fix iat,完工

  [例子]:
   GameThrust1.2: http://www.onlinedown.net/soft/37372.htm
   工具: Ollydbg/LordPE/Imprec
   依照上面提及通用方法,去掉ollydbg中所有异常忽略,保留kernel32里的内存读写异常忽略
   用ollydbg载入GameThrust.exe,F9

00401000 > B8 34C05000 MOV EAX,GameThru.0050C034
00401005 50 PUSH EAX
00401006 64:FF35 00000000 PUSH DWORD PTR FS:[0]
0040100D 64:8925 00000000 MOV DWORD PTR FS:[0],ESP
00401014 33C0 XOR EAX,EAX
00401016 8908 MOV DWORD PTR DS:[EAX],ECX ;****此处异常****
00401018 50 PUSH EAX
00401019 45 INC EBP
0040101A 43 INC EBX


查看SEH 链,也可从esp+4获得第一个SE Handle

0012FFBC 0012FFE0 Pointer to next SEH record
0012FFC0 0050C034 SE handler ;******SE handle 50C034*****
0012FFC4 7C816D4F RETURN to kernel32.7C816D4F
0012FFC8 7C930738 ntdll.7C930738
0012FFCC FFFFFFFF
0012FFD0 7FFD9000
0012FFD4 8054C038


Ctrl+G,50C034

0050C034 B8 DEAE50F0 MOV EAX,F050AEDE ;***来到这里***
0050C039 8D88 79110010 LEA ECX,DWORD PTR DS:[EAX+10001179]
0050C03F 8941 01 MOV DWORD PTR DS:[ECX+1],EAX
0050C042 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
0050C046 8B52 0C MOV EDX,DWORD PTR DS:[EDX+C]
0050C049 C602 E9 MOV BYTE PTR DS:[EDX],0E9
0050C04C 83C2 05 ADD EDX,5
0050C04F 2BCA SUB ECX,EDX
0050C051 894A FC MOV DWORD PTR DS:[EDX-4],ECX
0050C054 33C0 XOR EAX,EAX
0050C056 C3 RETN
0050C057 B8 78563412 MOV EAX,12345678
0050C05C 64:8F05 00000000 POP DWORD PTR FS:[0]
0050C063 83C4 04 ADD ESP,4
0050C066 55 PUSH EBP
0050C067 53 PUSH EBX
0050C068 51 PUSH ECX
0050C069 57 PUSH EDI
0050C06A 56 PUSH ESI
0050C06B 52 PUSH EDX
0050C06C 8D98 32110010 LEA EBX,DWORD PTR DS:[EAX+10001132]
0050C072 8B53 18 MOV EDX,DWORD PTR DS:[EBX+18]
0050C075 52 PUSH EDX
0050C076 8BE8 MOV EBP,EAX
0050C078 6A 40 PUSH 40
0050C07A 68 00100000 PUSH 1000
0050C07F FF73 04 PUSH DWORD PTR DS:[EBX+4]
0050C082 6A 00 PUSH 0
0050C084 8B4B 10 MOV ECX,DWORD PTR DS:[EBX+10]
0050C087 03CA ADD ECX,EDX
0050C089 8B01 MOV EAX,DWORD PTR DS:[ECX]
0050C08B FFD0 CALL EAX
0050C08D 5A POP EDX
0050C08E 8BF8 MOV EDI,EAX
0050C090 50 PUSH EAX
0050C091 52 PUSH EDX
0050C092 8B33 MOV ESI,DWORD PTR DS:[EBX]
0050C094 8B43 20 MOV EAX,DWORD PTR DS:[EBX+20]
0050C097 03C2 ADD EAX,EDX
0050C099 8B08 MOV ECX,DWORD PTR DS:[EAX]
0050C09B 894B 20 MOV DWORD PTR DS:[EBX+20],ECX
0050C09E 8B43 1C MOV EAX,DWORD PTR DS:[EBX+1C]
0050C0A1 03C2 ADD EAX,EDX
0050C0A3 8B08 MOV ECX,DWORD PTR DS:[EAX]
0050C0A5 894B 1C MOV DWORD PTR DS:[EBX+1C],ECX
0050C0A8 03F2 ADD ESI,EDX
0050C0AA 8B4B 0C MOV ECX,DWORD PTR DS:[EBX+C]
0050C0AD 03CA ADD ECX,EDX
0050C0AF 8D43 1C LEA EAX,DWORD PTR DS:[EBX+1C]
0050C0B2 50 PUSH EAX
0050C0B3 57 PUSH EDI
0050C0B4 56 PUSH ESI
0050C0B5 FFD1 CALL ECX
0050C0B7 5A POP EDX
0050C0B8 58 POP EAX
0050C0B9 0343 08 ADD EAX,DWORD PTR DS:[EBX+8]
0050C0BC 8BF8 MOV EDI,EAX
0050C0BE 52 PUSH EDX
0050C0BF 8BF0 MOV ESI,EAX
0050C0C1 8B46 FC MOV EAX,DWORD PTR DS:[ESI-4]
0050C0C4 83C0 04 ADD EAX,4
0050C0C7 2BF0 SUB ESI,EAX
0050C0C9 8956 08 MOV DWORD PTR DS:[ESI+8],EDX
0050C0CC 8B4B 10 MOV ECX,DWORD PTR DS:[EBX+10]
0050C0CF 894E 24 MOV DWORD PTR DS:[ESI+24],ECX
0050C0D2 8B4B 14 MOV ECX,DWORD PTR DS:[EBX+14]
0050C0D5 51 PUSH ECX
0050C0D6 894E 28 MOV DWORD PTR DS:[ESI+28],ECX
0050C0D9 8B4B 0C MOV ECX,DWORD PTR DS:[EBX+C]
0050C0DC 894E 14 MOV DWORD PTR DS:[ESI+14],ECX
0050C0DF FFD7 CALL EDI
0050C0E1 8985 23120010 MOV DWORD PTR SS:[EBP+10001223],EAX
0050C0E7 8BF0 MOV ESI,EAX
0050C0E9 59 POP ECX
0050C0EA 5A POP EDX
0050C0EB 03CA ADD ECX,EDX
0050C0ED 68 00800000 PUSH 8000
0050C0F2 6A 00 PUSH 0
0050C0F4 57 PUSH EDI
0050C0F5 FF11 CALL DWORD PTR DS:[ECX]
0050C0F7 8BC6 MOV EAX,ESI
0050C0F9 5A POP EDX
0050C0FA 5E POP ESI
0050C0FB 5F POP EDI
0050C0FC 59 POP ECX
0050C0FD 5B POP EBX
0050C0FE 5D POP EBP
0050C0FF FFE0 JMP EAX ;*****JMP EAX*****
0050C101 0000 ADD BYTE PTR DS:[EAX],AL
0050C103 0000 ADD BYTE PTR DS:[EAX],AL




向下找jmp eax,大概在$+CB处,记住此地址50c0ff

用ollydbg重新载入,下硬件执行断点: he 50c0ff,F9,Shift+F9,中断
F8,来到487228处

00487228 55 PUSH EBP *****OEP******
00487229 8BEC MOV EBP,ESP
0048722B B9 35000000 MOV ECX,35
00487230 6A 00 PUSH 0
00487232 6A 00 PUSH 0
00487234 49 DEC ECX
00487235 ^75 F9 JNZ SHORT GameThru.00487230
00487237 51 PUSH ECX
00487238 53 PUSH EBX
00487239 56 PUSH ESI
0048723A 57 PUSH EDI
0048723B B8 706E4800 MOV EAX,GameThru.00486E70
00487240 E8 97EDF7FF CALL GameThru.00405FDC
00487245 33C0 XOR EAX,EAX



dump,imprec fix iat,完工.

  别看写了这么多,真正做起来就几步,实际上有经验的话,几个F8,然后shift+F8,跟踪几下就到了.

[课程]Linux pwn 探索篇!

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 11948
活跃值: (3725)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习!学习!
谢谢!
2005-2-16 16:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
多谢!学习中,,,,
2005-2-16 17:19
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
4
嗯  鼓励一下
2005-2-16 18:06
0
雪    币: 93908
活跃值: (200199)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持...
2005-2-16 20:13
0
雪    币: 154
活跃值: (216)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
还有厉害的方法?支持
2005-2-16 20:42
0
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
多谢!学习中
2005-2-16 21:35
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习中^^^^^
2005-2-16 21:51
0
雪    币: 272
活跃值: (465)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
9
多谢!刚碰到一个这样壳的软件,回去试试先!
2005-2-18 10:52
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
学习!学习!
谢谢!
2005-2-20 17:50
0
雪    币: 405
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
非常感谢,小弟遇到一个程序,用PEID自带通用脱壳插件脱不了,看你这篇教程后一次搞定
2005-3-1 10:51
0
雪    币: 1
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
12
言简意赅,欣赏这种方式.
2005-3-1 12:54
0
雪    币: 192
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
  路有千万条,看走哪条最近
俺喜欢这种方式
2005-3-1 13:44
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
14
$+CB是什么意思?
$和CB分别代表什么啊??
2005-3-6 01:05
0
雪    币: 255
活跃值: (207)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
15

$+CB是什么意思?
$和CB分别代表什么啊??

$表示当前地址,$+CB表示当前地址向后偏移+CB个字节。
2005-3-6 12:01
0
雪    币: 228
活跃值: (130)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
我脱的时候,直接找那个异常下面的一处跳转下硬件执行中断。然后f9会直接断下来,往上看就是oep了,加了壳后的入口和原来的入口是一样的。不知这个方法有没有通用性。
2005-3-24 21:24
0
雪    币: 225
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我手脱了几个好像均不要修复。
2005-3-25 11:11
0
雪    币: 320
活跃值: (104)
能力值: (RANK:180 )
在线值:
发帖
回帖
粉丝
18
最初由 peaceclub 发布
今天还有朋友在问PeCompact2.x的脱壳方法,我再这里把我的通用脱法提一下(在看其它高手们文章的基础上总结的,在此表示感谢).
[法则]:
PeCompact2.x是制造了两个异常(00000000内存写异常和Single Step单步循环异常),我们可以轻松通过查看SEH链来进行脱壳

下面我说一下通用简单脱壳法:
........


请教后面这句

用ollydbg重新载入,下硬件执行断点: he 50c0ff,F9,Shift+F9,中断
F8,来到487228处

里面的 he 是什么意思 是goto到50c0ff 然后在50c0ff下断点吗

THX
2005-4-27 22:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习!学习!
谢谢!
2005-4-29 00:10
0
游客
登录 | 注册 方可回帖
返回
//