首页
社区
课程
招聘
[旧帖] [原创]手脱Spalsher 1.0 - 3.0 -> Amok * 0.00雪花
发表于: 2008-9-28 14:37 3187

[旧帖] [原创]手脱Spalsher 1.0 - 3.0 -> Amok * 0.00雪花

2008-9-28 14:37
3187
昨天,在猪猪论坛上看到有位大虾破解了《樱花大战4》。于是我好高兴好高兴的下载了下来。安装好了以后,发现每次运行时都会出现猪猪论坛的logo。其实本来这个不伤大雅,但是出于

好奇,把它拖进了PEiD里。哦~~~果然不错,加壳了。“Spalsher 1.0 - 3.0 -> Amok *”,我记得这个壳,在论坛上曾经有人问他怎么脱来着,后来有人说加壳工具自身就可以脱,

再加上上手没有东西,于是也没很注意这个。现在既然遇上了,当然不能放过他了。

首先说说我的思路。
1. 既然是壳,那么把壳脱了,应该就搞定了。
2. 如果能在壳里面找到弹出LOGO的代码,也可以搞定。

OK,开始动手。

先来说一下我的第二种思路吧(这个简单点^_^)

用OD载入程序。看到以下代码
0661C000 >  9C              pushfd
0661C001    60              pushad
0661C002    8B4424 24       mov     eax, dword ptr [esp+24]
0661C006    E8 00000000     call    0661C00B
0661C00B    5D              pop     ebp
0661C00C    81ED 351C4000   sub     ebp, 00401C35
0661C012    50              push    eax
0661C013    E8 ED020000     call    0661C305
0661C018    85C0            test    eax, eax

有点感觉,不过还用不上这些东西。按F8往下走,一直走到

0661C065    FFB5 A4224000   push    dword ptr [ebp+4022A4]
0661C06B    6A 00           push    0
0661C06D    68 72010000     push    172
0661C072    FFB5 A0224000   push    dword ptr [ebp+4022A0]
0661C078    FF95 66224000   call    dword ptr [ebp+402266]       ;注意SendMessage
0661C07E    FFB5 A0224000   push    dword ptr [ebp+4022A0]
0661C084    FF95 77224000   call    dword ptr [ebp+402277]
0661C08A    FFB5 A8224000   push    dword ptr [ebp+4022A8]
0661C090    FF95 C2214000   call    dword ptr [ebp+4021C2]
0661C096    FFB5 A0224000   push    dword ptr [ebp+4022A0]
0661C09C    FF95 28224000   call    dword ptr [ebp+402228]
0661C0A2    FFB5 A4224000   push    dword ptr [ebp+4022A4]
0661C0A8    FF95 AA214000   call    dword ptr [ebp+4021AA]
0661C0AE    FFB5 98224000   push    dword ptr [ebp+402298]
0661C0B4    FF95 F6214000   call    dword ptr [ebp+4021F6]
0661C0BA    8B85 AC224000   mov     eax, dword ptr [ebp+4022AC]
0661C0C0    0385 94224000   add     eax, dword ptr [ebp+402294]
0661C0C6    8985 F91C4000   mov     dword ptr [ebp+401CF9], eax

一直走到SendMessage处,发现猪猪乐园的Logo出现了。看来就是这里了。到这里又有两种思路一个是把SendMessage这段nop掉,还有就是在前面找个跳转把这段跳过去。OK,事实证明这两种方法都是可行的。


0661C072    FFB5 A0224000   push    dword ptr [ebp+4022A0]
0661C078    FF95 66224000   call    dword ptr [ebp+402266]

这段nop掉和将前面的一句0661C055   /74 63           je      short 0661C0BA

改成JMP都是可以去掉那个logo的。

好了,这种方法就说到这了,很简单吧。

不过,我个人不喜欢这种搞法,没有把壳脱了来得爽!如果大家也是这么想的,请看第二种思路。

