飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 38417|回复: 72

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

[复制链接]
  • TA的每日心情
    难过
    4 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2006-3-26 17:11:39 | 显示全部楼层 |阅读模式
    【破文标题】Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks 双进程脱壳分析[快速!]
    【破文作者】飘云[PYG]
    破解平台】WinXp
    【作者邮箱】piaoyun04@163.com
    【软件名称】Easy DVD to DivX/VCD/SVCD Converter 3.0.26
    【下载地址】http://www.easydvdcdburner.com/d ... DVDConverterPro.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/viewthr ... &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:[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

    www.chinapyg.com 版权所有!

    收工!

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

    该用户从未签到

    发表于 2006-3-26 18:22:45 | 显示全部楼层
    呵呵。出手了。判你个坚强软件罪。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-5-6 16:27
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2006-3-26 18:24:24 | 显示全部楼层
    第一个顶上,多谢老大!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-3-27 10:42:10 | 显示全部楼层
    收下先.学习,学习
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-3-27 16:30:17 | 显示全部楼层
    下个动画教程,慢慢学
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-3-27 18:51:47 | 显示全部楼层
    感谢老大~
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2019-3-25 06:30
  • 签到天数: 1096 天

    [LV.10]以坛为家III

    发表于 2006-3-29 06:52:33 | 显示全部楼层
    很想学脱ARM壳,但总找不到好方法,现在这方面的教程也慢慢多了起来,先跟着学习一下.谢谢楼主分享!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-11-22 21:56
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2006-3-30 20:47:33 | 显示全部楼层
    好文,出手不凡
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-4-1 07:45:27 | 显示全部楼层
    待会过来学习~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-4-10 20:16:32 | 显示全部楼层
    学习,用飘云兄的方法轻松脱去 统一清理6.0 的壳,爽
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表