- UID
- 31971
注册时间2007-5-6
阅读权限10
最后登录1970-1-1
周游历练

该用户从未签到
|
【破文标题】Private Exe Protector V2.0脱壳
【破文作者】tangxiaodao
【作者邮箱】[email protected]
【作者主页】dtxd.vicp.net QQ: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:[EBX]
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:[46C39C]
0046A959 8B00 MOV EAX,DWORD PTR DS:[EAX]
0046A95B E8 2CDBFEFF CALL 0045848C
0046A960 A1 9CC34600 MOV EAX,DWORD PTR DS:[46C39C]
大家看到了吧!很明显是delphi程序的入口点,这不就是OEP了嘛!然后dump出来,此时用ImportREC修复,出
现问题了,找不到IAT地址了.看来IAT加密了,咋办?当然是找IAT的真实地址了。
3.寻找IAT地址,这步也不是很难
用HexWorkShop打开加壳程序,拉到最后,如下图:

大家看到KerNel32.dll ExitProcess这样的东东了
吧,然后记下前面的地址。在OD中到这个地址,然后向上翻翻,找到类似 Call xxxxxx ,JMP xxxxxx类似
的东东,因为delphi的程序的特殊性,所以我找到的call如下:
00587F81 E8 0E50A4B0 CALL B0FCCF94
00587F86 2E:2986 C08E1F5>SUB DWORD PTR CS:[ESI+531F8EC0],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:[EAX+A322AA47],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:[ESP]
004826AC A3 08403900 MOV DWORD PTR DS:[394008],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:[399148] ; kernel32.CreateFileA
0048106E 8BC0 MOV EAX,EAX
00481070 - FF25 44913900 JMP DWORD PTR DS:[399144] ; kernel32.GetFileType
00481076 8BC0 MOV EAX,EAX
00481078 - FF25 40913900 JMP DWORD PTR DS:[399140] ; kernel32.GetFileSize
0048107E 8BC0 MOV EAX,EAX
00481080 - FF25 3C913900 JMP DWORD PTR DS:[39913C] ;
kernel32.GetStdHandle
00481086 8BC0 MOV EAX,EAX
00481088 - FF25 38913900 JMP DWORD PTR DS:[399138] ;
kernel32.RaiseException
0048108E 8BC0 MOV EAX,EAX
00481090 - FF25 34913900 JMP DWORD PTR DS:[399134] ; kernel32.ReadFile
00481096 8BC0 MOV EAX,EAX
00481098 - FF25 30913900 JMP DWORD PTR DS:[399130] ; ntdll.RtlUnwind
0048109E 8BC0 MOV EAX,EAX
004810A0 - FF25 2C913900 JMP DWORD PTR DS:[39912C] ;
kernel32.SetEndOfFile
004810A6 8BC0 MOV EAX,EAX
004810A8 - FF25 28913900 JMP DWORD PTR DS:[399128] ;
kernel32.SetFilePointer
004810AE 8BC0 MOV EAX,EAX
004810B0 - FF25 24913900 JMP DWORD PTR DS:[399124] ;
kernel32.UnhandledExceptionFilter
004810B6 8BC0 MOV EAX,EAX
004810B8 - FF25 20913900 JMP DWORD PTR DS:[399120] ; kernel32.WriteFile
004810BE 8BC0 MOV EAX,EAX
004810C0 - FF25 1C913900 JMP DWORD PTR DS:[39911C] ; kernel32.ExitProcess
这不正是我们想到的东东嘛!然后随便选一个JMP在数据窗口中跟随,如下:
00499148 7C801A24 kernel32.CreateFileA
0049914C 7C809B47 kernel32.CloseHandle
00499150 00000000
00499154 77D3119B user32.GetKeyboardType
00499158 77D5058A user32.MessageBoxA
0049915C 00000000
00499160 77DA7883 ADVAPI32.RegQueryValueExA
00499164 77DA761B ADVAPI32.RegOpenKeyExA
00499168 77DA6BF0 ADVAPI32.RegCloseKey
0049916C 00000000
00499170 770F4880 oleaut32.SysFreeString
00499174 771244AD oleaut32.SysReAllocStringLen
00499178 770F4BA7 oleaut32.SysAllocStringLen
0049917C 00000000
00499180 7C809BC5 kernel32.TlsSetValue
00499184 7C809740 kernel32.TlsGetValue
00499188 7C8136D7 kernel32.TlsFree
0049918C 7C812D9F kernel32.TlsAlloc
00499190 7C80992F kernel32.LocalFree
00499194 7C80998D kernel32.LocalAlloc
......
嘿。。大家轻松快活地去IAT的起始地址和结束地址去吧!
4.ImportREC修复程序
OEP找到了 RVA知道了 大小知道了 全部输入->获得输入信息,全部有效->修复抓取文件!
OK!脱壳完毕!
********************本脱文出自原创,如需转载,请注明出处,谢谢!**********************
[ 本帖最后由 tangxiaodao 于 2008-7-8 20:49 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入我们
x
|