【文章标题】: 手脱加花未知壳
【文章作者】: lovebird/爱鸟
【作者邮箱】: lovebird_ustc#126.com
【作者QQ号】: 1282260064
【软件名称】: 加花壳后的记事本
【软件大小】: 脱前62.5KB 脱后84KB
【下载地址】: 附件中
【加壳方式】: 未知壳
【保护方式】: 修改壳加壳
【编写语言】: VC++
【使用工具】: PEtools OD IREC
【操作平台】: XPsp3+vw6
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
还是上次从BST淘的那堆加壳笔记本 这次貌似情况麻烦点。
Peid一扫,Nothing found *,换成Hardcore,是C.I Crypt V0.1 -> FearlesS。
不管它,直接进去,OD不躲不藏,忽略一切异常。
1.跟踪到了OEP
004015DF > 85FF
TEST EDI,
EDI ; 停在这儿 一堆花指令
004015E1 56
PUSH ESI
004015E2 81C3 00000000
ADD EBX,0
004015E8 5E
POP ESI
004015E9 2C 00
SUB AL,0
004015EB C0C3 40
ROL BL,40
; 移位常量超出 1..31 的范围
004015EE C0CA 38
ROR DL,38
; 移位常量超出 1..31 的范围
004015F1 35 00000000
XOR EAX,0
004015F6 F9
STC
004015F7 F8
CLC
004015F8 FC
CLD
004015F9 90
NOP
004015FA 68 20010000
PUSH 120
004015FF 5D
POP EBP
00401600 0BDB
OR EBX,
EBX
00401602 68 3BFAFFFF
PUSH -5C5
00401607 5B
POP EBX
00401608 90
NOP
00401609 56
PUSH ESI
0040160A 79 04
JNS SHORT 16.00401610
0040160C 66:83EF 00
SUB DI,0
00401610 5E
POP ESI
00401611 C1F8 E0
SAR EAX,0E0
; 移位常量超出 1..31 的范围
搂一眼代码,瞎了我的狗眼,一堆花指令。然后就是准备开始漫长的F8....
不久,我们来到这儿:
00401622 81FD 3BC9A79B
CMP EBP,9BA7C93B
00401628 F9
STC
00401629 EB 05
JMP SHORT 16.00401630
0040162B E9 27000000
JMP 16.00401657
; 来回跳的花指令
00401630 E8 F6FFFFFF
CALL 16.0040162B
; 此call必须F7 否则.......程序飞掉
00401635 55
PUSH EBP
00401636 E8 1A000000
CALL 16.00401655
0040163B B7 05
MOV BH,5
0040163D DC5D 63
FCOMP QWORD PTR SS:[
EBP+63]
00401640 2D CAB62F2C
SUB EAX,2C2FB6CA
00401645 1B87 FBD36220
SBB EAX,
DWORD PTR DS:[
EDI+2062D3FB]
0040164B EA 1F4F82E6 D23>
JMP FAR 36D2:E6824F1F
; 远跳转
第一次F8到00401630,结果出现:
---------------------------
错误
---------------------------
32 位可执行文件 'C:\Documents
and Settings\MyVNN\桌面\tanghulu\Files\Files\16.EXE' 的格式错误或格式未知
---------------------------
确定
---------------------------
点了确定之后,程序跑飞。
只好Ctrl+F2重新来过。
一路上不敢用F8,用了就死....一路F7到了这里:
73FBE1F3 8BEC
MOV EBP,
ESP
73FBE1F5 81EC 98000000
SUB ESP,98
73FBE1FB A1 ECF1FE73
MOV EAX,
DWORD PTR DS:[73FEF1EC]
73FBE200 53
PUSH EBX
73FBE201 68 4018FA73
PUSH 73FA1840
; ASCII "gdi32.dll"
73FBE206 8945 FC
MOV DWORD PTR SS:[
EBP-4],
EAX ; 就是下面的call出现了“格式错误或格式未知”
73FBE209 FF15 4811FA73
CALL DWORD PTR DS:[73FA1148]
; kernel32.LoadLibraryA
73FBE20F 33DB
XOR EBX,
EBX
73FBE211 3BC3
CMP EAX,
EBX
73FBE213 A3 2002FF73
MOV DWORD PTR DS:[73FF0220],
EAX
73FBE218 75 07
JNZ SHORT 73FBE221
既然是LoadLibraryA导致的问题,我们再次Ctrl+F2(这需要运气和勇气......)
重新来过后,下断点
bp LoadLibraryA
然后Shift+F9四次,弹出那个
"格式错误或格式未知"的窗口。点“确定”,继续Shift+F9两次(我们一共进行了6次)
搂一眼堆栈:
0012FF9C 01013208 /
CALL 到 LoadLibraryA 来自 16_1.01013206
0012FFA0 01007B3A \FileName =
"WINSPOOL.DRV"
0012FFA4 7C930228 ntdll.7C930228
0012FFA8 0012FFD4
0012FFAC 00000000
0012FFB0 0012FFC4
0012FFB4 004014F0
0012FFB8 00000000
0012FFBC 01000000 16_1.01000000
0012FFC0 010130FF 16_1.010130FF
0012FFC4 7C817077 返回到 kernel32.7C817077
0012FFC8 01000000 16_1.01000000
0012FFCC FFFFFFFF
0012FFD0 7FFDE000
0012FFD4 80545BFD
0012FFD8 0012FFC8
0012FFDC 81A1EDA8
0012FFE0 FFFFFFFF SEH 链尾部
0012FFE4 7C839AD8 SE处理程序
0012FFE8 7C817080 kernel32.7C817080
看样子 是要跳回去了。但是同时我发现一个大问题:此时居然代码跳到01007B3A的空间,而不是我们刚刚加载时候的
0040XXXX空间,这种情况,有可能是重新创建进程(可参考我的Minke壳手脱),有可能是代码重定位(我是菜鸟,欢迎
牛人们补充)。不管它。F2消去断点,Alt+F9返回
01013208 8905 CE300101
MOV DWORD PTR DS:[10130CE],
EAX ; 返回到了这儿
0101320E C705 D2300101 0>
MOV DWORD PTR DS:[10130D2],0
01013218 BA 00000001
MOV EDX,16_1.01000000
0101321D 8B06
MOV EAX,
DWORD PTR DS:[
ESI]
0101321F 85C0
TEST EAX,
EAX
01013221 75 03
JNZ SHORT 16_1.01013226
01013223 8B46 10
MOV EAX,
DWORD PTR DS:[
ESI+10]
01013226 01D0
ADD EAX,
EDX
01013228 0305 D2300101
ADD EAX,
DWORD PTR DS:[10130D2]
0101322E 8B18
MOV EBX,
DWORD PTR DS:[
EAX]
01013230 8B7E 10
MOV EDI,
DWORD PTR DS:[
ESI+10]
01013233 01D7
ADD EDI,
EDX
01013235 033D D2300101
ADD EDI,
DWORD PTR DS:[10130D2]
0101323B 85DB
TEST EBX,
EBX
0101323D 74 2B
JE SHORT 16_1.0101326A
0101323F F7C3 00000080
TEST EBX,80000000
01013245 75 04
JNZ SHORT 16_1.0101324B
01013247 01D3
ADD EBX,
EDX
01013249 43
INC EBX
0101324A 43
INC EBX
0101324B 81E3 FFFFFF0F
AND EBX,0FFFFFFF
目之所及 仍然是铺天盖地的花指令,但是现在我们已经不怕
"格式错误或格式未知"窗口了,于是F8继续跟:
有两个大循环 均已经指出F4的位置
01013261 8305 D2300101 0>
ADD DWORD PTR DS:[10130D2],4
01013268 ^ EB AE
JMP SHORT 16_1.01013218
0101326A 83C6 14
ADD ESI,14
; F4
0101326D BA 00000001
MOV EDX,16_1.01000000
01013272 ^ E9 6EFFFFFF
JMP 16_1.010131E5
01013277 68 54300101
PUSH 16_1.01013054
; F4
0101327C B8 48300101
MOV EAX,16_1.01013048
01013281 FF10
CALL DWORD PTR DS:[
EAX]
01013283 68 BF300101
PUSH 16_1.010130BF
; ASCII "GlobalFree"
接着F8:
01013290 8B15 CA300101
MOV EDX,
DWORD PTR DS:[10130CA]
01013296 52
PUSH EDX
01013297 FFD0
CALL EAX
01013299 61
POPAD
0101329A BA 9D730001
MOV EDX,16_1.0100739D
0101329F FFE2
JMP EDX
此处就能跳到OEP了,fly的话叫“飞向光明之巅 ”“胜利女神”。
2.dump的操作
注意不能用LordPE来Dump ,只能用PEtools。
3.修复
ImportREC V1.7F中点“选项” 找到“运行中程序信息”,把“使用来自磁盘的pe头”勾除。OEP处填上739D,然后
你会的。
--------------------------------------------------------------------------------
【经验总结】
秒脱方法是:
载入程序
bp LoadLibraryA Shift+F9 4次 点掉那个
"格式错误或格式未知"窗口,
再Shift+F9 2次,取消一切断点。Alt+F9返回,Ctrl+F搜索
JMP EDX,下断再Shift+F9运行就能到OEP
dump和修复注意见脱文
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2010年01月15日 4:05:59
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课