手动脱壳进阶第三篇PEncrypt V4.0

手动脱壳进阶第三篇PEncrypt V4.0

PEncrypt简介:
Multi Layer Encryptor for the Decryptor. SoftICE, ICEDump Detection code. Crashes the OS in case it is found in memory. Anti ICEDump's /TRACEX command. Win9x compatible. Includes anti-debugging, anti-tracing routines
软件后用Fi测NOTEPAD.EXE的壳为PEncrypt 4.0 Gamma / 4.0 Phi -> junkcode [重叠]
如何分辨加密壳和压缩壳,通用特点,Od载入时有入口警告或询问是压缩程序吗?普通压缩壳Od调试时候没有异常,加密壳全部有反跟踪代码,会有许多SEH陷阱使OD调试时产生异常。
找OEP的一般思路如下:
先看壳是加密壳还是压缩壳,压缩壳相对来说容易些,一般是没有异常。
外壳解压代码起始点如果是

pushfd
pushad

跟踪时如果有发现

popad
popfd

对应
有些壳只有

pushad



popad

相对应
附近还有

retn
jmp

等指令,发生跨断跳跃一般就到了OEP处。
当然也有其他的,如 je OEP等等,一般都是段之间的大跳转,OD的反汇编窗口里都是同一个段的内容,所以更好区别是否是段间跳转。

找Oep时注意两点。
1、单步往前走,不要回头。
2、观察。注意poshad、poshfd,popad、popfd等,和外壳代码处对应,注意地址发生大的变化。单步跟踪什 么时候F8走,F7,F4步过?

这里我说说关于F8(Step Over)和F7(Step in)的一般方法,粗跟的时候一般都是常用F8走,但是有些call是变形的Jmp,此时就需要F7代过,区别是否是变形Jmp的一个简单方法是比较call的目标地址和当前地址,如果两者离的很近,一般就是变形Jmp了,用F7走。对于Call的距离很远,可以放心用F8步过,如果你再用F7步过,只是浪费时间而已。F8步过对压缩壳用的很多,F7步过加密壳用的很多,如果用F8一不小心就跑飞(程序运行),跟踪失败。

加密壳找Oep
对于加密壳,我的方法一般是用OD载入,钩掉所有异常(不忽略任何异常,除了忽略在KERNEL32 中的内存访问异常打勾。有时由于异常过多可以适当忽略一些异常),运行,数着用了多少次Shift+F9程序运行,显然最后一次异常后,程序会从壳跳到OEP开始执行,这就是我们寻找OEP的一个关键,如果程序 Shift+F9后直接退出,很明显加密壳检测调试器,最简单的应付方法就是用OD插件隐藏OD。
单步异常是防止我们一步步跟踪程序,即F8,F7,F4等,Int3中断是检测调试器用的,仅在Win9x系统中有效,2000/XP就会出现断点异常,其它的异常主要是干扰调试。这一系列的异常虽然干扰我们调试,但也给我们指明了一条通路,就是Shift+F9略过所有异常,然后找到最后一处异常,再它的恢复异常处下断点,跟踪到脱壳入口点。
确定从所有Seh异常中走出来,如果前面有大量循环,逐段解压。

当然你也可以用另一个好东西——Trace,在Command里来个tc eip<42b000 (42b000是当前段的起始位置,滚动条拖到最上面就能看到了,一般程序编译的基地址为400000),42b000只是例子,如果你的下模拟跟踪时机很准,确定没有Seh异常,稍等一会我们就会停在OEP处(对特别加密壳需要大量时间跟踪,因为它的循环极多,但比手动跟踪快,大部分时候是的。)详细跟踪情况可以点运行跟踪看OD跟踪记录。

我们来实际体会一下。
我们把Od中的选项-调试选项-异常选项卡中
除了忽略在KERNEL32 中的内存访问异常打勾,其余一个勾都不打,请检查自己的Od设置。

用OD载入程序后。
Od提示程序加壳,选不继续分析。

00401000 > FC CLD 停在这里。
00401001 FC CLD
00401002 FC CLD
00401003 90 NOP
00401004 - E9 BDBA0000 JMP NOTEPAD.0040CAC6
00401009 - E3 D5 JECXZ SHORT NOTEPAD.00400FE0
0040100B 04 4F ADD AL,4F
0040100D - 74 A4 JE SHORT NOTEPAD.00400FB3
..................................................................
F9运行。
Od提示内存异常,Shift+F9继续运行。

0040CC9E 8618 XCHG BYTE PTR DS:[EAX],BL
0040CCA0 ^ EB FA JMP SHORT NOTEPAD.0040CC9C
0040CCA2 4A DEC EDX
0040CCA3 75 6E JNZ SHORT NOTEPAD.0040CD13

Od提示调试的程序无法处理异常,按Shift+F9程序退出。

0040CC9E 8618 XCHG BYTE PTR DS:[EAX],BL
0040CCA0 ^ EB FA JMP SHORT NOTEPAD.0040CC9C

很明显加密壳检测出OD调试器,最简单的应付方法就是用OD插件隐藏OD。
用插件隐藏Od后。
我们Shift+F9忽略第一次异常到了这里。
单步异常,再次Shift+F9程序就运行了。停,看堆栈吧。

0040CCD2 4B DEC EBX
0040CCD3 6F OUTS DX,DWORD PTR ES:[EDI] ; I/O 命令
0040CCD4 6368 69 ARPL DWORD PTR DS:[EAX+69],EBP

堆栈内容。

0012FFBC 0012FFE0 指针到下一个 SEH 记录
0012FFC0 0040CCD7 SE 句柄 呵,这里表示Od的最后一个异常处理出口就是0040CCD7,会在0040CCD7处的代码处继续正常运行。
0012FFC4 77E67903 返回到 KERNEL32.77E67903

