好友
阅读权限40
听众
最后登录1970-1-1
|
ps520
发表于 2009-11-20 22:57
本帖最后由 ps520 于 2009-11-20 23:06 编辑
Lipacker是一个软件保护系统,可以保护原作者的软件不被逆向破解,具有
1.调试器检测
2.API重定位封装
3.反进程转储保护
4.删除OEP解
5.安全去除reloc区段
【文章标题】: LIPacker脱壳全过程[LCG]
【文章作者】: Luck
【作者邮箱】: 466748210@qq.com
【作者主页】: www.sooluck.cn
【作者QQ号】: 466748210
【软件名称】: LIPacker
【软件大小】: 381 KB (390,803 字节)
【下载地址】: 见文章附件
【加壳方式】: LIPacker
【保护方式】: LIPacker加壳
【编写语言】: E language
【使用工具】: OllyDbg
【操作平台】: Win Xp Sp2
【软件介绍】: 一个壳子而已
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
由于主程序并未加壳,所以我分析采用了自己编译的一个易语言程序。
全选所有功能,直接进行加壳处理。
加密以后8.75 KB (8,965 字节),只多了0.75kb。让我怀疑这个壳的实力了。
废话不多说,抬出伟大的OD。
004063BB > 60 pushad
004063BC E8 36FEFFFF call 004061F7
004063C1 C3 retn
004063C2 90 nop
004063C3 04 00 add al, 0x0
004063C5 0000 add byte ptr [eax], al
004063C7 24 00 and al, 0x0
入口很性感,Call进retn出。让人浮想联翩~~~~~~
废话太多,直接操刀。这里我们选用OD单步法先解密掉数据先。
F8到
004063BC E8 36FEFFFF call 004061F7
F7进入
004061F7 55 push ebp
004061F8 8BEC mov ebp, esp
004061FA 83C4 D4 add esp, -0x2C
004061FD 53 push ebx
004061FE 56 push esi
004061FF 57 push edi
00406200 8B45 10 mov eax, dword ptr [ebp+0x10]
00406203 83C0 0C add eax, 0xC
00406206 8B00 mov eax, dword ptr [eax]
00406208 8945 DC mov dword ptr [ebp-0x24], eax
0040620B 837D DC 00 cmp dword ptr [ebp-0x24], 0x0
性感,看来只是套了几层皮而已。
单步下去。
00406219 E8 B9FEFFFF call 004060D7
0040621E 8B10 mov edx, dword ptr [eax]
00406220 0355 DC add edx, dword ptr [ebp-0x24]
00406223 8955 E4 mov dword ptr [ebp-0x1C], edx
00406226 83C0 04 add eax, 0x4
00406229 8B10 mov edx, dword ptr [eax]
0040622B 8955 FC mov dword ptr [ebp-0x4], edx
0040622E 83C0 04 add eax, 0x4
API全部出来了,看来离脱壳的时候不远了。看了看数据窗口,全是00000000,不禁有点失望。
00406294 ^\75 DD jnz short 00406273
循环处,下一句F4即可。
继续F8,F8,势不可挡!
0012FF80 004063C3 test.004063C3
0012FF84 7C801AD0 kernel32.VirtualProtect
0012FF88 7C809B14 kernel32.VirtualFree
0012FF8C 7C809A81 kernel32.VirtualAlloc
0012FF90 7C801D77 kernel32.LoadLibraryA
0012FF94 7C80AC28 kernel32.GetProcAddress
0012FF98 7C80B529 kernel32.GetModuleHandleA
0012FF9C 0012FFF0
0012FFA0 004063C1 RETURN to test.004063C1 from test.004061F7
0012FFA4 7C8399F3 RETURN to kernel32.7C8399F3
0012FFA8 7C809A70 kernel32.7C809A70
性感的API全部暴露无遗。
004062C5 /EB 73 jmp short 0040633A
灰机线,长远一跳飞跃三千年。
0040633D ^\75 88 jnz short 004062C7
耍人啊,又往回跳?!
直接下一句F4.
004021A0 ............................
0040635B FF55 EC call dword ptr [ebp-0x14]
可爱的虚拟~
Stack ss:[0012FF84]=7C801AD0 (kernel32.VirtualProtect)
VirtualProtect开始频繁调用,猜想离光明之巅不远了!
7C92EAF0 8B1C24 mov ebx, dword ptr [esp]
7C92EAF3 51 push ecx
7C92EAF4 53 push ebx
7C92EAF5 E8 C78C0200 call 7C9577C1
数据执行完毕,这个Call进去看看。
7C9577C1 8BFF mov edi, edi
7C9577C3 55 push ebp
7C9577C4 8BEC mov ebp, esp
7C9577C6 83EC 64 sub esp, 0x64
7C9577C9 56 push esi
7C9577CA FF75 0C push dword ptr [ebp+0xC]
7C9577CD 8B75 08 mov esi, dword ptr [ebp+0x8]
7C9577D0 56 push esi
7C9577D1 C645 FF 00 mov byte ptr [ebp-0x1], 0x0
0012FBEC 7C9331DC RETURN to ntdll.7C9331DC from ntdll.RtlEnterCriticalSection
0012FBF0 7C933212 RETURN to ntdll.7C933212 from ntdll.7C92EE02
0012FBF4 7C933281 RETURN to ntdll.7C933281 from ntdll.RtlLeaveCriticalSection
0012FBF8 7C933288 RETURN to ntdll.7C933288 from ntdll.7C92EE02
0012FBFC 00000000
0012FC00 00000000
0012FC04 00000000
0012FC08 0012FEB0 UNICODE "est.exe"
0012FC0C 0012FBFC
0012FC10 7C9363A8 ntdll.7C9363A8
0012FC14 0012FEB0 UNICODE "est.exe"
0012FC18 7C92EE18 ntdll.7C92EE18
0012FC1C 7C933290 ntdll.7C933290
病毒?还est.exe?
7C95785B E8 F3BEFCFF call 7C923753
这一句程序就飞了,于是下断F2,然后Ctrl+F2,F9继续。
F7步入~
7C923753 BA D837927C mov edx, 7C9237D8
7C923758 EB 0D jmp short 7C923767
7C92375A 90 nop
7C92375B 90 nop
7C92375C 90 nop
7C92375D 90 nop
7C92375E 90 nop
7C92375F 90 nop
7C923760 BA 0438927C mov edx, 7C923804
7C923765 8D09 lea ecx, dword ptr [ecx]
7C923767 53 push ebx
柳暗花明又一村:
7C923767 53 push ebx
7C923768 56 push esi
7C923769 57 push edi
7C92376A 33C0 xor eax, eax
7C92376C 33DB xor ebx, ebx
7C92376E 33F6 xor esi, esi
7C923770 33FF xor edi, edi
7C923772 FF7424 20 push dword ptr [esp+0x20]
7C923776 FF7424 20 push dword ptr [esp+0x20]
7C92377A FF7424 20 push dword ptr [esp+0x20]
7C92377E FF7424 20 push dword ptr [esp+0x20]
7C923782 FF7424 20 push dword ptr [esp+0x20]
7C923786 E8 0E000000 call 7C923799
这个Call小心了,F7进入
7C923799 55 push ebp
7C92379A 8BEC mov ebp, esp
7C92379C FF75 0C push dword ptr [ebp+0xC]
7C92379F 52 push edx
7C9237A0 64:FF35 0000000>push dword ptr fs:[0]
7C9237A7 64:8925 0000000>mov dword ptr fs:[0], esp
7C9237AE FF75 14 push dword ptr [ebp+0x14]
7C9237B1 FF75 10 push dword ptr [ebp+0x10]
7C9237B4 FF75 0C push dword ptr [ebp+0xC]
7C9237B7 FF75 08 push dword ptr [ebp+0x8]
7C9237BA 8B4D 18 mov ecx, dword ptr [ebp+0x18]
进入的桃花源:
7C9237AE FF75 14 push dword ptr [ebp+0x14]
7C9237B1 FF75 10 push dword ptr [ebp+0x10]
7C9237B4 FF75 0C push dword ptr [ebp+0xC]
7C9237B7 FF75 08 push dword ptr [ebp+0x8]
7C9237BA 8B4D 18 mov ecx, dword ptr [ebp+0x18]
7C9237BD FFD1 call ecx ; test.00401000
7C9237BF 64:8B25 0000000>mov esp, dword ptr fs:[0]
7C9237C6 64:8F05 0000000>pop dword ptr fs:[0]
7C9237CD 8BE5 mov esp, ebp
7C9237CF 5D pop ebp
7C9237D0 C2 1400 retn 0x14
这里我们来讲下为什么这几个Call要进入。
7C95785B E8 F3BEFCFF call 7C923753
这里跑飞,说明里面执行了程序代码,于是可以得出必有一个call是执行程序的。
又因为代码只有一个call,下面语句为return,所以可以得出这个call必须进。
OK,我们看这段代码:
7C9237AE FF75 14 push dword ptr [ebp+0x14]
7C9237B1 FF75 10 push dword ptr [ebp+0x10]
7C9237B4 FF75 0C push dword ptr [ebp+0xC]
7C9237B7 FF75 08 push dword ptr [ebp+0x8]
7C9237BA 8B4D 18 mov ecx, dword ptr [ebp+0x18]
7C9237BD FFD1 call ecx 'call 注意,是test.00401000。 ; test.00401000
7C9237BF 64:8B25 0000000>mov esp, dword ptr fs:[0]
7C9237C6 64:8F05 0000000>pop dword ptr fs:[0]
7C9237CD 8BE5 mov esp, ebp
7C9237CF 5D pop ebp
7C9237D0 C2 1400 retn 0x14 '返回
在我标注注意的地方,即:
7C9237BD FFD1 call ecx ; test.00401000
后面解释是test.00401000
可别忘了这个地址易常用的入口点。
我们用另一个OD打开刚才的原文件:
00401000 > E8 06000000 call 0040100B
00401005 50 push eax
00401006 E8 BB010000 call <jmp.&kernel32.ExitProcess>
0040100B 55 push ebp
0040100C 8BEC mov ebp, esp
0040100E 81C4 F0FEFFFF add esp, -0x110
00401014 E9 83000000 jmp 0040109C
00401019 6B72 6E 6C imul esi, dword ptr [edx+0x6E], 0x6C
0040101D 6E outs dx, byte ptr es:[edi]
是不?00401000,这个是一个通用的标志。说明这个call进入的是我们期待已久的入口点OEP!!!
F7步入。
最爱的桃花源!
00401000 E8 06000000 call 0040100B
00401005 50 push eax
00401006 E8 BB010000 call 004011C6 ; jmp to kernel32.ExitProcess
0040100B 55 push ebp
0040100C 8BEC mov ebp, esp
0040100E 81C4 F0FEFFFF add esp, -0x110
哈哈!终于到了我们心爱的OEP,直接用插件Dump下来吧!保存为Dump.exe!
执行,完美无缺陷。不过体积大多了,郁闷了……
33.0 KB (33,792 字节)
我们可以随便用个工具优化优化就OK啦。
于是又一款所谓壳子又给秒脱。
总结下这个壳的特点:
1.Anti无强度(或者说StrongOD太强)
2.与程序没有紧密结合(完全将自己作为外壳了……)
3.自身没有什么保护(难怪是免费版)
4.完全没有什么概念(跑飞->下断地址->Ctrl+F2->F9返回跑飞地址->F7)
5.7C9237BD FFD1 call ecx ; test.00401000
6.自己都可以总结脱壳方法
最后封杀这个壳:
OD加载被加壳程序,Alt+E,双击主程序那一行。
比如我的是:Executable modules, item 0
Base=00400000
Size=00008000 (32768.)
Entry=004063BB test.<ModuleEntryPoint>
Name=test
Path=C:\Documents and Settings\Administrator\桌面\test.exe
然后F9,你会发现一个十分惊讶的事实:
所有的函数在这里全部被还原,可以直接脱下!
无语这壳了。
--------------------------------------------------------------------------------
【经验总结】
1.F8单步+F7是很好的办法对于首次接触一个未知壳。可以分析全壳流程。
2.总结经验,永远飞向00401000
3.脱壳完毕需要优化体积,我很郁闷。
4.脱壳是一种艺术,总结是一种可爱的智慧。
5.敢于尝试。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于Luck, 转载请注明作者并保持文章的完整, 谢谢!
2009年11月20日 22:50:25
附件:
LIPacker脱壳附件.rar
(396.06 KB, 下载次数: 21)
|
免费评分
-
查看全部评分
|