【文章标题】: 脱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 "在这里向他们致敬。
【寻找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