【软件名称】HDDlifePro_3.0.146
【应用平台】Win2000 SP4
【作者邮箱】chubing6143@sina.com
【使用工具】OllyDbg1.10,ArmaDetach.exe,OllyScript 1.51
【软件限制】Armadillo CopyMem-II+Debug-Blocker+Nanomites
【软件简介】查看硬盘状态的软件.
前面的话:
该软件我费了五天五夜时间才将其脱壳,好累,我想将其过程写出来与我等菜鸟分享。(这可能是我08年之前最后一次碰脱硬壳了,要干点正经事了),写文章之前必须感谢Fly,babyfox, daxia2002[DFCG],cxhcxh,Regkiller等高人在看雪上发表的文章,才有这篇文章,其实这就是菜鸟学习他们的结果.
【脱壳过程】
利用ArmaFindprotected查看该软件如下:
======== 17-10-2007 21:13:35 ========
F:\Program Files\BinarySense\HDDlife 3\HDDlifePro.exe
★ 目标为Armadillo保护
★ 特征识别 = B0738855
保护系统级别为 (专业版)
◆所用到的保护模式有◆
屏蔽调试器
双进程模式
使用输入表乱续模式
使用策略代码衔接模式
使用防内存补丁保护模式
【备份密钥设置】
不固定的备份密钥
【程序压缩设置】
较好/较慢地压缩方式
【其它保护设置】
关闭监视进程
使用 eSellerate 版本密钥
使用 Digital River 版本密钥
不要只依赖单机模式
下面开始脱壳:
一,寻找OEP+解码Dump
利用AvAtAr//TEAM RESURREC提供的Armadillo Process Detach v1.3 Final,也非常简单的dump。
选择CopyMem-II选项,把目标拖进去,成功后提示:
Filename: HDDlifePro
Parent process iD: [000003E4]
Processing...
[PROTECTiON SYSTEM]
Professional Edition
[PROTECTiON OPTiONS]
Debug-Blocker protection detected
CopyMem-II protection detected
Memory-Patching Protections enabled
Nanomites Processing enabled
[CHiLD iNFO]
Crypto call found: [00556E1B]
Child process iD: [0000043C]
Entry point: [004B8764]
Original bytes: [6A6068C8]
Detached successfully :)
利用OD附加43C的子进程,F9,F12来到被修改了的OEP处,将前面四个字节修改为6A 60 68 C8,然后利用LordPE
Dump Full,这样就完成了Dump的任务。
二、修复IAT
利用OD加载没有脱壳的程序,BP DebugActiveProcess+5,Shift+F9,运行,程序中断下来,查看堆栈如下:
0012DD84 |00554464 返回到 HDDlifeP.00554464 来自 kernel32.DebugActiveProcess
0012DD88 |00000490
然后新开一个OD,然后附加490的程序,F9,F12来到被修改了的OEP处,将前面两个字节修改为60 E8(未脱壳程序中的OEP)
然后利用“转单进程脚本”
msg "请忽略所有异常,并添加忽略C000001E异常,然后运行本脚本!"
gpa "OpenMutexA","kernel32.dll"
bp $RESULT
esto
exec
pushad
pushfd
push edx
xor eax,eax
push eax
push eax
call kernel32.CreateMutexA
popfd
popad
jmp kernel32.OpenMutexA
ende
bc eip
msg "现已转换成单进程!"
ret
将程序转换为单进程,程序中断在下面地方
7C80EC1B kernel32.OpenMutex> 8BFF mov edi,edi
7C80EC1D 55 push ebp
7C80EC1E 8BEC mov ebp,esp
堆栈显示:
0012F6F8 005510DA /CALL 到 OpenMutexA 来自 HDDlifeP.005510D4
0012F6FC 001F0001 |Access = 1F0001
0012F700 00000000 |Inheritable = FALSE
0012F704 0012FD54 \MutexName = "490::DA13CEE33D"
然后BP GetModuleHandleA+5,Shift+F9,注意看堆栈,当堆栈如下变化时:
00129450 |00E65935 返回到 00E65935 来自 kernel32.GetModuleHandleA
00129454 |00E90B98 ASCII "kernel32.dll"
00129458 |00E91A84 ASCII "VirtualAlloc"
00129450 |00E65953 返回到 00E65953 来自 kernel32.GetModuleHandleA
00129454 |00E90B98 ASCII "kernel32.dll"
00129458 |00E91A78 ASCII "VirtualFree"
0012919C |00E48474 返回到 00E48474 来自 kernel32.GetModuleHandleA
001291A0 |00129318 ASCII "kernel32.dll"
取消断点,Alt+F9返回,
00E48474 8B55 F4 mov edx,dword ptr ss:[ebp-C] ; 来到这里
00E48477 8B0D 4CDFE900 mov ecx,dword ptr ds:[E9DF4C]
00E4847D 890491 mov dword ptr ds:[ecx+edx*4],eax
00E48480 8B55 F4 mov edx,dword ptr ss:[ebp-C]
00E48483 A1 4CDFE900 mov eax,dword ptr ds:[E9DF4C]
00E48488 833C90 00 cmp dword ptr ds:[eax+edx*4],0
00E4848C 75 5C jnz short 00E484EA
00E4848E 8B4D F8 mov ecx,dword ptr ss:[ebp-8]
00E48491 8B51 08 mov edx,dword ptr ds:[ecx+8]
00E48494 83E2 02 and edx,2
00E48497 74 38 je short 00E484D1
00E48499 B8 05000000 mov eax,5
00E4849E C1E0 02 shl eax,2
00E484A1 8B0D 04BBE900 mov ecx,dword ptr ds:[E9BB04] ; HDDlifeP.0058C398
00E484A7 8B15 04BBE900 mov edx,dword ptr ds:[E9BB04] ; HDDlifeP.0058C398
00E484AD 8B35 04BBE900 mov esi,dword ptr ds:[E9BB04] ; HDDlifeP.0058C398
00E484B3 8B5E 3C mov ebx,dword ptr ds:[esi+3C]
00E484B6 335A 74 xor ebx,dword ptr ds:[edx+74]
00E484B9 331C01 xor ebx,dword ptr ds:[ecx+eax]
00E484BC 83E3 10 and ebx,10
00E484BF F7DB neg ebx
00E484C1 1BDB sbb ebx,ebx
00E484C3 F7DB neg ebx
00E484C5 0FB6C3 movzx eax,bl
00E484C8 85C0 test eax,eax
00E484CA 75 05 jnz short 00E484D1
00E484CC ^ E9 1BFFFFFF jmp 00E483EC
00E484D1 8D8D C8FEFFFF lea ecx,dword ptr ss:[ebp-138]
00E484D7 51 push ecx
00E484D8 FF15 D4E1E800 call dword ptr ds:[E8E1D4] ; kernel32.LoadLibraryA
00E484DE 8B55 F4 mov edx,dword ptr ss:[ebp-C]
00E484E1 8B0D 4CDFE900 mov ecx,dword ptr ds:[E9DF4C]
00E484E7 890491 mov dword ptr ds:[ecx+edx*4],eax
00E484EA 8B55 F4 mov edx,dword ptr ss:[ebp-C]
00E484ED A1 4CDFE900 mov eax,dword ptr ds:[E9DF4C]
00E484F2 833C90 00 cmp dword ptr ds:[eax+edx*4],0
00E484F6 75 05 jnz short 00E484FD ; Magic Jmp,NOP掉
00E484F8 ^ E9 EFFEFFFF jmp 00E483EC
00E484FD C785 BCFEFFFF 00000>mov dword ptr ss:[ebp-144],0
00E48507 C785 C0FEFFFF 00000>mov dword ptr ss:[ebp-140],0
00E48511 8B4D F8 mov ecx,dword ptr ss:[ebp-8]
00E48514 8B51 04 mov edx,dword ptr ds:[ecx+4]
00E48517 8995 C4FEFFFF mov dword ptr ss:[ebp-13C],edx
00E4851D EB 0F jmp short 00E4852E
00E4851F 8B85 C4FEFFFF mov eax,dword ptr ss:[ebp-13C]
00E48525 83C0 0C add eax,0C
00E48528 8985 C4FEFFFF mov dword ptr ss:[ebp-13C],eax
00E4852E 8B8D C4FEFFFF mov ecx,dword ptr ss:[ebp-13C]
00E48534 8339 00 cmp dword ptr ds:[ecx],0
00E48537 74 11 je short 00E4854A
00E48539 8B95 C0FEFFFF mov edx,dword ptr ss:[ebp-140]
00E4853F 83C2 01 add edx,1
00E48542 8995 C0FEFFFF mov dword ptr ss:[ebp-140],edx
00E48548 ^ EB D5 jmp short 00E4851F
00E4854A 33C9 xor ecx,ecx
00E4854C 8B85 C0FEFFFF mov eax,dword ptr ss:[ebp-140]
00E48552 BA 04000000 mov edx,4
00E48557 F7E2 mul edx
00E48559 0F90C1 seto cl
00E4855C F7D9 neg ecx
00E4855E 0BC8 or ecx,eax
00E48560 51 push ecx
00E48561 E8 49FF0200 call 00E784AF
00E48566 83C4 04 add esp,4
00E48569 8985 7CFDFFFF mov dword ptr ss:[ebp-284],eax
00E4856F 8B45 F4 mov eax,dword ptr ss:[ebp-C]
00E48572 8B0D 44DFE900 mov ecx,dword ptr ds:[E9DF44]
00E48578 8B95 7CFDFFFF mov edx,dword ptr ss:[ebp-284]
00E4857E 891481 mov dword ptr ds:[ecx+eax*4],edx
00E48581 33C9 xor ecx,ecx
00E48583 8B85 C0FEFFFF mov eax,dword ptr ss:[ebp-140]
00E48589 BA 04000000 mov edx,4
00E4858E F7E2 mul edx
00E48590 0F90C1 seto cl
00E48593 F7D9 neg ecx
00E48595 0BC8 or ecx,eax
00E48597 51 push ecx
00E48598 E8 12FF0200 call 00E784AF
00E4859D 83C4 04 add esp,4
00E485A0 8985 78FDFFFF mov dword ptr ss:[ebp-288],eax
00E485A6 8B45 F4 mov eax,dword ptr ss:[ebp-C]
00E485A9 8B0D 48DFE900 mov ecx,dword ptr ds:[E9DF48]
00E485AF 8B95 78FDFFFF mov edx,dword ptr ss:[ebp-288]
00E485B5 891481 mov dword ptr ds:[ecx+eax*4],edx
00E485B8 8B45 F8 mov eax,dword ptr ss:[ebp-8]
00E485BB 8B48 04 mov ecx,dword ptr ds:[eax+4]
00E485BE 898D C4FEFFFF mov dword ptr ss:[ebp-13C],ecx
00E485C4 EB 1E jmp short 00E485E4
00E485C6 8B95 C4FEFFFF mov edx,dword ptr ss:[ebp-13C]
00E485CC 83C2 0C add edx,0C
00E485CF 8995 C4FEFFFF mov dword ptr ss:[ebp-13C],edx
00E485D5 8B85 BCFEFFFF mov eax,dword ptr ss:[ebp-144]
00E485DB 83C0 01 add eax,1
00E485DE 8985 BCFEFFFF mov dword ptr ss:[ebp-144],eax
00E485E4 8B8D C4FEFFFF mov ecx,dword ptr ss:[ebp-13C]
00E485EA 8339 00 cmp dword ptr ds:[ecx],0
00E485ED 0F84 47010000 je 00E4873A
00E485F3 68 00010000 push 100
00E485F8 8D95 B8FDFFFF lea edx,dword ptr ss:[ebp-248]
00E485FE 52 push edx
00E485FF 8B85 C4FEFFFF mov eax,dword ptr ss:[ebp-13C]
00E48605 8B08 mov ecx,dword ptr ds:[eax]
00E48607 51 push ecx
00E48608 E8 53AAFDFF call 00E23060
00E4860D 83C4 0C add esp,0C
00E48610 8B15 04BBE900 mov edx,dword ptr ds:[E9BB04] ; HDDlifeP.0058C398
00E48616 A1 04BBE900 mov eax,dword ptr ds:[E9BB04]
00E4861B 8B4A 78 mov ecx,dword ptr ds:[edx+78]
00E4861E 3348 3C xor ecx,dword ptr ds:[eax+3C]
00E48621 8B15 04BBE900 mov edx,dword ptr ds:[E9BB04] ; HDDlifeP.0058C398
00E48627 334A 74 xor ecx,dword ptr ds:[edx+74]
00E4862A A1 04BBE900 mov eax,dword ptr ds:[E9BB04]
00E4862F 3348 24 xor ecx,dword ptr ds:[eax+24]
00E48632 898D 6CFDFFFF mov dword ptr ss:[ebp-294],ecx
00E48638 8D8D B8FDFFFF lea ecx,dword ptr ss:[ebp-248]
00E4863E 51 push ecx
00E4863F 8B55 F4 mov edx,dword ptr ss:[ebp-C]
00E48642 A1 4CDFE900 mov eax,dword ptr ds:[E9DF4C]
00E48647 8B0C90 mov ecx,dword ptr ds:[eax+edx*4]
00E4864A 51 push ecx
00E4864B FF15 04E3E800 call dword ptr ds:[E8E304] ; kernel32.GetProcAddress
00E48651 3385 6CFDFFFF xor eax,dword ptr ss:[ebp-294]
00E48657 8B55 F4 mov edx,dword ptr ss:[ebp-C]
00E4865A 8B0D 44DFE900 mov ecx,dword ptr ds:[E9DF44]
00E48660 8B1491 mov edx,dword ptr ds:[ecx+edx*4]
00E48663 8B8D BCFEFFFF mov ecx,dword ptr ss:[ebp-144]
00E48669 89048A mov dword ptr ds:[edx+ecx*4],eax
00E4866C 6A 01 push 1
00E4866E 8D95 B8FDFFFF lea edx,dword ptr ss:[ebp-248]
00E48674 52 push edx
00E48675 8B45 F4 mov eax,dword ptr ss:[ebp-C]
00E48678 8B0D 4CDFE900 mov ecx,dword ptr ds:[E9DF4C]
00E4867E 8B1481 mov edx,dword ptr ds:[ecx+eax*4]
00E48681 52 push edx
00E48682 E8 D9090000 call 00E49060
00E48687 83C4 0C add esp,0C
00E4868A 8B4D F4 mov ecx,dword ptr ss:[ebp-C]
00E4868D 8B15 48DFE900 mov edx,dword ptr ds:[E9DF48]
00E48693 8B0C8A mov ecx,dword ptr ds:[edx+ecx*4]
00E48696 8B95 BCFEFFFF mov edx,dword ptr ss:[ebp-144]
00E4869C 890491 mov dword ptr ds:[ecx+edx*4],eax
00E4869F 8B45 F4 mov eax,dword ptr ss:[ebp-C]
00E486A2 8B0D 48DFE900 mov ecx,dword ptr ds:[E9DF48]
00E486A8 8B1481 mov edx,dword ptr ds:[ecx+eax*4]
00E486AB 8B85 BCFEFFFF mov eax,dword ptr ss:[ebp-144]
00E486B1 833C82 00 cmp dword ptr ds:[edx+eax*4],0
00E486B5 75 32 jnz short 00E486E9
00E486B7 6A 00 push 0
00E486B9 8D8D B8FDFFFF lea ecx,dword ptr ss:[ebp-248]
00E486BF 51 push ecx
00E486C0 8B55 F4 mov edx,dword ptr ss:[ebp-C]
00E486C3 A1 4CDFE900 mov eax,dword ptr ds:[E9DF4C]
00E486C8 8B0C90 mov ecx,dword ptr ds:[eax+edx*4]
00E486CB 51 push ecx
00E486CC E8 8F090000 call 00E49060
00E486D1 83C4 0C add esp,0C
00E486D4 8B55 F4 mov edx,dword ptr ss:[ebp-C]
00E486D7 8B0D 48DFE900 mov ecx,dword ptr ds:[E9DF48]
00E486DD 8B1491 mov edx,dword ptr ds:[ecx+edx*4]
00E486E0 8B8D BCFEFFFF mov ecx,dword ptr ss:[ebp-144]
00E486E6 89048A mov dword ptr ds:[edx+ecx*4],eax
00E486E9 8B55 F4 mov edx,dword ptr ss:[ebp-C]
00E486EC A1 48DFE900 mov eax,dword ptr ds:[E9DF48]
00E486F1 8B0C90 mov ecx,dword ptr ds:[eax+edx*4]
00E486F4 8B15 04BBE900 mov edx,dword ptr ds:[E9BB04] ; HDDlifeP.0058C398
00E486FA A1 04BBE900 mov eax,dword ptr ds:[E9BB04]
00E486FF 8B35 04BBE900 mov esi,dword ptr ds:[E9BB04] ; HDDlifeP.0058C398
00E48705 8B3D 04BBE900 mov edi,dword ptr ds:[E9BB04] ; HDDlifeP.0058C398
00E4870B 8B7F 78 mov edi,dword ptr ds:[edi+78]
00E4870E 337E 3C xor edi,dword ptr ds:[esi+3C]
00E48711 3378 74 xor edi,dword ptr ds:[eax+74]
00E48714 337A 24 xor edi,dword ptr ds:[edx+24]
00E48717 8B95 BCFEFFFF mov edx,dword ptr ss:[ebp-144]
00E4871D 333C91 xor edi,dword ptr ds:[ecx+edx*4]
00E48720 8B45 F4 mov eax,dword ptr ss:[ebp-C]
00E48723 8B0D 48DFE900 mov ecx,dword ptr ds:[E9DF48]
00E48729 8B1481 mov edx,dword ptr ds:[ecx+eax*4]
00E4872C 8B85 BCFEFFFF mov eax,dword ptr ss:[ebp-144]
00E48732 893C82 mov dword ptr ds:[edx+eax*4],edi
00E48735 ^ E9 8CFEFFFF jmp 00E485C6
00E4873A 8B0D 04BBE900 mov ecx,dword ptr ds:[E9BB04] ; HDDlifeP.0058C398
00E48740 8B15 04BBE900 mov edx,dword ptr ds:[E9BB04] ; HDDlifeP.0058C398
00E48746 A1 04BBE900 mov eax,dword ptr ds:[E9BB04]
00E4874B 8B35 04BBE900 mov esi,dword ptr ds:[E9BB04] ; HDDlifeP.0058C398
00E48751 8B76 64 mov esi,dword ptr ds:[esi+64]
00E48754 3370 74 xor esi,dword ptr ds:[eax+74]
00E48757 3372 44 xor esi,dword ptr ds:[edx+44]
00E4875A 3371 6C xor esi,dword ptr ds:[ecx+6C]
00E4875D 8B4D F4 mov ecx,dword ptr ss:[ebp-C]
00E48760 8B15 4CDFE900 mov edx,dword ptr ds:[E9DF4C]
00E48766 33348A xor esi,dword ptr ds:[edx+ecx*4]
00E48769 8B45 F4 mov eax,dword ptr ss:[ebp-C]
00E4876C 8B0D 4CDFE900 mov ecx,dword ptr ds:[E9DF4C]
00E48772 893481 mov dword ptr ds:[ecx+eax*4],esi
00E48775 ^ E9 72FCFFFF jmp 00E483EC
00E4877A EB 03 jmp short 00E4877F
00E4877C D6 salc
00E4877D D6 salc
将00E484F6 75 05 jnz short 00E484FD NOP掉
然后在00E4877A处F2下断点,F9运行下来后取消断点,并撤消
00E484F6处的选择。
这个东东在处理输入表的时候还有时间校验,不处理的话会导致某些函数被加密
下断:BP GetTickCount+5 中断后
7C8092B1 8B02 mov eax,dword ptr ds:[edx] ; 中断在这里
7C8092B3 F762 04 mul dword ptr ds:[edx+4]
7C8092B6 0FACD0 18 shrd eax,edx,18
7C8092BA C3 retn
取消断点ALT+F9返回
00E6AEC8 FF15 44E3E800 call dword ptr ds:[E8E344] ; kernel32.GetTickCount
00E6AECE 8985 94D4FFFF mov dword ptr ss:[ebp-2B6C],eax ; 返回这里
00E6AED4 B9 01000000 mov ecx,1
00E6AED9 85C9 test ecx,ecx
00E6AEDB 0F84 C4030000 je 00E6B2A5
下面还有一处GetTickCount取时间
00E6B283 8B85 4CD8FFFF mov eax,dword ptr ss:[ebp-27B4] ; 此处EAX中能够看到IAT中的一个单元地址的地方,这里为4EC7C8
00E6B289 8B8D 54CAFFFF mov ecx,dword ptr ss:[ebp-35AC]
00E6B28F 8908 mov dword ptr ds:[eax],ecx
00E6B291 8B95 4CD8FFFF mov edx,dword ptr ss:[ebp-27B4]
00E6B297 83C2 04 add edx,4
00E6B29A 8995 4CD8FFFF mov dword ptr ss:[ebp-27B4],edx
00E6B2A0 ^ E9 2FFCFFFF jmp 00E6AED4
00E6B2A5 FF15 44E3E800 call dword ptr ds:[E8E344] ; kernel32.GetTickCount
00E6B2AB 2B85 94D4FFFF sub eax,dword ptr ss:[ebp-2B6C]
00E6B2B1 8B8D A4D4FFFF mov ecx,dword ptr ss:[ebp-2B5C]
00E6B2B7 6BC9 32 imul ecx,ecx,32
00E6B2BA 81C1 D0070000 add ecx,7D0
00E6B2C0 3BC1 cmp eax,ecx
00E6B2C2 76 07 jbe short 00E6B2CB ; 将其修改为jmp short 00E6B2CB
然后在红色代码下方的:
00E6B496 83C4 04 add esp,4
00E6B499 EB 03 jmp short 00E6B49E
00E6B49B D6 salc
00E6B49C D6 salc
00E6B499处下断点,F9运行下来,此时得到的IAT就是正确的IAT了。通过在数据窗口滚动可以知道IAT为4EC000-4EC8EC.
此时,运行ImportREC,选择这个进程。填入RVA=0EC000、Size=000008EC,Get Import剪切掉无效函数,修改OEP RVA=0B8764,FixDump。
三、解决CC
再次利用AvAtAr//TEAM RESURREC提供的Armadillo Process Detach v1.3 Final,也非常简单的dump。
选择CopyMem-II选项,把目标拖进去,成功后显示:
Filename: HDDlifePro
......
[CHiLD iNFO]
Crypto call found: [00556E1B]
Child process iD: [00000670]
Entry point: [004B8764]
Original bytes: [6A6068C8]
Detached successfully :)
启动ArmInlinev0.96f,选中ID为670的HDDlifePro,然后点击Locate按钮,经过等待处理INT 3,然后Repair Dump,生成dumped_ NanoFix.exe,
该EXE就是脱壳后的程序了。
至于ArmaFindprotected报告的“使用输入表乱续模式,使用策略代码衔接模式”,在该软件中没有出现。
四、暗桩
运行dumped_ NanoFix.exe时,在433E9C处报0x94的错误,利用OD打开看看,
00433E9C F77D F0 idiv dword ptr ss:[ebp-10]
运行时发现[ebp-10]=0,将其NOP掉就能正常运行了。
脱壳完毕。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课