首页
社区
课程
招聘
水煮新概念英语第一册脱壳学习
发表于: 2006-4-30 08:35 4264

水煮新概念英语第一册脱壳学习

2006-4-30 08:35
4264
【脱壳作者】 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虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
不错,建议再找个难点的Armadillo练练。
2006-4-30 08:47
0
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
3
支持+学习~~
2006-4-30 09:27
0
雪    币: 313
活跃值: (250)
能力值: ( LV9,RANK:650 )
在线值:
发帖
回帖
粉丝
4
最初由 kanxue 发布
不错,建议再找个难点的Armadillo练练。

先接触一下简单的,再接触难一点的。
2006-4-30 22:45
0
游客
登录 | 注册 方可回帖
返回
//