【脱壳作者】 HBQJXHW
【使用工具】 OllyDBG ,LordPE,ImportREC v1.6F,PEiD v0.94,FI 4.01a
【脱壳平台】 WinXP SP2
【软件名称】 水煮新概念英语第一册
【加壳方式】 Armadillo v3.00
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【脱壳内容】
一、准备工作
老规矩设置Ollydbg忽略所有异常,用IsDebug 1.4插件去掉Ollydbg的调试器标志。
1 侦壳:用PEiD查壳 Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks [Overlay]
我们再用FI 4.01a 查一下 显示为 Armadillo 3.00 {glue}
2 判断进程:启动程序。然后在 Windows 任务管理器或LordPE里查看是单进程的Armadillo还是双进程的。
这个程序是单进程的,这里可以省略分离进程的过程。
二 、脱壳
OD载入
0055D049 >/$ 55 PUSH EBP ; 停在这里
0055D04A |. 8BEC MOV EBP,ESP
0055D04C |. 6A FF PUSH -1
0055D04E |. 68 48225800 PUSH sznce1.00582248
0055D053 |. 68 90CA5500 PUSH sznce1.0055CA90 ; SE 处理程序安装
0055D058 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
1 避开IAT加密
下断点HE GetModuleHandleA
按F9运行中断后,看堆栈:
00012FF38 0055D111 /CALL 到 GetModuleHandleA 来自 sznce1.0055D10B
0012FF3C 00000000 \pModule = NULL
0012ED4C 77F45BB0 /CALL 到 GetModuleHandleA 来自 77F45BAA
0012ED50 77F44FF4 \pModule = "KERNEL32.DLL"
0012E540 5D175394 /CALL 到 GetModuleHandleA 来自 5D17538E
0012E544 5D1753E0 \pModule = "kernel32.dll"
0012F560 00553073 /CALL 到 GetModuleHandleA 来自 sznce1.0055306D
0012F564 00000000 \pModule = NULL
0012D28C 00D1519B /CALL 到 GetModuleHandleA 来自 00D15195
0012D290 0012D3C8 \pModule = "kernel32.dll" ; 注意!在这里清除硬件断点后Alt+F9返回程序
这里如果说的不对就请大侠们指教了。
00D1519B 8B0D 80D7D300 MOV ECX,DWORD PTR DS:[D3D780] ; 返回到这里
00D151A1 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00D151A4 A1 80D7D300 MOV EAX,DWORD PTR DS:[D3D780]
00D151A9 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI
00D151AC 75 16 JNZ SHORT 00D151C4
00D151AE 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
00D151B4 50 PUSH EAX
00D151B5 FF15 B850D300 CALL DWORD PTR DS:[D350B8] ; kernel32.LoadLibraryA
00D151BB 8B0D 80D7D300 MOV ECX,DWORD PTR DS:[D3D780]
00D151C1 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00D151C4 A1 80D7D300 MOV EAX,DWORD PTR DS:[D3D780]
00D151C9 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI
00D151CC 0F84 AD000000 JE 00D1527F ; 改成为 JMP 00D1527F 修改这是为了避开IAT加密
00D151D2 33C9 XOR ECX,ECX
00D151D4 8B03 MOV EAX,DWORD PTR DS:[EBX]
00D151D6 3938 CMP DWORD PTR DS:[EAX],EDI
00D151D8 74 06 JE SHORT 00D151E0
00D151DA 41 INC ECX
00D151DB 83C0 0C ADD EAX,0C
00D151DE ^ EB F6 JMP SHORT 00D151D6
2 寻找入口点
I、继续下断点 bp GetCurrentThreadId
按F9运行中断后,看堆栈:
0012CB4C 73391E36 /CALL 到 GetCurrentThreadId 来自 73391E30
0012CB2C 7339353F /CALL 到 GetCurrentThreadId 来自 73393539
0012CD90 76DB3705 /CALL 到 GetCurrentThreadId 来自 76DB36FF
0012CDA0 76685F1A /CALL 到 GetCurrentThreadId 来自 wininet.76685F14
0012F5AC 00D2CF47 /CALL 到 GetCurrentThreadId 来自 00D2CF41 ; 注意!在这里清除断点后Alt+F9返回程序
我判断返回的经验是00D2CF41跟上面跨段很大。前面都是7开头的,而这个是00D 开始的。
这里如果说的不对就请大侠们指教了。
00D2CF47 A3 8C16D400 MOV DWORD PTR DS:[D4168C],EAX ; 返回到这里。F8单步向下走
00D2CF4C E8 5F85FEFF CALL 00D154B0
00D2CF51 6A 00 PUSH 0
00D2CF53 E8 51E0FEFF CALL 00D1AFA9
00D2CF58 59 POP ECX
00D2CF59 E8 074CFFFF CALL 00D21B65
00D2CF5E 8BF8 MOV EDI,EAX
00D2CF60 A1 8016D400 MOV EAX,DWORD PTR DS:[D41680]
00D2CF65 8B48 60 MOV ECX,DWORD PTR DS:[EAX+60]
00D2CF68 3348 28 XOR ECX,DWORD PTR DS:[EAX+28]
00D2CF6B 3348 04 XOR ECX,DWORD PTR DS:[EAX+4]
00D2CF6E 03F9 ADD EDI,ECX
00D2CF70 8B0E MOV ECX,DWORD PTR DS:[ESI]
00D2CF72 85C9 TEST ECX,ECX
00D2CF74 75 2F JNZ SHORT 00D2CFA5
00D2CF76 8B78 60 MOV EDI,DWORD PTR DS:[EAX+60]
00D2CF79 E8 E74BFFFF CALL 00D21B65
00D2CF7E 8B0D 8016D400 MOV ECX,DWORD PTR DS:[D41680] ; sznce1.0057F238
00D2CF84 FF76 14 PUSH DWORD PTR DS:[ESI+14]
00D2CF87 8B51 28 MOV EDX,DWORD PTR DS:[ECX+28]
00D2CF8A FF76 10 PUSH DWORD PTR DS:[ESI+10]
00D2CF8D 3351 04 XOR EDX,DWORD PTR DS:[ECX+4]
00D2CF90 FF76 0C PUSH DWORD PTR DS:[ESI+C]
00D2CF93 33D7 XOR EDX,EDI
00D2CF95 03C2 ADD EAX,EDX
00D2CF97 8B51 58 MOV EDX,DWORD PTR DS:[ECX+58]
00D2CF9A 3351 34 XOR EDX,DWORD PTR DS:[ECX+34]
00D2CF9D 33D7 XOR EDX,EDI
00D2CF9F 2BC2 SUB EAX,EDX
00D2CFA1 FFD0 CALL EAX
00D2CFA3 EB 25 JMP SHORT 00D2CFCA
00D2CFA5 83F9 01 CMP ECX,1
00D2CFA8 75 22 JNZ SHORT 00D2CFCC
00D2CFAA FF76 04 PUSH DWORD PTR DS:[ESI+4]
00D2CFAD FF76 08 PUSH DWORD PTR DS:[ESI+8]
00D2CFB0 6A 00 PUSH 0
00D2CFB2 E8 AE4BFFFF CALL 00D21B65
00D2CFB7 50 PUSH EAX
00D2CFB8 A1 8016D400 MOV EAX,DWORD PTR DS:[D41680]
00D2CFBD 8B48 60 MOV ECX,DWORD PTR DS:[EAX+60]
00D2CFC0 3348 58 XOR ECX,DWORD PTR DS:[EAX+58]
00D2CFC3 3348 34 XOR ECX,DWORD PTR DS:[EAX+34]
00D2CFC6 2BF9 SUB EDI,ECX
00D2CFC8 FFD7 CALL EDI ; 真正的OEP,F7进去
00D2CFCA 8BD8 MOV EBX,EAX
00D2CFCC 5F POP EDI
00D2CFCD 8BC3 MOV EAX,EBX
00D2CFCF 5E POP ESI
00D2CFD0 5B POP EBX
00D2CFD1 C3 RETN
0052DD3C 55 PUSH EBP ; 进来后这就是入口了。
0052DD3D 8BEC MOV EBP,ESP
0052DD3F 83C4 F0 ADD ESP,-10
0052DD42 53 PUSH EBX
0052DD43 B8 84D85200 MOV EAX,sznce1.0052D884
0052DD48 E8 EF91EDFF CALL sznce1.00406F3C
0052DD4D 8B1D C40F5300 MOV EBX,DWORD PTR DS:[530FC4] ; sznce1.00532C14
0052DD53 8B03 MOV EAX,DWORD PTR DS:[EBX]
0052DD55 E8 FEA3F5FF CALL sznce1.00488158
II、也可使用内存访问断点法,可以直接到OEP。
内存映射, 条目 23
地址=00401000
大小=0012D000 (1232896.)
属主=sznce1 00400000
区段=CODE
类型=Imag 01001002
访问=R
初始访问=RWE
三、修复IAT
现在可以用 LordPE DUMP了。完整转存后用 ImportREC v1.6F 修复IAT,OEP处填0012DD3C 自动搜索IAT 获取输入表 显示无效函数
把无效指针全部CUT掉。修复抓取文件。OK!
用PEiD查一下为: Borland Delphi 6.0 - 7.0
运行脱壳的文件可以运行。
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法