• 标 题:Ultra Protect[终极保镖] V1.06 脱壳+修复——UProtect.exe 主程序
  • 作 者:fly
  • 时 间:004-05-13,01:16
  • 链 接:http://bbs.pediy.com

                
软件大小:  440 KB
软件语言:  简体中文
软件类别:  国产软件 / 共享版 / 加密工具
应用平台:  Win9x/NT/2000/XP
推荐等级:  ***
开 发 商:  http://www.ultraprotect.com/
软件介绍:  软件保护系统,保护软件使用RSA1024位的注册码系统防止软件被写出注册机,可以设置内嵌的加密器(针对delphi &vc&BCB)使得脱壳之后无法运行,双向的API系统使得外壳顺利和被保护程序通讯。使用变形技术让每次加密生成的代码都不同。变形技术结合反跟踪防止程序跟踪和反汇编。
           
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
           
【调试环境】:WinXP、flyODBG、PEiD、LordPE、ImportREC
           
————————————————————————————————— 
【脱壳过程】:
          
         
Ultra Protect[终极保镖]是risco先生的大作ACProtect壳以前的名字。现在PEiD侦测ACProtector加壳的程序显示“UltraProtect 1.x -> RISCO Software Inc.”而不是ACProtect就是这个原因啦,看来snaker先生应该修正一下这个壳名了。
           
—————————————————————————————————
一、脱壳
           
           
设置flyODBG忽略所有异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。
      

代码:
      004B6000     60                   pushad//进入OD后停在这 004B6001     EB 01                jmp short UProtect.004B6004

           
下断:BP Process32First+1         中断后取消断点,返回程序
           
代码:
77E9A595     55                   push ebp 77E9A596     8BEC                 mov ebp,esp//断在这里 77E9A598     81EC 2C020000        sub esp,22C 77E9A59E     56                   push esi 77E9A59F     8B75 0C              mov esi,dword ptr ss:[ebp+C] 77E9A5A2     85F6                 test esi,esi 77E9A5A4     0F84 94000000        je kernel32.77E9A63E 77E9A5AA     813E 28010000        cmp dword ptr ds:[esi],128 77E9A5B0     0F82 88000000        jb kernel32.77E9A63E 77E9A5B6     53                   push ebx 77E9A5B7     8D85 D4FDFFFF        lea eax,dword ptr ss:[ebp-22C] 77E9A5BD     50                   push eax 77E9A5BE     FF75 08              push dword ptr ss:[ebp+8] 77E9A5C1     C785 D4FDFFFF 2C0200 mov dword ptr ss:[ebp-22C],22C 77E9A5CB     E8 13FFFFFF          call kernel32.Process32FirstW 77E9A64C     C2 0800              retn 8//返回 004B7FD0

           
代码:
004B7FD0     0BC0                 or eax,eax 004B7FD2     0F84 86000000        je UProtect.004B805E 004B7FD8     8DB5 B91D4000        lea esi,dword ptr ss:[ebp+401DB9] 004B7FDE     8BFE                 mov edi,esi 004B7FE0     8A07                 mov al,byte ptr ds:[edi] 004B7FE2     0AC0                 or al,al 004B7FE4     74 12                je short UProtect.004B7FF8

           
使用ESP定律,在12FFAC处的4个字节上下“硬件访问->Word”断点,F9运行
           
代码:
004BBAA9     8BC5                 mov eax,ebp//中断在这里 004BBAAB     E8 25BBFFFF          call UProtect.004B75D5 004BBAB0     FFB5 F96D4000        push dword ptr ss:[ebp+406DF9]; UProtect.00487370//OEP值 004BBAB6     8BE8                 mov ebp,eax 004BBAB8     C3                   retn//飞向光明之巅

           
           
Ultra Protect 还是比较“善良”的,没有Stolen Code,而今ACProtect做了一大堆的Stolen Code。
           
代码:
00487370     55                   push ebp//在这儿用LordPE纠正ImageSize后完全DUMP这个进程 00487371     8BEC                 mov ebp,esp 00487373     83C4 F4              add esp,-0C 00487376     B8 18714800          mov eax,UProtect.00487118 0048737B     E8 80F1F7FF          call UProtect.00406500 00487380     A1 F0744900          mov eax,dword ptr ds:[4974F0] 00487385     8B00                 mov eax,dword ptr ds:[eax] 00487387     E8 18FDFBFF          call UProtect.004470A4

           
           
ACProtect的IAT加密一直没什么变化,弱了点。重新单独运行UProtect.exe,运行ImportREC,选择这个进程。把OEP改为00087370,点IT AutoSearch,点“Get Import”,有2个无效的函数:  
代码:
00406D4C     FF25 74B54900        jmp dword ptr ds:[49B574]; UProtect.004B7123 00401280     FF25 00B24900        jmp dword ptr ds:[49B200]; UProtect.004B7123

