飘云 发表于 2006-3-26 17:11:39

Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks 脱壳分析[快速!]

【破文标题】Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks 双进程脱壳分析[快速!]
【破文作者】飘云
【破解平台】WinXp
【作者邮箱】[email protected]
【软件名称】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)格式。
【动画教程】https://www.chinapyg.com/viewthread.php?tid=4231&extra=page%3D1
【脱壳过程】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:
7C802219      53                  push ebx
7C80221A      8B5D 14               mov ebx,dword ptr ss:
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:
7C802228      8945 F8               mov dword ptr ss:,eax
7C80222B      8D45 14               lea eax,dword ptr ss:
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:
004EE8B5      52                  push edx
004EE8B6      6A 02               push 2
004EE8B8      68 345E5200         push EasyDVDC.00525E34
004EE8BD      8B45 10               mov eax,dword ptr ss:
004EE8C0      50                  push eax
004EE8C1      8B4D 08               mov ecx,dword ptr ss:
004EE8C4      8B11                  mov edx,dword ptr ds:
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:
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:      ; |
004EE8C0   .50                  push eax                           ; |Address
004EE8C1   .8B4D 08             mov ecx,dword ptr ss:       ; |
004EE8C4   .8B11                mov edx,dword ptr ds:         ; |
004EE8C6   .52                  push edx                           ; |hProcess
004EE8C7   .FF15 10F15100       call dword ptr ds:[<&KERNEL32.Writ>; \WriteProcessMemory
004EE8CD   .50                  push eax
004EE8CE   .F7D0                not eax


左下角显示如下:
00525E3460 E8 00 00 00 00 00 00`?.....         //★把这里"60 E8" 改为 "EB FE"
00525E3C00 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:
7C802219      53                  push ebx
7C80221A      8B5D 14               mov ebx,dword ptr ss:
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:

然后再按一次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:
7C85A274      8D45 F8               lea eax,dword ptr ss:
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:
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:,al
0050F004      0000                  add byte ptr ds:,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:
7C810837      FF75 18               push dword ptr ss:
7C81083A      FF75 14               push dword ptr ss:
7C81083D      FF75 10               push dword ptr ss:
7C810840      FF75 0C               push dword ptr ss:
7C810843      FF75 08               push dword ptr ss:
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:
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:,al
00401C14      50                  push eax
00401C15      0000                  add byte ptr ds:,al
00401C17      0030                  add byte ptr ds:,dh
00401C19      0000                  add byte ptr ds:,al

打开 lordPE 选中子进程-右键-"完整转存" 保存为dumped.exe

运行 Import REC 选中子进程-OEP:00001C08 - "IAT AutoSearch"    CUT无效指针~~

修复文件~~ ok 试运行程序晕,提示未找到 "ArmAccess.dll" (这个是arm壳中自带的)我们复制一个放到程序中运行,看看~~
ok,一切正常,没有未注册提示了~~~~

PEID探测-- Microsoft Visual Basic 5.0 / 6.0

www.chinapyg.com 版权所有!

收工!

【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

RegKiller 发表于 2006-3-26 18:22:45

呵呵。出手了。判你个坚强软件罪。

野猫III 发表于 2006-3-26 18:24:24

第一个顶上,多谢老大!

西岭秋风 发表于 2006-3-27 10:42:10

收下先.学习,学习

shatan 发表于 2006-3-27 16:30:17

下个动画教程,慢慢学

vivian 发表于 2006-3-27 18:51:47

感谢老大~

yunfeng 发表于 2006-3-29 06:52:33

很想学脱ARM壳,但总找不到好方法,现在这方面的教程也慢慢多了起来,先跟着学习一下.谢谢楼主分享!

cha23 发表于 2006-3-30 20:47:33

好文,出手不凡

Nisy 发表于 2006-4-1 07:45:27

待会过来学习~

hyd009 发表于 2006-4-10 20:16:32

学习,用飘云兄的方法轻松脱去 统一清理6.0 的壳,爽
页: [1] 2 3 4 5 6 7 8
查看完整版本: Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks 脱壳分析[快速!]