tangxiaodao 发表于 2008-7-8 20:38:20

Private Exe Protector V2.0快速脱壳!

【破文标题】Private Exe Protector V2.0脱壳
【破文作者】tangxiaodao
【作者邮箱】[email protected]
【作者主页】dtxd.vicp.netQQ:172751148
【破解工具】PEID V0.94,DeFixed,LoadPE,ImportREC
【破解平台】Window XP sp2
【软件名称】某一国产外挂(在这里同大家交流脱壳方法,所以软件就不说了)
【原版下载】不提供下载地址了
【保护方式】Private exe Protector V2.0 -> SetiSoft Team *
【作者声明】我是菜鸟。偶遇一点脱壳心得,愿与大家分享。
【详细过程】
1.首先查壳:Private exe Protector V2.0 -> SetiSoft Team *据说此壳很猛(关于壳的介绍大家
可以到百度,GooGle上面找),但有所心不甘,就信手动之。
2.寻找OEP,这步比较容易.
   OD载入(我用的是DeFixed版本).停在这里:
   
00401000 > $60            PUSHAD
00401001   .61            POPAD
00401002   .89F9          MOV ECX,EDI
00401004   .51            PUSH ECX
00401005   .58            POP EAX
00401006   .89D8          MOV EAX,EBX
00401008   .39F2          CMP EDX,ESI
0040100A   .8D3B          LEA EDI,DWORD PTR DS:
0040100C   .85F2          TEST EDX,ESI
0040100E   .BF 79D7BD2B   MOV EDI,2BBDD779
00401013   .66:9C         PUSHFW
00401015   .66:9D         POPFW
00401017   .29DF          SUB EDI,EBX
00401019   .F7D9          NEG ECX
0040101B   .75 00         JNZ SHORT 0040101D
0040101D   >C1F1 8D       SAL ECX,8D

然后ALT+M打开内存,用内存断点法分次在.rdata.rsrc.data.code段下断并F9运行
其实就是四次内存断点法,最后来到这里

0046A944    55            PUSH EBP
0046A945    8BEC            MOV EBP,ESP
0046A947    83C4 F0         ADD ESP,-10
0046A94A    B8 3CA74600   MOV EAX,0046A73C
0046A94F    E8 94BAF9FF   CALL 004063E8
0046A954    A1 9CC34600   MOV EAX,DWORD PTR DS:
0046A959    8B00            MOV EAX,DWORD PTR DS:
0046A95B    E8 2CDBFEFF   CALL 0045848C
0046A960    A1 9CC34600   MOV EAX,DWORD PTR DS:

大家看到了吧!很明显是delphi程序的入口点,这不就是OEP了嘛!然后dump出来,此时用ImportREC修复,出

现问题了,找不到IAT地址了.看来IAT加密了,咋办?当然是找IAT的真实地址了。

3.寻找IAT地址,这步也不是很难
   用HexWorkShop打开加壳程序,拉到最后,如下图:
https://www.chinapyg.com/attachment.php?aid=34289&nothumb=yes
大家看到KerNel32.dllExitProcess这样的东东了
吧,然后记下前面的地址。在OD中到这个地址,然后向上翻翻,找到类似Call xxxxxx ,JMP xxxxxx类似
的东东,因为delphi的程序的特殊性,所以我找到的call如下:
00587F81    E8 0E50A4B0   CALL B0FCCF94
00587F86    2E:2986 C08E1F5>SUB DWORD PTR CS:,EAX
00587F8D    0D 4BE5D9DA   OR EAX,DAD9E54B
00587F92    40            INC EAX
00587F93    B9 489E10A5   MOV ECX,A5109E48
00587F98    36:D188 47AA22A>ROR DWORD PTR SS:,1
00587F9F    91            XCHG EAX,ECX

在这个call地址下内存访问断点,F9运行,来到这里
0048269F    54            PUSH ESP
004826A0    E8 B3EAFFFF   CALL 00481158                            ; JMP to

kernel32.QueryPerformanceCounter
004826A5    85C0            TEST EAX,EAX
004826A7    74 0B         JE SHORT 004826B4
004826A9    8B0424          MOV EAX,DWORD PTR SS:
004826AC    A3 08403900   MOV DWORD PTR DS:,EAX
004826B1    59            POP ECX
004826B2    5A            POP EDX
004826B3    C3            RET
004826B4    E8 A7EAFFFF   CALL 00481160                            ; JMP to

kernel32.GetTickCount

