【文章标题】: 手脱未知壳
【文章作者】: lovebird/爱鸟
【作者邮箱】: lovebird_ustc#126.com
【作者QQ号】: 1282260064
【软件名称】: 记事本
【软件大小】: 脱壳前39.6KB 脱壳后120KB
【下载地址】: 附件中
【加壳方式】: 未知壳
【保护方式】: 未知壳加壳
【编写语言】: VC++
【使用工具】: OD dump插件 LORDPE Irec
【操作平台】: XPsp3+VM6.0
【软件介绍】: 未知壳加壳的XP记事本
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
还是上次淘来的那堆记事本。Peid一扫,Nothing found *,换成Hardcore,还是一样,不管了。
OD不躲不藏,忽略一切异常,尤其注意忽略
int 3异常。
0101339E > 55
PUSH EBP
0101339F 89E5
MOV EBP,
ESP
010133A1 6A FF
PUSH -1
010133A3 53
PUSH EBX
010133A4 56
PUSH ESI
010133A5 57
PUSH EDI
010133A6 58
POP EAX
010133A7 58
POP EAX
010133A8 5B
POP EBX
010133A9 58
POP EAX
010133AA 5D
POP EBP
010133AB 60
PUSHAD
010133AC E8 1DFEFFFF
CALL 19.010131CE
; 第一次F8跑飞 遂F7跟入
010133B1 C3
RETN
注意010133AC的那个
call,貌似
esp定律不能用,因为跟进去后,使用
int 3断点进入的OEP。这个
call第一次
跟的时候F8,程序跑飞。前面的那堆花指令直接无视,这个壳花指令主要是靠
push和
pop对。直接F7进去。
010131CE 55
PUSH EBP ; F7过来 停在这儿
010131CF 8BEC
MOV EBP,
ESP
010131D1 83C4 D4
ADD ESP,-2C
010131D4 53
PUSH EBX
010131D5 56
PUSH ESI
010131D6 57
PUSH EDI
010131D7 8B45 10
MOV EAX,
DWORD PTR SS:[
EBP+10]
010131DA 83C0 0C
ADD EAX,0C
010131DD 8B00
MOV EAX,
DWORD PTR DS:[
EAX]
010131DF 8945 E4
MOV DWORD PTR SS:[
EBP-1C],
EAX
010131E2 837D E4 00
CMP DWORD PTR SS:[
EBP-1C],0
010131E6 75 08
JNZ SHORT 19.010131F0
010131E8 E8 ADFFFFFF
CALL 19.0101319A
010131ED 8945 E4
MOV DWORD PTR SS:[
EBP-1C],
EAX
010131F0 E8 C1FEFFFF
CALL 19.010130B6
010131F5 8B10
MOV EDX,
DWORD PTR DS:[
EAX]
010131F7 0355 E4
ADD EDX,
DWORD PTR SS:[
EBP-1C]
010131FA 8955 DC
MOV DWORD PTR SS:[
EBP-24],
EDX
没什么问题,直接F8跟下去。注意下面两个循环,F4的位置给出来了:
0101326A 4E
DEC ESI
0101326B ^ 75
DD JNZ SHORT 19.0101324A
0101326D 6A 04
PUSH 4
; F4
0101326F 68 00100000
PUSH 1000
01013274 8B45 DC
MOV EAX,
DWORD PTR SS:[
EBP-24]
01013277 8B40 0C
MOV EAX,
DWORD PTR DS:[
EAX+C]
=============================================================================
0101330D ^\75 C4
JNZ SHORT 19.010132D3
0101330F 8BF3
MOV ESI,
EBX
01013311 833E 00
CMP DWORD PTR DS:[
ESI],0
01013314 ^ 75 88
JNZ SHORT 19.0101329E
01013316 8B45 DC
MOV EAX,
DWORD PTR SS:[
EBP-24]
; 此处F4 稍稍延迟
01013319 8B40 10
MOV EAX,
DWORD PTR DS:[
EAX+10]
; 将OEP传入
0101331C 0345 E4
ADD EAX,
DWORD PTR SS:[
EBP-1C]
0101331F 8B55 14
MOV EDX,
DWORD PTR SS:[
EBP+14]
01013322 83C2 20
ADD EDX,20
; 注意EAX乃是OEP
01013325 8902
MOV DWORD PTR DS:[
EDX],
EAX ; 存入[edx]
在0101331C时候,看一眼寄存器表:
EAX 0000739D //此乃OEP的偏移
ECX 7C937719 ntdll.7C937719
EDX 7C99E178 ntdll.7C99E178
EBX 002F0B71
ESP 0006FF64
EBP 0006FF9C
ESI 002F0B71
EDI 010012B0 19.010012B0
EIP 0101331C 19.0101331C
继续F8一下,此时的寄存器表:
EAX 0100739D 19.0100739D //这个就是OEP 记下来
ECX 7C937719 ntdll.7C937719
EDX 7C99E178 ntdll.7C99E178
EBX 002F0B71
ESP 0006FF64
EBP 0006FF9C
ESI 002F0B71
EDI 010012B0 19.010012B0
EIP 0101331F 19.0101331F
现在已经找到OEP了,下一步就是找适当的dump时机:
继续F8:
01013327 68 00800000
PUSH 8000
0101332C 6A 00
PUSH 0
0101332E 8B45 D4
MOV EAX,
DWORD PTR SS:[
EBP-2C]
01013331 50
PUSH EAX
01013332 FF55 EC
CALL DWORD PTR SS:[
EBP-14]
; kernel32.VirtualFree
01013335 8B55 E4
MOV EDX,
DWORD PTR SS:[
EBP-1C]
01013338 8B42 3C
MOV EAX,
DWORD PTR DS:[
EDX+3C]
0101333B 0345 E4
ADD EAX,
DWORD PTR SS:[
EBP-1C]
0101333E 83C0 04
ADD EAX,4
01013341 8BD8
MOV EBX,
EAX
01013343 83C3 14
ADD EBX,14
01013346 8D45 E0
LEA EAX,
DWORD PTR SS:[
EBP-20]
01013349 50
PUSH EAX
0101334A 6A 40
PUSH 40
0101334C 68 00100000
PUSH 1000
01013351 52
PUSH EDX
其实看到那个
push 8000 估计是VirtualFree,继续走下去,到了这儿:
0101338E 8950 04
MOV DWORD PTR DS:[
EAX+4],
EDX
01013391 CC INT3
; 此处有int3 不必再跟进去
01013392 5F
POP EDI
01013393 5E
POP ESI
01013394 5B
POP EBX
01013395 8BE5
MOV ESP,
EBP
01013397 5D
POP EBP
01013398 C2 2000
RETN 20
在01013391那个
int 3,目的是陷入系统内核,然后运行程序,不需要再跟了。
现在我们下断点he 010739D
Shift+F9运行:
来到这儿:
0100739D 6A
DB 6A
; CHAR 'j'
0100739E 70
DB 70
; CHAR 'p'
0100739F 68
DB 68
; CHAR 'h'
010073A0 98
DB 98
010073A1 18
DB 18
010073A2 00
DB 00
010073A3 01
DB 01
010073A4 E8
DB E8
010073A5 BF
DB BF
010073A6 01
DB 01
010073A7 00
DB 00
010073A8 00
DB 00
010073A9 33
DB 33
; CHAR '3'
010073AA
DB DB DB
010073AB 53
DB 53
; CHAR 'S'
010073AC 8B
DB 8B
010073AD 3D
DB 3D
; CHAR '='
Ctrl+A:
0100739D . 6A 70
PUSH 70
0100739F . 68 98180001
PUSH 19.01001898
010073A4 . E8 BF010000
CALL 19.01007568
010073A9 . 33DB
XOR EBX,
EBX
010073AB . 53
PUSH EBX ; /pModule => NULL
010073AC . 8B3D CC100001
MOV EDI,
DWORD PTR DS:[10010CC]
; |kernel32.GetModuleHandleA
010073B2 . FFD7
CALL EDI ; \GetModuleHandleA
010073B4 . 66:8138 4D5A
CMP WORD PTR DS:[
EAX],5A4D
010073B9 . 75 1F
JNZ SHORT 19.010073DA
010073BB . 8B48 3C
MOV ECX,
DWORD PTR DS:[
EAX+3C]
010073BE . 03C8
ADD ECX,
EAX
010073C0 . 8139 50450000
CMP DWORD PTR DS:[
ECX],4550
010073C6 . 75 12
JNZ SHORT 19.010073DA
010073C8 . 0FB741 18
MOVZX EAX,
WORD PTR DS:[
ECX+18]
010073CC . 3D 0B010000
CMP EAX,10B
010073D1 . 74 1F
JE SHORT 19.010073F2
010073D3 . 3D 0B020000
CMP EAX,20B
此时dump可以两种方法
①运用OD的dump插件,选择方式一,直接dump就能运行
②LordPE,但是注意设置“从文件获得PE文件头”勾除,然后dump,不能运行。Irec修复,则可以运行。
小软件推荐第一种,大软件推荐第二种。
--------------------------------------------------------------------------------
【经验总结】
秒脱方法:
bp VirtualFree 然后Shift+F9 断下后F2取消断点
he [
edx] ,shift+F9 到达OEp 照本文方法dump即可
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2010年01月17日 2:14:47
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课