还是用OD载入。看到这个

0661C000 >  9C              pushfd
0661C001    60              pushad
0661C002    8B4424 24       mov     eax, dword ptr [esp+24]
0661C006    E8 00000000     call    0661C00B
0661C00B    5D              pop     ebp
0661C00C    81ED 351C4000   sub     ebp, 00401C35
0661C012    50              push    eax
0661C013    E8 ED020000     call    0661C305
0661C018    85C0            test    eax, eax

看到这个就想到ESP,由于不熟悉这个壳,我决定还是自己跑一次。于是F8一路跑过弹出logo的那段代码。来到这里

0661C0BA    8B85 AC224000   mov     eax, dword ptr [ebp+4022AC]
0661C0C0    0385 94224000   add     eax, dword ptr [ebp+402294]
0661C0C6    8985 F91C4000   mov     dword ptr [ebp+401CF9], eax
0661C0CC    61              popad
0661C0CD    9D              popfd
0661C0CE    68 D08E6106     push    06618ED0
0661C0D3    C3              retn

一个“改版”的JMP,很可疑。retn后来到这块地方

06618ED0   ?  60            pushad
06618ED1   ?  BE 00C04F06   mov     esi, 064FC000
06618ED6   ?  8DBE 0050F0F9 lea     edi, dword ptr [esi+F9F05000]
06618EDC   .  57            push    edi
06618EDD   .  EB 0B         jmp     short 06618EEA
06618EDF      90            nop
06618EE0   >  8A06          mov     al, byte ptr [esi]
06618EE2   .  46            inc     esi

由于前面那段代码只有弹出logo的部分,却没看到有解压部分,所以我判断这一大段代码应该是一段解压代码了。一路飞奔ing~~~看到这里

06618FD3   .  50            push    eax
06618FD4   .  83C7 08       add     edi, 8
06618FD7   .  FF96 409F2106 call    dword ptr [esi+6219F40]          ;  kernel32.LoadLibraryA

OK,好戏要开始了。如果不出意外就快到GetProcAddress了吧。。。

06618FEB   .  55            push    ebp
06618FEC   .  FF96 449F2106 call    dword ptr [esi+6219F44]          ;  kernel32.GetProcAddress

胜利在望,继续F8

06619032   .  61            popad
06619033   .  8D4424 80     lea     eax, dword ptr [esp-80]
06619037   >  6A 00         push    0
06619039   .  39C4          cmp     esp, eax
0661903B   .^ 75 FA         jnz     short 06619037
0661903D   .  83EC 80       sub     esp, -80
06619040   .- E9 313D00FA   jmp     0061CD76

又看到了一个跳,跟过去觉发现这个了。

0061CD76    55              push    ebp                                     ;传说中的OEP
0061CD77    8BEC            mov     ebp, esp
0061CD79    6A FF           push    -1
0061CD7B    68 B8FF6400     push    0064FFB8
0061CD80    68 70CD6100     push    0061CD70                         ; jmp 到 msvcrt._except_handler3
0061CD85    64:A1 00000000  mov     eax, dword ptr fs:[0]
0061CD8B    50              push    eax
0061CD8C    64:8925 0000000>mov     dword ptr fs:[0], esp
0061CD93    83EC 68         sub     esp, 68

这样OEP就找到了。既然已经找到OEP了,就用LoadPE和ImportREC干活了,结果我发现Dump出来的文件居然有98M,原来的文件只有1.5M。这也太恶心了吧。于是用FreeRes修复了一下资源,用LoadPE把文件重建了一下,把他缩小到3.4M。这样才算满意。

P.S. : 这里小菜我有两点不是很明白,想问问大虾们。1. 为什么Dump下来后的文件会如此之大!!! 2. LoadPE是怎么重建PE,让我的Dump文件又变小的?

好了,文章就写到这里。
最后提前祝大家国庆节快乐!!!o(∩_∩)o...哈哈

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//