PE-SHiELD V0.25简介
PE-SHiELD is a program, which encrypts 32-bit Windows EXE files, leaving them still executable. The previous version was over a year in the wild and there is still no unpacker for it.
下载地址:
本地下载
软件截图.
我们直接在Dos界面下运行PESHIELD.exe,软件提示语法和参数,通常选默认值就可以了。
我们将Win98的记事本拷到Pepack目录同一层,然后在Dos界面输入
PESHIELD nottepad.exe
回车后记事本就加了一层壳,呵呵,连图标都压没了。和pepack界面一样,但强度高得多。有花指令,检查调试器含od,反模拟跟踪,SEH干扰调试语句等。
首先必须的工具要准备好
脱壳目标,PESHIELD0.25加壳的记事本。
本地下载
安装软件后用Peid测NOTEPAD.EXE的壳为PESHiELD 0.25 -> ANAKiN
手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。
我们把Od中的选项-调试选项-异常选项卡中
手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。
除了忽略在KERNEL32 中的内存访问异常打勾,其余一个勾都不打,请检查自己的Od设置。
用OD载入程序后。
确定一个入口警告,Od提示程序加壳,选不继续分析。
0040D000 > 60 PUSHAD 停在这里。
0040D001 E8 2B000000 CALL NOTEPAD.0040D031
0040D006 0D 0A0D0A0D OR EAX,0D0A0D0A
0040D00B 0A52 65 OR DL,BYTE PTR DS:[EDX+65]
0040D00E 67:6973 74 6572>IMUL ESI,DWORD PTR SS:[BP+DI+74],6465726>
0040D016 20746F 3A AND BYTE PTR DS:[EDI+EBP*2+3A],DH
0040D01A 204E 4F AND BYTE PTR DS:[ESI+4F],CL
0040D01D 4E DEC ESI
...............................................................
先F9运行看看。
程序异常,是加密壳,有SEH陷阱语句。
0040D113 F3: PREFIX REP: ; 多余的前缀
0040D114 23BE FFAA9F21 AND EDI,DWORD PTR DS:[ESI+219FAAFF]
0040D11A 1F POP DS ; 修正的段位寄存器
0040D11B 0D B7FBC989 OR EAX,89C9FBB7
0040D120 4C DEC ESP
0040D121 05 4A17516D ADD EAX,6D51174A
0040D126 D4 1A AAM 1A
0040D128 1F POP DS ; 修正的段位寄存器
Shift+F9想忽略异常,但Od提示被调试的程序无法处理异常,然后退出。这是程序检查到Od在调试,立即执行退出代码。
Ctrl+F2重来,用插件隐藏Od,见截图。
F9运行,
异常1,
0040D232 8DC0 LEA EAX,EAX ; 非法使用寄存器
0040D234 CD 20 INT 20
用Shift+F9忽略异常继续运行。
异常2.
0040D4D7 8DC0 LEA EAX,EAX ; 非法使用寄存器
0040D4D9 CD 20 INT 20
0040D4DB 64:8F03 POP DWORD PTR FS:[EBX]
再用Shift+F9程序运行。
Ctrl+F2重来,用插件隐藏Od.
通过前面的SEH经验看堆栈。
0012FF9C 0012FFE0 指针到下一个 SEH 记录
0012FFA0 0040D4AC SE 句柄
40D4AC是异常处理完毕出口。
我们Ctrl+G ,输入 40D4AC ,回车
0040D4AC 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C] 到这里下断点,F9运行断在这里后取消断点
0040D4B0 8380 B8000000 0>ADD DWORD PTR DS:[EAX+B8],4 注意这里的堆栈值40D4D7+4=40D4DB
学自jeffzhang的未知加密壳脱文。
0040D4B7 53 PUSH EBX
0040D4B8 33DB XOR EBX,EBX
0040D4BA 8958 04 MOV DWORD PTR DS:[EAX+4],EBX
0040D4BD 8958 08 MOV DWORD PTR DS:[EAX+8],EBX
0040D4C0 C740 18 5501000>MOV DWORD PTR DS:[EAX+18],155
0040D4C7 8958 0C MOV DWORD PTR DS:[EAX+C],EBX
0040D4CA 8958 10 MOV DWORD PTR DS:[EAX+10],EBX
0040D4CD 5B POP EBX
0040D4CE 33C0 XOR EAX,EAX //表示已修复,可以从异常处继续执行
0040D4D0 C3 RETN 如果你执行这里的返回语句,将迷失在系统领空。
0040D4D1 64:FF33 PUSH DWORD PTR FS:[EBX]
0040D4D4 64:8923 MOV DWORD PTR FS:[EBX],ESP
0040D4D7 8DC0 LEA EAX,EAX ; 非法使用寄存器
0040D4D9 CD 20 INT 20
0040D4DB 64:8F03 POP DWORD PTR FS:[EBX] 在这里下断点吧。顺利到达后取消断点。
0040D4DE 8BE0 MOV ESP,EAX
0040D4E0 8B85 A7120000 MOV EAX,DWORD PTR SS:[EBP+12A7] 无特别提示,一律F8过。
0040D4E6 EB 03 JMP SHORT NOTEPAD.0040D4EB
0040D4EB 0340 3C ADD EAX,DWORD PTR DS:[EAX+3C]
0040D4EE EB 01 JMP SHORT NOTEPAD.0040D4F1
0040D4F1 8BC8 MOV ECX,EAX ; NOTEPAD.00400080
0040D4F3 EB 02 JMP SHORT NOTEPAD.0040D4F7
...............................................................
0040D643 EB 01 JMP SHORT NOTEPAD.0040D646
0040D646 8D85 3A110000 LEA EAX,DWORD PTR SS:[EBP+113A]
0040D64C EB 02 JMP SHORT NOTEPAD.0040D650
0040D650 50 PUSH EAX ; NOTEPAD.0040E13A
0040D651 EB 01 JMP SHORT NOTEPAD.0040D654
0040D654 8B85 6B120000 MOV EAX,DWORD PTR SS:[EBP+126B] ;kernel32.CreateFileA
0040D65A EB 01 JMP SHORT NOTEPAD.0040D65D
...............................................................
0040D6A0 E8 110B0000 CALL NOTEPAD.0040E1B6
0040D6A5 EB 01 JMP SHORT NOTEPAD.0040D6A8
0040D6A8 89AD 1F080000 MOV DWORD PTR SS:[EBP+81F],EBP ; NOTEPAD.
0040D6AE EB 01 JMP SHORT NOTEPAD.0040D6B1
0040D6B1 8D95 87110000 LEA EDX,DWORD PTR SS:[EBP+1187]
0040D6B7 EB 01 JMP SHORT NOTEPAD.0040D6BA
0040D6BA 8D8D 1E080000 LEA ECX,DWORD PTR SS:[EBP+81E]
0040D6C0 EB 01 JMP SHORT NOTEPAD.0040D6C3
0040D6C3 52 PUSH EDX ; NOTEPAD.0040E187
0040D6C4 EB 01 JMP SHORT NOTEPAD.0040D6C7
0040D6C7 6A 00 PUSH 0
0040D6C9 EB 01 JMP SHORT NOTEPAD.0040D6CC 省去的代码有些是检查调试器。
0040D6CC 83C2 04 ADD EDX,4
0040D6CF EB 01 JMP SHORT NOTEPAD.0040D6D2
...............................................................
0040D6E1 EB 01 JMP SHORT NOTEPAD.0040D6E4
0040D6E4 8B85 6C110000 MOV EAX,DWORD PTR SS:[EBP+116C] ;kernel32.CreateThread
0040D6EA EB 01 JMP SHORT NOTEPAD.0040D6ED
0040D6ED E8 C9060000 CALL NOTEPAD.0040DDBB
0040D6F2 EB 01 JMP SHORT NOTEPAD.0040D6F5 慢,小心了。
0040D6F5 FFB5 7F110000 PUSH DWORD PTR SS:[EBP+117F] ;kernel32.ExitThread
0040D6FB FF85 83110000 INC DWORD PTR SS:[EBP+1183]
0040D701 C3 RETN 这里会返回系统领空,我进去怎么也出不来。
怎么办,进系统领空后,不久程序就运行,跟踪失败。呵,山人自有妙计。我不知道下面哪个语句是从系统领空出来后继续执行的,从40d702开始,到 0040D8A7 这里我全部下断点,F9运行看你中不中断。用F2和向下键下断点,很辛苦,比跟进系统领空要强一点。这个系统领空里面再次检查断点,调试器,模拟跟踪,等。过后就经过无数循环,到Oep处,我经过调试过,大家最好体验一下。