大家以前已经分析过了,这里使用了ACProtect的 EMbedded protector 技术,暂时把这2个函数修改为MessageBoxA,最后还要还原其004B7123值的,留待第三步一起处理吧。FixDump,现在可以在本系统上正常运行和加壳了!
           
           
—————————————————————————————————
二、去除加壳后的NAG
           
           
代码:
0047E320     8B45 B8              mov eax,dword ptr ss:[ebp-48] 0047E323     BA E0E64700          mov edx,UnPacked.0047E6E0 0047E328     E8 4F5BF8FF          call UnPacked.00403E7C 0047E32D     0F85 A8000000        jnz UnPacked.0047E3DB//NOP掉 ★ 0047E333     6A 01                push 1 0047E335     A1 04754900          mov eax,dword ptr ds:[497504] 0047E33A     8B00                 mov eax,dword ptr ds:[eax] 0047E33C     B9 FCE64700          mov ecx,UnPacked.0047E6FC; ASCII "By Unregistered UltraProtect" 0047E341     BA FF5F0000          mov edx,5FFF 0047E346     E8 5D0EFDFF          call UnPacked.0044F1A8

           
           
—————————————————————————————————
三、解决脱壳后的程序无法跨系统平台运行的问题
           
           
Ultra Protect和ACProtect的主程序脱壳后有很多无法跨系统平台运行,用了一下午的时间来分析这个问题,在heXer老大以前给予的帮助下解决了这个问题。
           
在“壳中之壳”内有一段代码保存的是其所使用的28个API函数,主程序脱壳后这段函数的地址已经初始化完毕,也就是说现在的地址是脱壳时的系统平台的函数地址,当然无法跨平台了。
           
代码:
004B6EBD  4B 45 52 4E 45 4C 33 32 2E 44 4C 4C 00 47 6C 6F  KERNEL32.DLL.Glo 004B6ECD  62 61 6C 41 6C 6C 6F 63 00 47 6C 6F 62 61 6C 46  balAlloc.GlobalF 004B6EDD  72 65 65 00 47 65 74 43 75 72 72 65 6E 74 50 72  ree.GetCurrentPr 004B6EED  6F 63 65 73 73 49 64 00 43 72 65 61 74 65 54 6F  ocessId.CreateTo 004B6EFD  6F 6C 68 65 6C 70 33 32 53 6E 61 70 73 68 6F 74  olhelp32Snapshot 004B6F0D  00 50 72 6F 63 65 73 73 33 32 46 69 72 73 74 00  .Process32First. 004B6F1D  50 72 6F 63 65 73 73 33 32 4E 65 78 74 00 43 6C  Process32Next.Cl 004B6F2D  6F 73 65 48 61 6E 64 6C 65 00 43 72 65 61 74 65  oseHandle.Create 004B6F3D  46 69 6C 65 41 00 54 65 72 6D 69 6E 61 74 65 50  FileA.TerminateP 004B6F4D  72 6F 63 65 73 73 00 49 73 44 65 62 75 67 67 65  rocess.IsDebugge 004B6F5D  72 50 72 65 73 65 6E 74 00 4F 70 65 6E 50 72 6F  rPresent.OpenPro 004B6F6D  63 65 73 73 00 52 65 61 64 46 69 6C 65 00 57 72  cess.ReadFile.Wr 004B6F7D  69 74 65 46 69 6C 65 00 46 72 65 65 4C 69 62 72  iteFile.FreeLibr 004B6F8D  61 72 79 00 47 65 74 54 65 6D 70 50 61 74 68 41  ary.GetTempPathA 004B6F9D  00 55 6E 68 61 6E 64 6C 65 64 45 78 63 65 70 74  .UnhandledExcept 004B6FAD  69 6F 6E 46 69 6C 74 65 72 00 47 65 74 54 68 72  ionFilter.GetThr 004B6FBD  65 61 64 43 6F 6E 74 65 78 74 00 53 65 74 54 68  eadContext.SetTh 004B6FCD  72 65 61 64 43 6F 6E 74 65 78 74 00 47 65 74 43  readContext.GetC 004B6FDD  75 72 72 65 6E 74 54 68 72 65 61 64 00 55 53 45  urrentThread.USE 004B6FED  52 33 32 2E 44 4C 4C 00 45 6E 75 6D 57 69 6E 64  R32.DLL.EnumWind 004B6FFD  6F 77 73 00 47 65 74 57 69 6E 64 6F 77 54 65 78  ows.GetWindowTex 004B700D  74 41 00 47 65 74 43 6C 61 73 73 4E 61 6D 65 41  tA.GetClassNameA 004B701D  00 50 6F 73 74 4D 65 73 73 61 67 65 41 00 52 45  .PostMessageA.RE 004B702D  54 52 49 56 41 50 49 5A 43 46 00 00 A3 36 E5 77  TRIVAPIZCF...6.w 004B703D  03 38 E5 77 27 76 D1 77 3A C1 D2 77 CC C2 D2 77  .8.w'v.w:..w...w 004B704D  CF 42 D1 77 56 06 E6 77 E7 B1 E9 77 95 A5 E9 77  .B.wV..w...w...w 004B705D  E9 A6 E9 77 63 79 E5 77 37 A8 E5 77 B4 16 E4 77  ...wcy.w7..w...w 004B706D  FD A5 E5 77 93 9F E5 77 D8 05 E6 77 B5 5C E5 77  ...w...w...w.\.w 004B707D  D7 AD D3 77 92 2E E5 77 B7 06 E5 77 82 8B E5 77  ...w...w...w...w 004B708D  8C 9D E5 77 18 06 E6 77 34 AD E4 77 84 9A E9 77  ...w...w4..w...w 004B709D  00 00 00 00 16 7F E7 77 53 99 E9 77 63 31 E5 77  .......wS..wc1.w 004B70AD  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 004B70BD  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 004B70CD  00 00 00 00 00 00 00 00 81 8C E5 77 53 65 74 46  ...........wSetF 004B70DD  69 6C 65 50 6F 69 6E 74 65 72 00 8B 44 24 04 8B  ilePointer..D$..

           
           
