-
-
[旧帖] [原创]手脱Spalsher 1.0 - 3.0 -> Amok * 0.00雪花
-
发表于: 2008-9-28 14:37 3268
-
昨天,在猪猪论坛上看到有位大虾破解了《樱花大战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...哈哈
好奇,把它拖进了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...哈哈
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!
赞赏
他的文章
- [原创]让程序崩溃时自动创建minidump 24847
- [以解决]2010年即将毕业,热血找工作 7277
- [原创]用symbol来获得ShadowSSDT的原始地址和函数名 17117
- [讨论]系统是在什么时候设置IopVerifierOn的? 3681
- [原创]暴力搜索内存枚举进程的学习笔记 18802
赞赏
雪币:
留言: