【文章标题】: 脱Armadillo以及ArmInline使用
【文章作者】: Winter[CZG][D.4s][BCG]
【软件名称】: *BLocalize
【下载地址】: 国产软件,不便公布
【加壳方式】: Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
【使用工具】: OD,ArmInline,ArmadilloFindProtected,Peid,ImpRec,lordpe,peditor
【操作平台】: Win2003
【软件介绍】: 是个汉化工具
【作者声明】: 只是学习脱Armadillo以及ArmInline使用,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  脱壳参考了fly大侠的"ArmInline——Armadillo客户版Code Splicing+Import Table Elimination的简便修复方法"以及cyto大侠的"[Armadillo][Import Table Elimination+Code Splicing]WebCrypt Pro 2000 v5 "在这里向他们致敬。

引用:   !- Protected Armadillo  
  <Protection Options>
  Debug-Blocker
  Enable Import Table Elimination
  Enable Strategic Code Splicing
  Enable Nanomites Processing  
  <Backup Key Options>
  Fixed Backup Keys  
  <Compression Options>
  Better/Slower Compression

  
  【寻找OEP】
  OD载入,停在这里:
  00A6AC43 >/$  55            PUSH EBP
  00A6AC44  |.  8BEC          MOV EBP,ESP
  00A6AC46  |.  6A FF         PUSH -1
  00A6AC48  |.  68 903FA900   PUSH VBLocali.00A93F90
  00A6AC4D  |.  68 80A9A600   PUSH VBLocali.00A6A980                   ;  SE 处理程序安装
  
  下断:bp OpenMutexA,F9一次,关注一下堆栈:
  0012F7A4   0012FDD8  ASCII "CE4::DAC4137318"
  
  然后ctrl+G来到401000,写入如下代码:
  00401000    60              PUSHAD                                     //这里新建EIP
  00401001    9C              PUSHFD
  00401002    68 D8FD1200     PUSH 12FDD8                              ; //这里是堆栈看到的 ASCII "CE4::DAC4137318"
  00401007    33C0            XOR EAX,EAX
  00401009    50              PUSH EAX
  0040100A    50              PUSH EAX
  0040100B    E8 105A417C     CALL kernel32.CreateMutexA
  00401010    9D              POPFD
  00401011    61              POPAD
  00401012  - E9 1062417C     JMP kernel32.OpenMutexA
  00401017    90              NOP
  
  二进制代码:60 9C 68 D8 FD 12 00 33 C0 50 50 E8 10 5A 41 7C 9D 61 E9 10 62 41 7C 90
  
  F9一次断下后取消断点,下断bp GetModuleHandleA+5,然后观察堆栈:
  0012EF2C  /0012EF64
  0012EF30  |773D7FF9  返回到 773D7FF9 来自 kernel32.GetModuleHandleA
  0012EF34  |77372E84  ASCII "kernel32.dll"
  
  0012EF70  /0012EF90
  0012EF74  |773D5246  返回到 773D5246 来自 kernel32.GetModuleHandleA
  0012EF78  |77372E84  ASCII "kernel32.dll"
  0012EF7C  |7C8284FF  kernel32.GetProcessHeap
  
  0012F738  /0012F7A0
  0012F73C  |00A558F3  返回到 VBLocali.00A558F3 来自 kernel32.GetModuleHandleA
  0012F740  |00000000
  0012F744  |7C82B3C8  返回到 kernel32.7C82B3C8 来自 ntdll.ZwOpenMutant
  
  00129524  /0012EC6C
  00129528  |01317105  返回到 01317105 来自 kernel32.GetModuleHandleA
  0012952C  |0132BC1C  ASCII "kernel32.dll"
  00129530  |0132CEC4  ASCII "VirtualAlloc"
  
  00129524  /0012EC6C
  00129528  |01317122  返回到 01317122 来自 kernel32.GetModuleHandleA
  0012952C  |0132BC1C  ASCII "kernel32.dll"
  00129530  |0132CEB8  ASCII "VirtualFree"      //到这里注意,shift+F9经过一次异常
  
  00129288  /00129528
  0012928C  |01305FC9  返回到 01305FC9 来自 kernel32.GetModuleHandleA
  00129290  |001293DC  ASCII "kernel32.dll"     //取消断点,alt+F9返回
  
  01305FE3    FF15 BC623201   CALL DWORD PTR DS:[13262BC]              ; kernel32.LoadLibraryA
  01305FE9    8B0D AC403301   MOV ECX,DWORD PTR DS:[13340AC]
  01305FEF    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
  01305FF2    A1 AC403301     MOV EAX,DWORD PTR DS:[13340AC]
  01305FF7    391C06          CMP DWORD PTR DS:[ESI+EAX],EBX
  01305FFA    0F84 2F010000   JE 0130612F                           //Magic Jump ,改成JMP,然后往下找
  
  01306144   /EB 03           JMP SHORT 01306149                    //在这里下个断点,运行断下后撤消刚刚的修改
  01306146   |D6              SALC
  01306147   |D6              SALC
  
  继续下断:bp GetCurrentThreadId
  00128DE4   76084546  /CALL 到 GetCurrentThreadId 来自 MSASN1.76084540
  
  00128DF4   779F8D5A  /CALL 到 GetCurrentThreadId 来自 WININET.779F8D54
  
  00128E20   71B110B6  /CALL 到 GetCurrentThreadId 来自 WSOCK32.71B110B0
  
  00128DD4   755BACDC  /CALL 到 GetCurrentThreadId 来自 MFC42.755BACD6
  
  0012F720   013063D4  /CALL 到 GetCurrentThreadId 来自 013063CE       //这样可以取消断点返回了
  
  013063D4    50              PUSH EAX                                 //回到这里
  013063D5    FF75 FC         PUSH DWORD PTR SS:[EBP-4]
  013063D8    E8 05000000     CALL 013063E2
  013063DD    83C4 0C         ADD ESP,0C
  013063E0    C9              LEAVE
  013063E1    C3              RETN                                    //单步开始跟
  
  0131F9D9    8B50 60         MOV EDX,DWORD PTR DS:[EAX+60]
  0131F9DC    3350 44         XOR EDX,DWORD PTR DS:[EAX+44]
  0131F9DF    3350 1C         XOR EDX,DWORD PTR DS:[EAX+1C]
  0131F9E2    2BCA            SUB ECX,EDX
  0131F9E4    FFD1            CALL ECX                                 //跟到这里,F7进去,到了OEP
  0131F9E6    8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX
  
  00468B8A    55              PUSH EBP                               //就是这里了
  00468B8B    8BEC            MOV EBP,ESP
  00468B8D    6A FF           PUSH -1
  00468B8F    68 40A75100     PUSH VBLocali.0051A740
  
  【修复Strategic Code Splicing】
  如果你使用老版本的Arminline,接下来的东西要自己找,新版的会自动找:)
  首先打开OD菜单,附加进程,找到这个:未命名的窗口, 条目 32
   进程=00000A94
   名称=*BLocalize
  记下ID,alt+M打开内存窗口,找到401000那行,记下大小10E000,打开ArmInline,选择进程并填入刚刚得到的信息。
 
  回到OD,ctrl+B,填入E9,勾选寻找,找到这里:
  0040100F  - E9 ECEFBD03     JMP 03FE0000      //注意,这个数字每次都在变
  仍旧alt+M打开内存窗口,找到这个段以及它的大小,填入窗口:
  AMEMORY, 条目 69
   地址=03FE0000
   大小=00020000 (131072.)
   属主=         03FE0000 (自身)
   区段=
   类型=Priv 00021020
   访问=R E
   初始访问=RWE
  
  点击"Remove Splice",修复完成以后进入下一步,如果出错,请多试几次,也有可能要从头来。
 
  
  【修复Import Table Elimination】
  随便找个函数调用,可以看到输入表,在命令行输入dd 389118,注意找上下界,很容易可以发现rva:3883f0 大小:16C8
  要为ArmInlie找个空白地方写输入表,Alt+M,选择这个:
  AMEMORY, 条目 24
   地址=0050F000
   大小=0002E000 (188416.)
   属主=VBLocali 00400000
   区段=.rdata
   类型=Imag 01001002
   访问=R
   初始访问=RWE
  双击打开,查找kernel32.dll,不要选整个块,发现00539DDC是个好地方:
  00539DCC  4B 45 52 4E 45 4C 33 32 2E 64 6C 6C 00 00 00 00  KERNEL32.dll....
  00539DDC  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  00539DEC  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  00539DFC  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  
  在ArmInline填入相关信息后点击"Rebase IAT"按钮,一会就修好了。
 
  
  【脱壳,修复】
  Nanomites保护似乎没有出现,到这里可以用lordpe脱壳了,然后打开ImpRec,选择进程,OEP填入:00068B8A,自动搜索,获得输入表完全有效,修复。
  修复完可以运行,删除reloc,reloc1,vmp0,text1区段后重建程序,可以运行,到此结束。
  脱壳后文件没有次数限制了,但似乎仍有功能限制,是arm带key的程序,无key脱了功能也不完整,鉴于国产软件,不讨论为妙。
  
--------------------------------------------------------------------------------


                                                       Winter[CZG][D.4s][BCG]
                                                       2006年05月21日 14:51:49