吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8278|回复: 12
收起左侧

[分享] LIPacker脱壳全过程[LCG]

[复制链接]
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)

免费评分

参与人数 1威望 +1 收起 理由
CHHSun + 1 感谢发布原创作品,[吾爱破解]因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| ps520 发表于 2009-11-20 22:59
本帖最后由 ps520 于 2009-11-20 23:12 编辑

论坛显示不了破文,郁闷了



---------------------------

终于完整显示了,若有错误之处各位大牛轻点拍砖



此楼接受各种鄙视以及CB
a2213572 发表于 2009-11-21 10:12
最后封杀这个壳:
  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,你会发现一个十分惊讶的事实:
  所有的函数在这里全部被还原,可以直接脱下!
  无语这壳了

不太了解!
8568309 发表于 2009-11-21 10:31
小黑冰 发表于 2009-11-21 11:55
最后封杀这个壳:
  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,你会发现一个十分惊讶的事实:
  所有的函数在这里全部被还原,可以直接脱下!
  无语这壳了


直接看到OEP了````哈哈`````   楼主真行```学习了````
小糊涂虫 发表于 2009-11-21 13:11
2.总结经验,永远飞向00401000?
上个主程序
我加别的程序试一下,如何?
wgz001 发表于 2009-11-21 13:22
太强了   学习下   
 楼主| ps520 发表于 2009-11-21 15:25
附送脚本:

/*
Script written by Luck
Script   : LIPacker
版本     : v1.0
日期     : 2009-11-20
调试环境 : OllyDbg,ODBGScript 1.65, WINXP
工具 : OllyDbg, ODBGScript
感谢 :
LCG
UpK
52pojie
CCTV
……
特别感谢 :师父啊cr、师兄yangjt、师侄starfall、fly、zapline、tale、xiaomajia
*/
msg "LIPacker脱壳脚本 Copyright2009(C)Luck版权所有"
BPHWS 00401000
run
msg "已到达Oep处,请使用Dump插件转存文件!"
msg "事实证明,听春哥的歌的确会变强大!!!"



你说可以直接脱不?
love_wjj 发表于 2009-11-22 12:04
支持一下,谢谢楼主分享!
qq411855 发表于 2009-11-22 14:39
谢谢分享,好好学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-18 02:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表