首页
社区
课程
招聘
[旧帖] [原创]Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks 脱壳分析 (求邀请码) 0.00雪花
发表于: 2010-9-20 11:39 1466

[旧帖] [原创]Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks 脱壳分析 (求邀请码) 0.00雪花

2010-9-20 11:39
1466
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直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 27
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了,感谢这位兄弟提供,谢谢
2010-9-20 14:37
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
才学了两天,看手脱基本是在看天书啊
2010-9-27 14:51
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
LZ……

我不是打击你,可你这个不是原创,是抄袭吧。
这个似乎是飘云阁的文章吧?记得应该是几年前见过。
现在网上还能找到原文,其中的代码和注释,现在好多破解论坛都当教材案例转载过。

原文地址,其他论坛的就不写了,用搜索的随随便便就能找到一大堆。
http://hi.baidu.com/kong0030/blog/item/f306f83fdf042ffd838b137c.html
2010-9-27 15:16
0
游客
登录 | 注册 方可回帖
返回
//