首页
社区
课程
招聘
[原创]笨笨菜菜脱壳练手二之PECompact 2.5 Retail
发表于: 2006-10-6 00:22 4267

[原创]笨笨菜菜脱壳练手二之PECompact 2.5 Retail

2006-10-6 00:22
4267
[菜菜打杂]笨笨菜菜脱壳练手二之PECompact 2.5 Retail

【破解作者】 EasyStudy

【作者邮箱】 PhantomNet@163.com

【使用工具】 ODICE,LordPE,ImprotREC16F

【破解平台】 Win9x/NT/2000/XP

【软件名称】 PECompact 2.5 Retail加壳的winXP记事本程序

【加壳方式】 PECompact 2.5 Retail加壳

【破解声明】  我是只菜菜鸟,技术不高给新手和想学脱壳的给个示范,希望共同学习!

声明:我是在大大们的基础资料上学习的,谢谢大大们!

PECompact 2.5 Retail -> Jeremy Collake  
PEID探测到是上面的壳,好我们现在来破了它

//OD进入来到这里很陌生...
01001000 >  B8 44AA0101     MOV EAX,NOTEPAD.0101AA44
01001005    50              PUSH EAX
01001006    64:FF35 0000000>PUSH DWORD PTR FS:[0]
0100100D    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
01001014    33C0            XOR EAX,EAX
01001016    8908            MOV DWORD PTR DS:[EAX],ECX
01001018    50              PUSH EAX
01001019    45              INC EBP
0100101A    43              INC EBX
0100101B    6F              OUTS DX,DWORD PTR ES:[EDI]               ; I/O 命令
0100101C    6D              INS DWORD PTR ES:[EDI],DX                ; I/O 命令
0100101D    70 61           JO SHORT NOTEPAD.01001080
0100101F    637432 00       ARPL WORD PTR DS:[EDX+ESI],SI
01001023    5A              POP EDX
01001024    CF              IRETD
01001025    5B              POP EBX

//下断点BP VirtualFree,中断后,取消断点,Ctrl+F9两次:
00400867    C2 0C00         RETN 0C
0040086A    0000            ADD BYTE PTR DS:[EAX],AL
0040086C    50              PUSH EAX
0040086D    0001            ADD BYTE PTR DS:[ECX],AL
0040086F    0000            ADD BYTE PTR DS:[EAX],AL
00400871    0000            ADD BYTE PTR DS:[EAX],AL
00400873    0100            ADD DWORD PTR DS:[EAX],EAX
00400875    0000            ADD BYTE PTR DS:[EAX],AL
00400877    019D 730000C8   ADD DWORD PTR SS:[EBP+C8000073],EBX
0040087D    0000            ADD BYTE PTR DS:[EAX],AL
0040087F    0074A9 01       ADD BYTE PTR DS:[ECX+EBP*4+1],DH
00400883    0000            ADD BYTE PTR DS:[EAX],AL
00400885    0000            ADD BYTE PTR DS:[EAX],AL
00400887    0010            ADD BYTE PTR DS:[EAX],DL
00400889    9E              SAHF
0040088A    0100            ADD DWORD PTR DS:[EAX],EAX

//根据资料我们查找push 8000:

//1处:
00400854    68 00800000     PUSH 8000
00400859    6A 00           PUSH 0
0040085B    FF75 FC         PUSH DWORD PTR SS:[EBP-4]
0040085E    FF57 0C         CALL DWORD PTR DS:[EDI+C]
00400861    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
00400864    5F              POP EDI
00400865    5E              POP ESI
00400866    C9              LEAVE
00400867    C2 0C00         RETN 0C

//2处:
00400ABC    68 00800000     PUSH 8000
00400AC1    6A 00           PUSH 0
00400AC3    FFB5 191E0010   PUSH DWORD PTR SS:[EBP+10001E19]
00400AC9    FF95 2D1E0010   CALL DWORD PTR SS:[EBP+10001E2D]
00400ACF    8B46 0C         MOV EAX,DWORD PTR DS:[ESI+C]
00400AD2    03C7            ADD EAX,EDI
00400AD4    5D              POP EBP
00400AD5    5E              POP ESI
00400AD6    5F              POP EDI
00400AD7    5B              POP EBX
00400AD8    C3              RETN     //F2断下 SHIFT+F9来到这里

