Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks 脱壳分析
【破文标题】Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks 脱壳分析
【破文作者】hyruur
【破解平台】WinXp
【作者邮箱】[email]hyruur@163.com[/email]
【软件名称】Easy DVD to DivX/VCD/SVCD Converter 3.0.26
【下载地址】
http://www.easydvdcdburner.com/dvdconverter/EasyDVDConverterPro.exe
【破解工具】PEID0.94、OD、ImportREC 1.6、LordPE
【破解目的】学习脱壳。
【破解声明】我乃小菜鸟一只,偶得一点心得,愿与大家分享:)
【软件介绍】Easy DVD to DivX/VCD/SVCD Converter 是一款DVD复制、RIP和转换工具。
只需要点几下,你可以把DVD复制到你的硬盘上,并保存为DivX (MPEG4)/VCD (MPEG1)/SVCD (MPEG2)格式。
【脱壳过程】PEID 探测为 Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks
OD载入程序来到这里:
0050F000 Ea> 60 pushad
0050F001 E8 00000000 call EasyDVDC.0050F006
0050F006 5D pop ebp
0050F007 50 push eax
0050F008 51 push ecx
0050F009 0FCA bswap edx
0050F00B F7D2 not edx
0050F00D 9C pushfd
0050F00E F7D2 not edx
0050F010 0FCA bswap edx
0050F012 EB 0F jmp short EasyDVDC.0050F023
0050F014 B9 EB0FB8EB mov ecx,EBB80FEB
0050F019 07 pop es
0050F01A B9 EB0F90EB mov ecx,EB900FEB
0050F01F 08FD or ch,bh
0050F021 EB 0B jmp short EasyDVDC.0050F02E
0050F023 F2: prefix repne:
0050F024 ^ EB F5 jmp short EasyDVDC.0050F01B
0050F026 ^ EB F6 jmp short EasyDVDC.0050F01E
0050F028 F2: prefix repne:
0050F029 EB 08 jmp short EasyDVDC.0050F033
0050F02B FD std
0050F02C ^ EB E9 jmp short EasyDVDC.0050F017
0050F02E F3: prefix rep:
0050F02F ^ EB E4 jmp short EasyDVDC.0050F015
0050F031 FC cld
0050F032 - E9 9D0FC98B jmp 8C19FFD4
0050F037 CA F7D1 retf 0D1F7
Alt+E
找到 "EasyDVDConverter" 一栏-右键-查看名称,然后找到 "WriteProcessMemory"-右键-"在反汇编窗口中跟随导入函数"
7C80220F ke> 8BFF mov edi,edi
7C802211 55 push ebp
7C802212 8BEC mov ebp,esp //在这里下断点
7C802214 51 push ecx
7C802215 51 push ecx
7C802216 8B45 0C mov eax,dword ptr ss:[ebp+C]
7C802219 53 push ebx
7C80221A 8B5D 14 mov ebx,dword ptr ss:[ebp+14]
7C80221D 56 push esi
7C80221E 8B35 B812807C mov esi,dword ptr ds:[<&ntdll.NtPr>; ntdll.ZwProtectVirtualMemory
7C802224 57 push edi
7C802225 8B7D 08 mov edi,dword ptr ss:[ebp+8]
7C802228 8945 F8 mov dword ptr ss:[ebp-8],eax
7C80222B 8D45 14 lea eax,dword ptr ss:[ebp+14]
7C80222E 50 push eax
7C80222F 6A 40 push 40
在 7C802211 处F2下断后,shift+f9运行程序~~ 然后alt+f9返回
返回到这里:
004EE8A5 /70 07 jo short EasyDVDC.004EE8AE
004EE8A7 |7C 03 jl short EasyDVDC.004EE8AC
004EE8A9 |EB 05 jmp short EasyDVDC.004EE8B0
004EE8AB |E8 74FBEBF9 call FA3AE424
004EE8B0 EB 5F jmp short EasyDVDC.004EE911
004EE8B2 8D55 FC lea edx,dword ptr ss:[ebp-4]
004EE8B5 52 push edx
004EE8B6 6A 02 push 2
004EE8B8 68 345E5200 push EasyDVDC.00525E34
004EE8BD 8B45 10 mov eax,dword ptr ss:[ebp+10]
004EE8C0 50 push eax
004EE8C1 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
004EE8C4 8B11 mov edx,dword ptr ds:[ecx]
004EE8C6 52 push edx
004EE8C7 FF15 10F15100 call dword ptr ds:[<&KERNEL32.Writ>; kernel32.WriteProcessMemory
004EE8CD 50 push eax
004EE8CE F7D0 not eax
Ctrl+a分析代码:
变成下面的样子:
004EE8A5 . /70 07 jo short EasyDVDC.004EE8AE
004EE8A7 . |7C 03 jl short EasyDVDC.004EE8AC
004EE8A9 > |EB 05 jmp short EasyDVDC.004EE8B0
004EE8AB |E8 db E8
004EE8AC >^|74 FB je short EasyDVDC.004EE8A9
004EE8AE >^\EB F9 jmp short EasyDVDC.004EE8A9
004EE8B0 > EB 5F jmp short EasyDVDC.004EE911
004EE8B2 > 8D55 FC lea edx,dword ptr ss:[ebp-4]
004EE8B5 . 52 push edx ; /pBytesWritten
004EE8B6 . 6A 02 push 2 ; |BytesToWrite = 2
004EE8B8 . 68 345E5200 push EasyDVDC.00525E34 ; |Buffer = EasyDVDC.00525E34 //★★就是这里了,
右键-"数据窗口跟随"-"立即数"
004EE8BD . 8B45 10 mov eax,dword ptr ss:[ebp+10] ; |
004EE8C0 . 50 push eax ; |Address
004EE8C1 . 8B4D 08 mov ecx,dword ptr ss:[ebp+8] ; |
004EE8C4 . 8B11 mov edx,dword ptr ds:[ecx] ; |
004EE8C6 . 52 push edx ; |hProcess
004EE8C7 . FF15 10F15100 call dword ptr ds:[<&KERNEL32.Writ>; \WriteProcessMemory
004EE8CD . 50 push eax
004EE8CE . F7D0 not eax
左下角显示如下:
00525E34 60 E8 00 00 00 00 00 00 `?..... //★把这里"60 E8" 改为 "EB FE"
00525E3C 00 00 00 00 00 00 00 00 ........
改好之后按F9中断在此:
7C802212 8BEC mov ebp,esp //在这里取消断点
7C802214 51 push ecx
7C802215 51 push ecx
7C802216 8B45 0C mov eax,dword ptr ss:[ebp+C]
7C802219 53 push ebx
7C80221A 8B5D 14 mov ebx,dword ptr ss:[ebp+14]
7C80221D 56 push esi
7C80221E 8B35 B812807C mov esi,dword ptr ds:[<&ntdll.NtPr>; ntdll.ZwProtectVirtualMemory
7C802224 57 push edi
7C802225 8B7D 08 mov edi,dword ptr ss:[ebp+8]
然后再按一次F9,ok~~ 现在命令行下断 bp WaitForDebugEvent 应该立即中断在这个API上:
7C85A268 ke> 8BFF mov edi,edi //中断在此~
7C85A26A 55 push ebp
7C85A26B 8BEC mov ebp,esp
7C85A26D 83EC 68 sub esp,68
7C85A270 56 push esi
7C85A271 FF75 0C push dword ptr ss:[ebp+C]
7C85A274 8D45 F8 lea eax,dword ptr ss:[ebp-8]
7C85A277 50 push eax
7C85A278 E8 F381FAFF call kernel32.7C802470
Alt+F9返回:
004EA3DF . 85C0 test eax,eax //返回到这里
004EA3E1 . 0F84 2B270000 je EasyDVDC.004ECB12
004EA3E7 . 8B85 FCFDFFFF mov eax,dword ptr ss:[ebp-204]
004EA3ED . 25 FF000000 and eax,0FF
好了,现在我们来查看子进程的ID "文件"-"附加" 现在你应该看到了2个名称为EasyDVDConverter的东西,一个红色的,一个黑色的
未命名的窗口,项目 23
进程=000009B8 //父进程ID 这里每次都是不同的哦~~~~ 如现在是3C8了~~ 嘿嘿
名称=EasyDVDConverter
路径=C:\Program Files\EasyDVDConverter\EasyDVDConverter.exe //这里红色显示
未命名的窗口,项目 25
进程=00000C44 //子进程ID,记住这个C44 ★★ 这里每次都是不同的哦~~~~ ★★ 现在是CF8
名称=EasyDVDConverter
路径=C:\Program Files\EasyDVDConverter\EasyDVDConverter.exe //这里黑色显示
得到以上信息之后.我们就来改代码,分离子进程~ 改成如下的样子:
004EA3DF 68 440C0000 push 0C44
004EA3E4 E8 A8FF367C Call DebugActiveProcessStop
004EA3E9 90 nop
004EA3EA 90 nop
004EA3EB 90 nop
004EA3EC 90 nop
接下来F8单步到第一个nop处,即004EA3E9处
至此 子.父进程已没有任何联系~
打开另外一个OD-"文件"-"附加"-子进程ID 来到这里:
7C921231 C3 retn //停在这里
7C921232 8BFF mov edi,edi
7C921234 90 nop
7C921235 90 nop
7C921236 90 nop
7C921237 90 nop
7C921238 90 nop
7C921239 nt> CC int3
ALT+F9返回:
0050F000 Ea>- EB FE jmp short EasyDVDC.<模块入口点>
0050F002 0000 add byte ptr ds:[eax],al
0050F004 0000 add byte ptr ds:[eax],al
0050F006 5D pop ebp
记得前面我们 将 "60 E8" 改成了 "EB FE" 现在我们要将之改回来 "EB FE" - "60 E8" (在0050F000 这行上点右键-"二进制"-"编辑")
改好之后如下所示:
0050F000 Ea> 60 pushad
0050F001 E8 00000000 call EasyDVDC.0050F006
现在 shfif+F9运行程序,只到出现Nag窗口
命令行下断 bp CreateThread ,然后点击 "OK"
立即中断在此:
7C81082F ke> 8BFF mov edi,edi
7C810831 55 push ebp
7C810832 8BEC mov ebp,esp
7C810834 FF75 1C push dword ptr ss:[ebp+1C]
7C810837 FF75 18 push dword ptr ss:[ebp+18]
7C81083A FF75 14 push dword ptr ss:[ebp+14]
7C81083D FF75 10 push dword ptr ss:[ebp+10]
7C810840 FF75 0C push dword ptr ss:[ebp+C]
7C810843 FF75 08 push dword ptr ss:[ebp+8]
7C810846 6A FF push -1
7C810848 E8 D9FDFFFF call kernel32.CreateRemoteThread
7C81084D 5D pop ebp
7C81084E C2 1800 retn 18
按ctrl+f9 和 f7 来到:
00BEA9F2 5F pop edi
00BEA9F3 5E pop esi
00BEA9F4 C9 leave
00BEA9F5 C3 retn
继续ctrl+f9 和 f7 来到:
00BFC743 59 pop ecx ; kernel32.7C8107FD
00BFC744 BF 10B3C000 mov edi,0C0B310
00BFC749 8BCF mov ecx,edi
00BFC74B E8 05B9FDFF call 00BD8055
00BFC750 84C0 test al,al
00BFC752 75 09 jnz short 00BFC75D
现在重要了~~~~ 注意了!!!
拖动滚动条,向下面找第二个call ecx然后下断 (当然你不肯定的时候,可以将2个call ecx 都下断):
00BFC7B5 3350 1C xor edx,dword ptr ds:[eax+1C]
00BFC7B8 2BCA sub ecx,edx
00BFC7BA FFD1 call ecx //★★这里F2下断★★
f9一次之后立即中断,F7步入~~~:
00401C08 68 6CBA4300 push EasyDVDC.0043BA6C //Year! Oep~~~~
00401C0D E8 F0FFFFFF call EasyDVDC.00401C02
00401C12 0000 add byte ptr ds:[eax],al
00401C14 50 push eax
00401C15 0000 add byte ptr ds:[eax],al
00401C17 0030 add byte ptr ds:[eax],dh
00401C19 0000 add byte ptr ds:[eax],al
打开 lordPE 选中子进程-右键-"完整转存" 保存为dumped.exe
运行 Import REC 选中子进程-OEP:00001C08 - "IAT AutoSearch" CUT无效指针~~
修复文件~~ ok 试运行程序 晕,提示未找到 "ArmAccess.dll" (这个是arm壳中自带的) 我们复制一个放到程序中运行,看看~~
ok,一切正常,没有未注册提示了~~~~
PEID探测-- Microsoft Visual Basic 5.0 / 6.0
收工!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课