学习heXer老大的方法,根据上面的地址,在程序运行前重新初始化。
修改地址:
           
代码:
004B702D  54 52 49 56 41 50 49 5A 43 46 00 00 CA 6E 4B 00  TRIVAPIZCF...nK. 004B703D  D6 6E 4B 00 F5 6F 4B 80 01 70 4B 80 10 70 4B 80  .nK..oK..pK..pK. 004B704D  1E 70 4B 80 E1 6E 4B 00 F5 6E 4B 00 0E 6F 4B 00  .pK..nK..nK..oK. 004B705D  1D 6F 4B 00 2B 6F 4B 00 37 6F 4B 00 43 6F 4B 00  .oK.+oK.7oK.CoK. 004B706D  A2 BE 4B 00 B3 BE 4B 00 C6 BE 4B 00 D5 BE 4B 00  ..K...K...K...K. 004B707D  E3 BE 4B 80 54 6F 4B 00 66 6F 4B 00 72 6F 4B 00  ..K.ToK.foK.roK. 004B708D  7B 6F 4B 00 85 6F 4B 00 91 6F 4B 00 9E 6F 4B 00  {oK..oK..oK..oK. 004B709D  B9 6F 4B 00 B7 6F 4B 00 C8 6F 4B 00 D9 6F 4B 00  .oK..oK..oK..oK.

           
           
Ultra Protect不检测原入口,找一段空地写入以下代码:
           
代码:
004B6000     60                   pushad 004B6001     68 BD6E4B00          push OK.004B6EBD ; ASCII "KERNEL32.DLL" 004B6006     FF15 98B14900        call dword ptr ds:[<&kernel32.GetModuleHandleA>] 004B600C     A3 41644B00          mov dword ptr ds:[4B6441],eax 004B6012     68 EA6F4B00          push OK.004B6FEA ; ASCII "USER32.DLL" 004B6017     FF15 98B14900        call dword ptr ds:[<&kernel32.GetModuleHandleA>] 004B601D     A3 45644B00          mov dword ptr ds:[4B6445],eax 004B6023     BE 39704B00          mov esi,004B7039 004B6028     AD                   lods dword ptr ds:[esi] 004B6029     3D FFFFFFFF          cmp eax,-1 004B602E     74 F8                je short 004B6028 004B6031     85C0                 test eax,eax 004B6033     74 27                je short 004B605C 004B6035     50                   push eax 004B6036     25 00000080          and eax,80000000 004B603B     58                   pop eax 004B603C     8B15 41644B00        mov edx,dword ptr ds:[4B6441] 004B6042     74 06                je short 004B604A 004B6044     8B15 45644B00        mov edx,dword ptr ds:[4B6445] 004B604A     25 FFFFFF7F          and eax,7FFFFFFF 004B604F     50                   push eax 004B6050     52                   push edx 004B6051     FF15 94B14900        call dword ptr ds:[<&kernel32.GetProcAddress>]//重新取得现系统的地址 004B6057     8946 FC              mov dword ptr ds:[esi-4],eax//保存 004B605A     EB CC                jmp short 004B6028 004B605C     B8 23714B00          mov eax,004B7123//下面是还原[49B574]和[49B200]处的值 004B6061     A3 74B54900          mov dword ptr ds:[49B574],eax 004B6066     A3 00B24900          mov dword ptr ds:[49B200],eax 004B606B     61                   popad 004B606C     E9 FF12FDFF          jmp 00487370//处理完毕跳回原OEP

           
           
保存之后,修改OEP=004B6000,OK,现在已经可以跨系统平台正常使用啦。
很累,沉醉于脱壳之中才能感到一丝乐趣。
感谢作者risco先生,不断升级改进的ACProtect壳已经跻身世界级强壳之林了!
           
           
—————————————————————————————————    
代码:
                                          ,     _/          /| _.-~/            \_     ,        青春都一晌        ( /~   /              \~-._ |\        `\\  _/                \   ~\           忍把浮名     _-~~~-.)  __/;;,.          \_  //'   /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        换了破解轻狂  `~ _( ,_..--\ (     ,;'' /    ~--   /._`\    /~~//'   /' `~\          /--.._, _  `~   "  `~"  "      `"      /~'`\    `\\~~\                             "     "   "~'  ""


     Cracked By 巢水工作坊——fly [OCN][FCG][NUKE][DCM]

                2004-05-13  00:00