看到代码好象不和大大门的一样嘿嘿^_^

0101AAE4    8985 FA120010   MOV DWORD PTR SS:[EBP+100012FA],EAX      ; NOTEPAD.0100739D
0101AAEA    8BF0            MOV ESI,EAX
0101AAEC    8B4B 14         MOV ECX,DWORD PTR DS:[EBX+14]
0101AAEF    5A              POP EDX
0101AAF0    EB 0C           JMP SHORT NOTEPAD.0101AAFE
0101AAF2    03CA            ADD ECX,EDX
0101AAF4    68 00800000     PUSH 8000
0101AAF9    6A 00           PUSH 0
0101AAFB    57              PUSH EDI
0101AAFC    FF11            CALL DWORD PTR DS:[ECX]
0101AAFE    8BC6            MOV EAX,ESI
0101AB00    5A              POP EDX
0101AB01    5E              POP ESI
0101AB02    5F              POP EDI
0101AB03    59              POP ECX
0101AB04    5B              POP EBX
0101AB05    5D              POP EBP
0101AB06    FFE0            JMP EAX   这里跳OEP..我不看大大门的资料我都知道.
这个壳我可是F8和F7跟出来的...没下断点..就下了个内存断点..没资料的情况下硬把它跟出来了
现在想起来很不容易了.F2断下
F9到这里..再F7...跟..

0100739D    6A 70           PUSH 70                      //这里我们来到了OEP
0100739F    68 98180001     PUSH NOTEPAD.01001898
010073A4    E8 BF010000     CALL NOTEPAD.01007568
010073A9    33DB            XOR EBX,EBX
010073AB    53              PUSH EBX
010073AC    8B3D CC100001   MOV EDI,DWORD PTR DS:[10010CC]           ;

kernel32.GetModuleHandleA
010073B2    FFD7            CALL EDI
010073B4    66:8138 4D5A    CMP WORD PTR DS:[EAX],5A4D
010073B9    75 1F           JNZ SHORT NOTEPAD.010073DA
010073BB    8B48 3C         MOV ECX,DWORD PTR DS:[EAX+3C]
010073BE    03C8            ADD ECX,EAX
010073C0    8139 50450000   CMP DWORD PTR DS:[ECX],4550
010073C6    75 12           JNZ SHORT NOTEPAD.010073DA
010073C8    0FB741 18       MOVZX EAX,WORD PTR DS:[ECX+18]
010073CC    3D 0B010000     CMP EAX,10B
010073D1    74 1F           JE SHORT NOTEPAD.010073F2
010073D3    3D 0B020000     CMP EAX,20B
010073D8    74 05           JE SHORT NOTEPAD.010073DF
010073DA    895D E4         MOV DWORD PTR SS:[EBP-1C],EBX
010073DD    EB 27           JMP SHORT NOTEPAD.01007406
010073DF    83B9 84000000 0>CMP DWORD PTR DS:[ECX+84],0E

好了最后DUMP程序发现了LOADPE脱壳不全,脱完的壳很多东西都运行有多多少少的错误
用OD脱比较全面..

DUMP出来是112KB,我们再修复...
在修复 的时候有一个指针是被打了?号的,没管它修复程序正常只是大了了现在是116KB了

我看看能不能减肥...
我删掉一个多余的区段为107KB比以前小了点,,,但是按大大们的方法修的话肯定可以变小..累啊
如果有心学减肥就多找找了...我还是觉得大就大点吧..嘿嘿....^_^

也许朋友们说怎么都拿记事本玩..来点实际的嘛..我可是很实际的了
WIN98换WINXP记事本了,原因是找不到WIN98的记事本#_#

好既然大家觉得都拿记事是因为记事本简单,现在我来为大家搞出一个新鲜的程序

E:\004游戏\网络游戏\梦幻西游\my.exe
PECompact 2.x -> Jeremy Collake

经检查是上面的壳...

同样的办法...下断...

