【文章标题】: PEncrypt 3.1 Final脱壳笔记(加去自校验)
【文章作者】: 失望米虫
【软件名称】: QQ登陆器
【软件大小】: 97.0 KB
【下载地址】: 附件
【加壳方式】: PEncrypt 3.1 Final -> junkcode
【保护方式】: 加壳,自校验
【编写语言】: VB
【使用工具】: PEid OD LoadPE ImportRE
【操作平台】: win2003 sp2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
方法一:单步跟踪法
首先,当然是查壳啦
PEid查出为:PEncrypt 3.1 Final -> junkcode
好,OD载入!点"不分析代码!"!
OD停在如下:
004023F4 > B8 882B4600 mov eax, 00462B88
004023F9 FFE0 jmp eax
004023FB C6 ??? ; 未知命令
004023FC 65:E5 BD in eax, 0BD
004023FF 2985 9F5CC73E sub dword ptr [ebp+3EC75C9F], eax
00402405 FA cli
00402406 14 5C adc al, 5C
F8单步一下,是一个Jmp跳 未知命令?再F8,让它跳。OD来到这里:
00462B88 B8 A31946F0 mov eax, F04619A3
00462B8D 55 push ebp
00462B8E 53 push ebx
00462B8F 51 push ecx
00462B90 57 push edi
00462B91 56 push esi
00462B92 52 push edx
好了,开始单步咯,一直F8单步慢慢走,直到来到这里
00462C12 /EB 0C jmp short 00462C20
00462C14 |03CA add ecx, edx
00462C16 |68 00800000 push 8000
00462C1B |6A 00 push 0
00462C1D |57 push edi
00462C1E |FF11 call dword ptr [ecx]
00462C20 \8BC6 mov eax, esi
一个Jmp跳,向下跳的,已实现,不管,再F8单步慢慢向下走!
才走几下,又是一个Jmp,如下:
00462C28 - FFE0 jmp eax ; qqpc.<模块入口点>
00462C2A F4 hlt
00462C2B 2340 00 and eax, dword ptr [eax]
00462C2E 0000 add byte ptr [eax], al
00462C30 0000 add byte ptr [eax], al
是跳到eax的,eax是多少,看下寄存器窗口,eax=004023F4,与00462C28 - FFE0 jmp eax对比,是非常大的跳转!注意啦!
再F8一下,OD来到这里:
004023F4 > 68 0C624100 push 0041620C
004023F9 E8 EEFFFFFF call 004023EC ; jmp 到 MSVBVM60.ThunRTMain
004023FE 0000 add byte ptr [eax], al
00402400 40 inc eax
00402401 0000 add byte ptr [eax], al
00402403 0030 add byte ptr [eax], dh
00402405 0000 add byte ptr [eax], al
00402407 0038 add byte ptr [eax], bh
00402409 0000 add byte ptr [eax], al
0040240B 0000 add byte ptr [eax], al
0040240D 0000 add byte ptr [eax], al
0040240F 006C78 C7 add byte ptr [eax+edi*2-39], ch
这就是经典的VB入口点特征!!
===============附五大语言入口点特征==================
delphi:
55 PUSH EBP
8BEC MOV EBP,ESP
83C4 F0 ADD ESP,-10
B8 A86F4B00 MOV EAX,PE.004B6FA8
vc++
55 PUSH EBP
8BEC MOV EBP,ESP
83EC 44 SUB ESP,44
56 PUSH ESI
vb
FF25 6C104000 JMP DWORD PTR DS:[<&MSVBVM60.#100>] ; MSVBVM60.ThunRTMain
68 147C4000 PUSH PACKME.00407C14
E8 F0FFFFFF CALL <JMP.&MSVBVM60.#100>
0000 ADD BYTE PTR DS:[EAX],AL
0000 ADD BYTE PTR DS:[EAX],AL
0000 ADD BYTE PTR DS:[EAX],AL
3000 XOR BYTE PTR DS:[EAX],AL
bc++
0040163C > $ /EB 10 JMP SHORT BCLOCK.0040164E
0040163E |66 DB 66 ; CHAR 'f'
0040163F |62 DB 62 ; CHAR 'b'
00401640 |3A DB 3A ; CHAR ':'
00401641 |43 DB 43 ; CHAR 'C'
00401642 |2B DB 2B ; CHAR '+'
00401643 |2B DB 2B ; CHAR '+'
00401644 |48 DB 48 ; CHAR 'H'
00401645 |4F DB 4F ; CHAR 'O'
00401646 |4F DB 4F ; CHAR 'O'
00401647 |4B DB 4B ; CHAR 'K'
00401648 |90 NOP
00401649 |E9 DB E9
dasm:
6A 00 PUSH 0 ; /pModule = NULL
E8 C50A0000 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
A3 0C354000 MOV DWORD PTR DS:[40350C],EAX
E8 B50A0000 CALL <JMP.&KERNEL32.GetCommandLineA> ; [GetCommandLineA
A3 10354000 MOV DWORD PTR DS:[403510],EAX
6A 0A PUSH 0A ; /Arg4 = 0000000A
FF35 10354000 PUSH DWORD PTR DS:[403510
==============================================================
方法二:ESP定律法
列行,PEid查壳:PEncrypt 3.1 Final -> junkcode
OK,用OD载入,停在:
004023F4 > B8 882B4600 mov eax, 00462B88
004023F9 FFE0 jmp eax
004023FB C6 ??? ; 未知命令
004023FC 65:E5 BD in eax, 0BD
004023FF 2985 9F5CC73E sub dword ptr [ebp+3EC75C9F], eax
00402405 FA cli
好了,F8单步吧!
四下F8后,停在 00462B8E 53 push ebx
这时,ESP突现!(看寄存器窗口),ESP的值为:0012FFC0
好了,在OD的命令行打入:hr 0012FFC0 回车!!F9运行!这个时候,OD停在如下:
00462C28 - FFE0 jmp eax ; qqpc.<模块入口点>
00462C2A F4 hlt
00462C2B 2340 00 and eax, dword ptr [eax]
00462C2E 0000 add byte ptr [eax], al
00462C30 0000 add byte ptr [eax], al
打开OD菜单:调试—》硬件断点,把硬件断点删除!
看下OD,是不是眼熟一点了?就是那个Jmp啊,F8一下!到OEP!!
LoadPE完整Dump出来,ImportRE修复!!
---------------------------------------
好了!!我这里ImportRE修复出来的是dumped_.exe,双击运行。鼠标动了一下,就没反应了!!再来一次,还是没反应!
经验告诉我,有自校验!再来,把它干掉!
OD载入脱壳后的dumped_.exe,停在:
004023F4 > $ 68 0C624100 push 0041620C
004023F9 . E8 EEFFFFFF call <jmp.&msvbvm60.ThunRTMain>
004023FE . 0000 add byte ptr [eax], al
00402400 . 40 inc eax
00402401 . 0000 add byte ptr [eax], al
00402403 . 0030 add byte ptr [eax], dh
00402405 . 0000 add byte ptr [eax], al
查看过不少VB的自校验文章,不少是说下rtcFileLen这个API断点的
我们也来,在OD的命令行里打入:bpx rtcFileLen 回车!(注意大小写哦!) 好!F9运行,OD断下来了,停在:
00432D54 . FF15 DC114000 call dword ptr [<&msvbvm60.rtcFileLen>; \rtcFileLen
00432D5A . 3D 20E50400 cmp eax, 4E520
00432D5F . 7E 12 jle short 00432D73
00432D61 . C745 FC 05000>mov dword ptr [ebp-4], 5
00432D68 . FF15 3C104000 call dword ptr [<&msvbvm60.__vbaEnd>] ; msvbvm60.__vbaEnd
这里看下堆栈窗口:
0012F964 0016CA0C \FileName = "C:\Documents and Settings\Administrator\",D7,"烂鎈dumped_.exe"
0012F968 0012FB20
0012F96C 0012FBF0
程序在读自己?好,看OD反汇编当前Call的下一行是cmp比较,下一行是跳转,再下两行又是一个call,这个call就是退出程序了(看这个msvbvm60.__vbaEnd)
点一下00432D5F处的跳转,可以看出是跳过程序退出函数的,逆向分析,此跳一定没实现(不信的朋友自己单步跟一下)
好了,这里我们让它实现就可以了把jle改为je,或把cmp一句中的4E520改大,如改为14E520,保存修改!
再次运行,!!OK!程序跑起来了!
--------------------------------------------------------------------------------
【经验总结】
多学习,多练习!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2009年05月28日 16:19:10
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课