哪我们就Ctrl+G,填入0040CCD7,回车,F2下断点,Shift+F9中断在这里。
顺利运行到这里,再没有Seh陷阱,可以单步跟踪去Oep处了。

0040CCD7 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
0040CCDB 8B00 MOV EAX,DWORD PTR DS:[EAX]
0040CCDD 3D 04000080 CMP EAX,80000004
0040CCE2 74 06 JE SHORT NOTEPAD.0040CCEA
0040CCE4 4B DEC EBX
0040CCE5 65:72 61 JB SHORT NOTEPAD.0040CD49 ; 多余的前缀
0040CCE8 6C INS BYTE PTR ES:[EDI],DX ; I/O 命令
0040CCE9 61 POPAD
0040CCEA EB 02 JMP SHORT NOTEPAD.0040CCEE
................................................................

去Oep出的过程我们先想象一下。

0040CCD7 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
0040CCDB 8B00 MOV EAX,DWORD PTR DS:[EAX]
0040CCDD 3D 04000080 CMP EAX,80000004
0040CCE2 74 06 JE SHORT NOTEPAD.0040CCEA
0040CCE4 4B DEC EBX
0040CCE5 65:72 61 JB SHORT NOTEPAD.0040CD49 ; 多余的前缀
0040CCE8 6C INS BYTE PTR ES:[EDI],DX ; I/O 命令
0040CCE9 61 POPAD
0040CCEA EB 02 JMP SHORT NOTEPAD.0040CCEE
...........................................................

经过中间过程。

Call XXXXX

循环..............

popad
jmp XXXXXX



ret
入口点,代码跨段。
那我们滚动条向上面看,当前段起始位置是40c000
跨段入口点的地址必须是小于40c000
那我们可以下条件断点了。
命令行下命令

tc eip<40c000

呵呵,我们熟悉的记事本入口,关键它已经跨段,换个程序通样处理,我们已经学会方法。

004010CC 55 PUSH EBP 跨段来到这里,我们再这里用Od的Dump插件直接脱壳。
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[<&KERNEL32.GetCommand>; KERNEL32.GetCommandLineA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT NOTEPAD.004010FC
004010E1 56 PUSH ESI
004010E2 FF15 F4644000 CALL DWORD PTR DS:[<&USER32.CharNextA>] ; USER32.CharNextA

脱壳后发现程序不能运行,这时需要用Imprec修复引入函数表(Import Table)
在Oep处填10cc,点IT自动搜索,然后点获输入信息,看到输入表全部有效,点修复抓取文件按钮,选择Dump的文件,修复它,运行后仍然不能运行。
呵,我们还有Lordpe重建PE的功能,用上吧。

运行Lordpe重建Pe,选择Imprec修复的文件,修复后正常运行。 
这个工具的工作原理,它的壳特征和编译器特征保存在HackFans.txt里面,能识别出来的壳,基本上都有对应的脱壳函数,用壳特征脱壳,可以脱壳,对于一些不好特殊的壳你可以用OEP侦测来脱壳,这要依赖编译器特征,你也可以自己添加编译器特征到HackFans.txt 对某些未知壳,可能能用未知壳脱壳选项搞定,它里面的原理也是用了编译器入口处信息. 修改历史: 1.对有IAT加密情况的,才进行IAT解密,避免了有时候不需要解密也去解密,导致脱后程序不能执行 2.支持文件拖拽功能 3.脱未知壳时,如果IAT加密了,请选上解密加密IAT项,进行IAT还原 下面是它能脱的壳: upx 0.5x-3.00 aspack 1.x--2.x PEcompact 0.90--1.76 PEcompact 2.06--2.79 NsPack nPack FSG 1.0--1.3 v1.31 v1.33 v2.0 VGCrypt0.75 expressor 1.0--1.5 dxpack v0.86 v1.0 !Epack v1.0 v1.4 mew1.1 packMan 1.0 PEDiminisher 0.1 pex 0.99 petite v1.2 - v1.4 petite v2.2 petite v2.3 winkript 1.0 pklite32 1.1 pepack 0.99 - 1.0 pcshrinker 0.71 wwpack32 1.0 - 1.2 upack v0.10 - v0.32 upack v0.33 - v0.399 RLPack Basic Edition 1.11--1.18 exe32pack v1.42 kbys 0.22 0.28 morphine v1.3 morphine v1.6 morphine v2.7 yoda's protector v1.02 yoda's protector v1.03.2 yoda's crypt v1.2 yoda's crypt v1.3 EXE Stealth v2.72--v2.76 bjfnt v1.2 - v1.3 HidePE 1.0--1.1 jdpack v1.01 jdpack v2.0 jdpack v2.13 PEncrypt v3.1 PEncrypt v4.0 Stone's PE Crypt v1.13 telock v0.42 telock v0.51 telock v0.60 telock v0.70 telock v0.71 telock v0.80 telock v0.90 telock v0.92 telock v0.95 v0.96 v0.98 v0.99 ezip v1.0 hmimys-packer v1.0 jdprotect v0.9b lamecrypt UPolyX v0.51 StealthPE 1.01 StealthPE 2.2 depack 涛涛压缩器 polyene 0.01 DragonArmour EP Protector v0.3 闪电壳(expressor) BeRoEXEPacker PackItBitch 木马彩衣 mkfpack anti007 v2.5 v2.6 yzpack v1.1 v1.2 v2.0 spack_method1 v1.0 v1.1 v1.2 v1.21 spack_method2 v1.1 v1.2 v1.21 xj1001 xj1000 xj看雪测试版 xj1003 xpal4 仙剑-凄凉雪 仙剑-望海潮 mslrh0.31 v0.32 [G!X]'s Protect
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值