//OD载入在这里
0040DD9A >  B8 F4F84300     MOV EAX,my.0043F8F4
0040DD9F    50              PUSH EAX
0040DDA0    64:FF35 0000000>PUSH DWORD PTR FS:[0]
0040DDA7    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
0040DDAE    33C0            XOR EAX,EAX
0040DDB0    8908            MOV DWORD PTR DS:[EAX],ECX
0040DDB2    50              PUSH EAX
0040DDB3    45              INC EBP
0040DDB4    43              INC EBX

//开头代码就是了

//下断点BP VirtualFree,中断后,取消断点,Ctrl+F9两次:

我们到这里..实在是郁闷了..不用找代码了..直接就到了
003903EC    8B7E 08         MOV EDI,DWORD PTR DS:[ESI+8]
003903EF    03C7            ADD EAX,EDI
003903F1    68 00800000     PUSH 8000
003903F6    6A 00           PUSH 0
003903F8    FFB5 421B0010   PUSH DWORD PTR SS:[EBP+10001B42]
003903FE    FF10            CALL DWORD PTR DS:[EAX]
00390400    8B46 0C         MOV EAX,DWORD PTR DS:[ESI+C]
00390403    03C7            ADD EAX,EDI
00390405    5D              POP EBP
00390406    5E              POP ESI
00390407    5F              POP EDI
00390408    5B              POP EBX
00390409    C3              RETN

哈哈....我们的办法对这个程序没用.....
有错误为:发现调试程序运行,请关掉后重新启动机器

真的还加校验了,也就是暗桩...
重新载入....
下断点bp kernel32.LoadLibraryA  SHIFT+F9中断一次后到下面:
7C801D77 >  8BFF            MOV EDI,EDI
7C801D79    55              PUSH EBP
7C801D7A    8BEC            MOV EBP,ESP
7C801D7C    837D 08 00      CMP DWORD PTR SS:[EBP+8],0
7C801D80    53              PUSH EBX
7C801D81    56              PUSH ESI
7C801D82    74 14           JE SHORT kernel32.7C801D98
7C801D84    68 F0E2807C     PUSH kernel32.7C80E2F0                   ; ASCII "twain_32.dll"
7C801D89    FF75 08         PUSH DWORD PTR SS:[EBP+8]
7C801D8C    FF15 9C13807C   CALL DWORD PTR DS:[<&ntdll._strcmpi>]    ; ntdll._stricmp

//主要是看堆载:
0012FF6C   0039042D  /CALL 到 LoadLibraryA 来自 00390427
0012FF70   00390B29  \FileName = "kernel32"

//CTRL+F9 再F7到这里
0039042D    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX             ; kernel32.7C800000
00390430    8B56 04         MOV EDX,DWORD PTR DS:[ESI+4]
00390433    8B7E 08         MOV EDI,DWORD PTR DS:[ESI+8]
00390436    03D3            ADD EDX,EBX
00390438    03FB            ADD EDI,EBX
0039043A    33C0            XOR EAX,EAX
0039043C    0302            ADD EAX,DWORD PTR DS:[EDX]
0039043E    74 16           JE SHORT 00390456
00390440    52              PUSH EDX
00390441    8B02            MOV EAX,DWORD PTR DS:[EDX]
00390443    03C3            ADD EAX,EBX
00390445    50              PUSH EAX
00390446    FF75 FC         PUSH DWORD PTR SS:[EBP-4]
00390449    FF93 4E1B0010   CALL DWORD PTR DS:[EBX+10001B4E]

//好我们现在看:

//我们看到了吧...查找特征代码PUSH 8000 郁闷了..我们..找到了就1处.

003903F1    68 00800000     PUSH 8000
003903F6    6A 00           PUSH 0
003903F8    FFB5 421B0010   PUSH DWORD PTR SS:[EBP+10001B42]
003903FE    FF10            CALL DWORD PTR DS:[EAX]
00390400    8B46 0C         MOV EAX,DWORD PTR DS:[ESI+C]
00390403    03C7            ADD EAX,EDI
00390405    5D              POP EBP
00390406    5E              POP ESI
00390407    5F              POP EDI
00390408    5B              POP EBX
00390409    C3              RETN

