破文标题:EncryptPE V1.2003.5.18 脱壳――某国产软件
壳下载地址:
http://www.encryptpe.com/EncryptPEV12003518.zip
软件安装包下载地址:
http://softcn.spritegame.com/hlsetup.exe
软件简介:1. 加密保护常规PE文件(EXE、DLL、OCX等),防静态分析修改,反动态跟踪调试。2. 将普通软件变成共享软件,增加定时注册提醒、限制试用日期、限制试用次数、限制试用天数、限制每次试用多长时间等功能。3. 根据最终用户的机器信息、注册用户名计算注册码,从 100 多种加密算法中随机选择一种用于注册码的计算。4. 支持多语言,除GB外的其他语言形式的界面元素由“EncryptPE.INI”文件设置,便于增删改,注册窗口界面与语言相关。5. 向待加密软件提供方便的编程接口,便于设计个性注册方式,同时使被加密程序与加密壳之间融为一个整体,增加破解难度。6. 经加密软件可以运行于多种 Windows 平台,包括 9X/ME/NT/2000/XP。(copy来的。HOHO。)
脱壳目标:EncryptPE 1.2003.5.18加壳的某软件
调试环境:winxp sp2、flyODBG、PEiD、LordPE、ImportREC、Fi
脱壳声明:看了fly和springkang的脱文后上手练习之作,纯属感兴趣,没有其他目的,如有失误请多指教。
********************************************************************************************************************************************
脱壳过程:
下载软件后peid查是tElock 0.98b1 -> tE!的壳,随便抓个脱壳机脱了。
再查,壳为EncryptPE 1.2003.5.18 -> WFS *
Od插件去掉调试器标志,忽略所有异常选项。添加“同时忽略0EEDFADE、C0000008、009B25C、00953D74”异常
载入后停在下面:
00462000 > 60 pushad
00462001 9C pushfd
00462002 64:FF35 0000000>push dword ptr fs:[0]
00462009 E8 79010000 call qqgamek.00462187
0046200E 0000 add byte ptr ds:[eax],al
00462010 0000 add byte ptr ds:[eax],al
发现入口关键字。启用esp定律。F8到00462002 64:FF35 0000000>push dword ptr fs:[0]
查看esp值为0012ffa0
命令行下断d 0012ffa0 下断点――硬件访问――dword断点
F9运行
程序中断在下面地方:
711A37AE 25 00010000 and eax,100
711A37B3 3D 00010000 cmp eax,100
711A37B8 74 05 je short V1200351.711A37BF
711A37BA E8 C996FFFF call V1200351.7119CE88
711A37BF 6A 10 push 10
711A37C1 A1 8CC71B71 mov eax,dword ptr ds:[711BC78C]
711A37C6 8B00 mov eax,dword ptr ds:[eax]
删除硬件断点。Alt+M调出内存窗口,属于主程序qqgamek的有如下几项:
内存映射,项目 22
地址=00400000
大小=00001000 (4096.)
物主=qqgamek 00400000 (自身)
区段=
包含=PE header
类型=Imag 01001002
访问=R
初始访问=RWE
内存映射,项目 23
地址=00401000
大小=00061000 (397312.)
物主=qqgamek 00400000
区段=.data
类型=Imag 01001002
访问=R
初始访问=RWE
内存映射,项目 24
地址=00462000
大小=0007B000 (503808.)
物主=qqgamek 00400000
区段=.data
包含=code,imports
类型=Imag 01001002
访问=R
初始访问=RWE
内存映射,项目 25
地址=004DD000
大小=00005000 (20480.)
物主=qqgamek 00400000
区段=.rsrc
包含=resources
类型=Imag 01001002
访问=R
初始访问=RWE
内存映射,项目 26
地址=004E2000
大小=00003000 (12288.)
物主=qqgamek 00400000
区段=.data
包含=data
类型=Imag 01001002
访问=R
初始访问=RWE
选择内存映射,项目 23 下内存访问断点(这里还是不大明白。为什么下这不是下在项目24的code那。参考springkang老大写的脱文下的)
F9运行,直接中断在程序的oep了。使用LordPE完整dump,得到dumped.exe(试过用od的dump插件dump,结果进程直接死掉。希望老大们告知原因)
下面。
要获得程序的输入表进行修复。
我使用的是fly老大的脱壳――Win98的Notepad里的方法
Od重新载入程序
BP IsDebuggerPresent下断断下后取消断点。
程序断在如下位置
7C812E03 > 64:A1 18000000 mov eax,dword ptr fs:[18]
7C812E09 8B40 30 mov eax,dword ptr ds:[eax+30]
7C812E0C 0FB640 02 movzx eax,byte ptr ds:[eax+2]
7C812E10 C3 retn
7C812E11 90 nop
继续下断 BP GetProcAddress
F9运行。观察堆栈 直到
0012FEDC 711A41BE /CALL 到 GetProcAddress 来自 V1200351.711A41B9
0012FEE0 7C800000 |hModule = 7C800000 (kernel32)
0012FEE4 00ADC6C0 \ProcNameOrOrdinal = "VirtualProtect"
0012FEE8 0012FEF4 指针到下一个 SEH 记录
F2取消断点,然后Ctrl+F9返回
7C80AC87 C2 0800 retn 8
7C80AC8A 837D 10 00 cmp dword ptr ss:[ebp+10],0
7C80AC8E ^ 0F85 81E6FFFF jnz kernel32.7C809315
F8跟进一步。到
711A41BE 8945 B8 mov dword ptr ss:[ebp-48],eax ; kernel32.VirtualProtect
711A41C1 33C0 xor eax,eax
711A41C3 8903 mov dword ptr ds:[ebx],eax
711A41C5 8B45 C0 mov eax,dword ptr ss:[ebp-40]
711A41C8 E8 3F07F8FF call V1200351.7112490C
711A41CD 8BC8 mov ecx,eax
711A41CF 8B45 B0 mov eax,dword ptr ss:[ebp-50]
711A41D2 83C0 02 add eax,2
711A41D5 8BD3 mov edx,ebx
711A41D7 E8 0834F8FF call V1200351.711275E4
711A41DC A1 74C71B71 mov eax,dword ptr ds:[711BC774]
711A41E1 8038 00 cmp byte ptr ds:[eax],0
711A41E4 0F85 D8010000 jnz V1200351.711A43C2
711A41EA 8A45 EF mov al,byte ptr ss:[ebp-11]
711A41ED 50 push eax
711A41EE A1 14C91B71 mov eax,dword ptr ds:[711BC914]
711A41F3 8B00 mov eax,dword ptr ds:[eax]
711A41F5 8B55 E4 mov edx,dword ptr ss:[ebp-1C]
711A41F8 8B0490 mov eax,dword ptr ds:[eax+edx*4]
711A41FB 8B4D B4 mov ecx,dword ptr ss:[ebp-4C]
711A41FE 8B55 B8 mov edx,dword ptr ss:[ebp-48]
711A4201 E8 E2F0FFFF call V1200351.711A32E8
711A4206 E9 B7010000 jmp V1200351.711A43C2
其中711A4201 E8 E2F0FFFF call V1200351.711A32E8
为加密iat的地方。
对711A4201下硬件执行断点
Ctrl+F2重载程序。F9运行,程序断在
711A4201 E8 E2F0FFFF call V1200351.711A32E8
取消硬件断点 F7跟进call
到达这:
711A32E8 55 push ebp
711A32E9 8BEC mov ebp,esp
711A32EB 83C4 F8 add esp,-8
711A32EE 53 push ebx
修改711A33A1 8B55 F8 mov edx,dword ptr ss:[ebp-8]
为711A33A1 8B55 F8 mov edx,dword ptr ss:[ebp-4]
F9运行
程序中断在异常处。不管它,打开ImportREC 选中调试中的qqgamek.exe进程。Oep中填写前文得到的
00021D4D 点自动搜索IAT,获取输入表 当前值都为真。直接修复抓取文件dump.exe。运行。程序可以执行。Peid和fi查壳 为Microsoft Visual C++ 7.0 。至此。脱壳完毕。
********************************************************************************************************************************************
总结:本文参考了fly老大和springkang老大的脱文,学习到了很多东西,向两位大虾致敬。同时也向王老师致敬,不好意思拿他的壳开刀了。
********************************************************************************************************************************************
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)