大家看到后面的注释内容了吧,那是什么?不就是API嘛!选一个call,键盘上按Enter,来到这里
00481068- FF25 48913900   JMP DWORD PTR DS:                ; kernel32.CreateFileA
0048106E    8BC0            MOV EAX,EAX
00481070- FF25 44913900   JMP DWORD PTR DS:                ; kernel32.GetFileType
00481076    8BC0            MOV EAX,EAX
00481078- FF25 40913900   JMP DWORD PTR DS:                ; kernel32.GetFileSize
0048107E    8BC0            MOV EAX,EAX
00481080- FF25 3C913900   JMP DWORD PTR DS:                ;

kernel32.GetStdHandle
00481086    8BC0            MOV EAX,EAX
00481088- FF25 38913900   JMP DWORD PTR DS:                ;

kernel32.RaiseException
0048108E    8BC0            MOV EAX,EAX
00481090- FF25 34913900   JMP DWORD PTR DS:                ; kernel32.ReadFile
00481096    8BC0            MOV EAX,EAX
00481098- FF25 30913900   JMP DWORD PTR DS:                ; ntdll.RtlUnwind
0048109E    8BC0            MOV EAX,EAX
004810A0- FF25 2C913900   JMP DWORD PTR DS:                ;

kernel32.SetEndOfFile
004810A6    8BC0            MOV EAX,EAX
004810A8- FF25 28913900   JMP DWORD PTR DS:                ;

kernel32.SetFilePointer
004810AE    8BC0            MOV EAX,EAX
004810B0- FF25 24913900   JMP DWORD PTR DS:                ;

kernel32.UnhandledExceptionFilter
004810B6    8BC0            MOV EAX,EAX
004810B8- FF25 20913900   JMP DWORD PTR DS:                ; kernel32.WriteFile
004810BE    8BC0            MOV EAX,EAX
004810C0- FF25 1C913900   JMP DWORD PTR DS:                ; kernel32.ExitProcess

这不正是我们想到的东东嘛!然后随便选一个JMP在数据窗口中跟随,如下:
004991487C801A24kernel32.CreateFileA
0049914C7C809B47kernel32.CloseHandle
0049915000000000
0049915477D3119Buser32.GetKeyboardType
0049915877D5058Auser32.MessageBoxA
0049915C00000000
0049916077DA7883ADVAPI32.RegQueryValueExA
0049916477DA761BADVAPI32.RegOpenKeyExA
0049916877DA6BF0ADVAPI32.RegCloseKey
0049916C00000000
00499170770F4880oleaut32.SysFreeString
00499174771244ADoleaut32.SysReAllocStringLen
00499178770F4BA7oleaut32.SysAllocStringLen
0049917C00000000
004991807C809BC5kernel32.TlsSetValue
004991847C809740kernel32.TlsGetValue
004991887C8136D7kernel32.TlsFree
0049918C7C812D9Fkernel32.TlsAlloc
004991907C80992Fkernel32.LocalFree
004991947C80998Dkernel32.LocalAlloc
......
嘿。。大家轻松快活地去IAT的起始地址和结束地址去吧!

4.ImportREC修复程序
   OEP找到了RVA知道了大小知道了全部输入->获得输入信息,全部有效->修复抓取文件!
   OK!脱壳完毕!



********************本脱文出自原创,如需转载,请注明出处,谢谢!**********************

[ 本帖最后由 tangxiaodao 于 2008-7-8 20:49 编辑 ]

tangxiaodao 发表于 2008-7-8 20:43:42

自己抢个SF坐坐吧!别人的SF老是抢不到^_^

RegKiller 发表于 2008-7-8 21:21:00

外挂发上来练习一下。呵呵。

风之非觞 发表于 2008-9-2 10:35:04

很好的文章..呵呵

kungbim 发表于 2008-9-2 12:24:22

看这壳的猥琐程度,貌似非PEP加的壳,而到像是PEID识别出错,PEP是一款比较猥琐的壳,这里我用PEP正版加了一个计算器,加密力度:最小(选项除勾选注册NAG作为演示外,其余功能选项均不选):loveliness:

wqhlgr 发表于 2009-1-26 07:32:33

...这壳我都没见过

crunming 发表于 2009-1-26 18:41:39

看这壳的猥琐程度,我根本看不懂

poison_xm 发表于 2009-2-2 19:14:17

我想问高手   内存断点 什么时候用2次什么时候用4次 不会告我要自己一次一次试验吧/:01

poison_xm 发表于 2009-2-2 19:27:56

相当不错啊可是附件的地址怎么看?
页: [1]
查看完整版本: Private Exe Protector V2.0快速脱壳!