//我们把断点放上面点
003903C9    8BDE            MOV EBX,ESI  //放这里,不然又说发现调试程序了...
003903CB    837B 48 01      CMP DWORD PTR DS:[EBX+48],1
003903CF    75 16           JNZ SHORT 003903E7
003903D1    8B43 0C         MOV EAX,DWORD PTR DS:[EBX+C]

//我们F7到这里,我也不明白为什么,这样就不提示错误了
//很有意思我们到了OEP附近了
0043F9A1    8985 23120010   MOV DWORD PTR SS:[EBP+10001223],EAX      ; my.<模块入口点>
0043F9A7    8BF0            MOV ESI,EAX
0043F9A9    59              POP ECX
0043F9AA    5A              POP EDX
0043F9AB    03CA            ADD ECX,EDX
0043F9AD    68 00800000     PUSH 8000
0043F9B2    6A 00           PUSH 0
0043F9B4    57              PUSH EDI
0043F9B5    FF11            CALL DWORD PTR DS:[ECX]
0043F9B7    8BC6            MOV EAX,ESI
0043F9B9    5A              POP EDX
0043F9BA    5E              POP ESI
0043F9BB    5F              POP EDI
0043F9BC    59              POP ECX
0043F9BD    5B              POP EBX
0043F9BE    5D              POP EBP
0043F9BF    FFE0            JMP EAX   //EAX就是OEP地址

//F7到这里算是到了OEP了
0040DD9A >  6A 60           PUSH 60
0040DD9C    68 80F24100     PUSH my.0041F280
0040DDA1    E8 922A0000     CALL my.00410838
0040DDA6    BF 94000000     MOV EDI,94
0040DDAB    8BC7            MOV EAX,EDI
0040DDAD    E8 4EF4FFFF     CALL my.0040D200
0040DDB2    8965 E8         MOV DWORD PTR SS:[EBP-18],ESP
0040DDB5    8BF4            MOV ESI,ESP
0040DDB7    893E            MOV DWORD PTR DS:[ESI],EDI
0040DDB9    56              PUSH ESI
0040DDBA    FF15 F4A04100   CALL DWORD PTR DS:[41A0F4]               ;

kernel32.GetVersionExA
0040DDC0    8B4E 10         MOV ECX,DWORD PTR DS:[ESI+10]
0040DDC3    890D 3C524200   MOV DWORD PTR DS:[42523C],ECX
0040DDC9    8B46 04         MOV EAX,DWORD PTR DS:[ESI+4]
0040DDCC    A3 48524200     MOV DWORD PTR DS:[425248],EAX
0040DDD1    8B56 08         MOV EDX,DWORD PTR DS:[ESI+8]
0040DDD4    8915 4C524200   MOV DWORD PTR DS:[42524C],EDX
0040DDDA    8B76 0C         MOV ESI,DWORD PTR DS:[ESI+C]
0040DDDD    81E6 FF7F0000   AND ESI,7FFF
0040DDE3    8935 40524200   MOV DWORD PTR DS:[425240],ESI
0040DDE9    83F9 02         CMP ECX,2
0040DDEC    74 0C           JE SHORT my.0040DDFA
0040DDEE    81CE 00800000   OR ESI,8000
0040DDF4    8935 40524200   MOV DWORD PTR DS:[425240],ESI
0040DDFA    C1E0 08         SHL EAX,8
0040DDFD    03C2            ADD EAX,EDX
0040DDFF    A3 44524200     MOV DWORD PTR DS:[425244],EAX
0040DE04    33F6            XOR ESI,ESI
0040DE06    56              PUSH ESI
0040DE07    8B3D C0A04100   MOV EDI,DWORD PTR DS:[41A0C0]            ;

kernel32.GetModuleHandleA

//下面我们DUMP程序
脱壳后是259KB....

有一个函数是打问号的..但是不管也没关系..一切都很正常
为了游戏的稳定性..我的技术又不搞就不减肥了
反正是不到300KB..哈哈..也没关系的了
检查为下面的内容:
Microsoft Visual C++ 7.0

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个壳的难度好像不是很大吧。
2006-10-6 07:43
0
游客
登录 | 注册 方可回帖
返回
//