吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6724|回复: 3
收起左侧

关于cshow大侠发的CM之脱壳与追码!

[复制链接]
duce 发表于 2008-8-9 23:04
昨天奥运开幕,偶看完一个小时的节目后,在论坛你发现cshow 大侠发的一个CrackMe

,拿来做练习,一查是FSG2.0的壳,弱壳一个,没在意,拿超级巡警的脱壳机脱的,F12大

法追的码,追码一遍就出来了,当时很舒心,哈哈。今天晚上,见了这个CM,一想好久没

脱过FSG2.0的壳了,脱下吧!没想到花了一个多小时。并且发现这个FSG2.0藏了一下OEP,

偶是菜菜,找了好久。一点心得,写出来给大家,但求和大家一起进步,这就是小妹的心愿

!另外,感谢cshow大侠发这个Crackme,给个偶这个学习的机会!谢谢!


目标程序:大侠的Crackme。(偶非盗版,借用一下。原版归cshow大侠所有。)
工具:还是那些呀!OD。LordPE。ImportREC。


对于FSG2.0,偶试了两种脱法,一是最流行的那种哦,Popad关键句下一行,看堆栈显示第

四行的地址就是OEP。偶认为这种方法虽然简单,但让人成机器人了,还不如用脱壳机,哈

哈,那不连IAT也不用查啦!!!再者FSG就是个弱壳,能动手就动手吧!用单步法。

首先要了解这个壳,FSG的壳都是用一个Jmp或Je跳到OEP处,这个跳一般单步跟是实现不

了的,经常被另一个跳给跳过去,当然啦,跳过去走一会就飞了!那个跳到OEP处的Jmp或

Je最明显的特征就是没有那条指示线。偶一遍跟不出来,一般都是好几遍,偶是菜菜哦!


先OD载入,起始位置显示:
00400154 >8725 64AC4100 xchgdword ptr [41AC64], esp
0040015A61popad
0040015B94xchgeax, esp
0040015C55pushebp
0040015DA4movsbyte ptr es:[edi], byte ptr [esi>
0040015EB6 80 mov dh, 80
00400160FF13calldword ptr [ebx]
00400162^ 77 F9 jashort 0040015D 不让它跳
0040016433C9xor ecx, ecxF4运行到这一行
00400166FF13calldword ptr [ebx]
0040016877 16 jashort 00400180没实现
0040016A33C0xor eax, eax
0040016CFF13calldword ptr [ebx]
0040016E73 1F jnb short 0040018F没实现
00400170B6 80 mov dh, 80
0040017241inc ecx
00400173B0 10 mov al, 10
00400175FF13calldword ptr [ebx]
0040017712C0adc al, al
00400179^ 73 FA jnb short 00400175 不实现
0040017B75 3A jnz short 004001B7 F4到这里,没实现。
0040017DAAstosbyte ptr es:[edi]
0040017E^ EB E0 jmp short 00400160不实现
00400180FF53 08 calldword ptr [ebx+8] F4到这里
0040018302F6add dh, dh
0040018583D9 01 sbb ecx, 1
0040018875 0E jnz short 00400198 往下跳,实现。
0040018AFF53 04 calldword ptr [ebx+4]
0040018DEB 24 jmp short 004001B3

来到:
0040019891xchgeax, ecx
0040019948dec eax
0040019AC1E0 08 shl eax, 8
0040019DAClodsbyte ptr [esi]
0040019EFF53 04 calldword ptr [ebx+4]
004001A13B43 F8 cmp eax, dword ptr [ebx-8]
004001A473 0A jnb short 004001B0 没实现
004001A680FC 05 cmp ah, 5
004001A973 06 jnb short 004001B1没实现
004001AB83F8 7F cmp eax, 7F
004001AE77 02 jashort 004001B2没实现
004001B041inc ecx
004001B141inc ecx
004001B295xchgeax, ebp
004001B38BC5mov eax, ebp
004001B5B6 00 mov dh, 0
004001B756pushesi
004001B88BF7mov esi, edi
004001BA2BF0sub esi, eax
004001BCF3:A4 rep movs byte ptr es:[edi], byte ptr>
004001BE5Epop esi
004001BF^ EB 9F jmp short 00400160不让它实现
004001C15Epop esi F4到这里
004001C2ADlodsdword ptr [esi]
004001C397xchgeax, edi
004001C4ADlodsdword ptr [esi]
004001C550pusheax
004001C6FF53 10 calldword ptr [ebx+10]
004001C995xchgeax, ebp
004001CA8B07mov eax, dword ptr [edi]
004001CC40inc eax
004001CD^ 78 F3 jsshort 004001C2没实现
004001CF /75 03 jnz short 004001D4这个跳实现了,但不能让

它跳,跳了跟下去会飞
004001D1 |FF63 0C jmp dword ptr [ebx+C] F4到这里,跳到OEP
004001D4 \50pusheax
004001D555pushebp

来到这里要删除分析。出现:
0040B01868 BCAF4000 push0040AFBC此处一般来说是OEP,不过这里不是。

长的不像啊,是吧!
0040B01D64:FF35 0000000>pushdword ptr fs:[0]
0040B02464:8925 0000000>mov dword ptr fs:[0], esp
0040B02BBE 00000000 mov esi, 0
0040B0308B06mov eax, dword ptr [esi]

这里是伪OEP,后遍指向的地址才是, 0040AFBC(是真正的OEP)。偶在这里费了20分钟

啊!!!

Ctrl+G: 0040AFBC。
0040AFBC55pushebp真正的OEP啦!看入口就没错了吧!
0040AFBD8BECmov ebp, esp
0040AFBF83C4 F0 add esp, -10
0040AFC2B8 5CAF4000 mov eax, 0040AF5C
0040AFC7E8 689CFFFF call00404C34
0040AFCCB8 08B04000 mov eax, 0040B008; ASCII "Project1"
0040AFD1E8 A6ABFFFF call00405B7C

LordPE脱壳,要修复哦,FSG的壳不修复能运行的不多。
OEP填:AFBC。
获取输入表,只有3个指针。。。。肯定RVA不对啦!
打开指针,那三个随便选一个地址,0000E178这个吧!回到OD中,在数据窗口Ctrl+G,用

选的那个地址加上基址00400000+0000E178=0040e178这个地址。往上翻,找到开头的那

个函数:
0040E0C400000000....
0040E0C87C93188A?搢ntdll.RtlDeleteCriticalSection
0040E0CC7C9210ED?抾ntdll.RtlLeaveCriticalSection
0040E0D07C921005抾 ntdll.RtlEnterCriticalSection
0040E0D47C809EF1駷

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| duce 发表于 2008-8-9 23:08
不够了得占楼了!

这里的0040E0C8就是我们要找的IAT咯!

在ImportREC中,RVA填:E0C8。 大小懒的算了,填1000就行了(地球人都知道啊)。
获取输入表,出现好多指针,显示无效,剪去就行了。抓取一下,脱壳OK!

下面说一下追码:
我试了一下,F12大法和下messagebox断点都行。偶习惯用的F12大法,简单嘛!

OD载入脱壳后的文件,
0040AFBC > $55pushebp
0040AFBD .8BECmov ebp, esp
0040AFBF .83C4 F0 add esp, -10
0040AFC2 .B8 5CAF4000 mov eax, 0040AF5C
0040AFC7 .E8 689CFFFF call00404C34
0040AFCC .B8 08B04000 mov eax, 0040B008;ASCII "Project1"
0040AFD1 .E8 A6ABFFFF call00405B7C

程序入口就是我们找到的OEP咯,F9运行,随便输用户名和假码,偶的就是:duce咯。

点注册,弹出No。
 楼主| duce 发表于 2008-8-9 23:12
回到OD,点暂停,
7C92EB94 >C3retn
7C92EB958DA424 00000000 lea esp, dword ptr [esp]
7C92EB9C8D6424 00 lea esp, dword ptr [esp]
7C92EBA090nop
7C92EBA190nop

点K调用堆栈,找到:

调用堆栈: 主线程, 条目 14
地址=0012F8E0
堆栈=004056A1
函数过程 / 参数=? <jmp.&user32.MessageBoxA>
调用来自=Unpack_.0040569C
结构=0012F8DC

Showcall显示调用,来到:

0040569C|.E8 EFF7FFFF call<jmp.&user32.MessageBoxA>; \MessageBoxA
004056A1\.C3retn
004056A28BC0mov eax, eax
004056A4/$B9 10000000 mov ecx, 10

段尾retn处F2下断,F9运行起来,点程序的对话框,那个No。
程序断下来了。取消断点。
然后单步跟吧!
两次F8,来到:
0040AE49|> \6A 00 push0; /ExitCode = 0
0040AE4B|.E8 A09EFFFF call<jmp.&kernel32.ExitProcess>; \ExitProcess
0040AE50|>33C0xor eax, eax

看这里的函数:“ExitProcess”,要退出了,再往下走得飞了。再看堆栈:
0012F90C 00D04A00ASCII "no"
0012F910 00D049E8ASCII "zzzzzzzzzzz"
0012F914 00D048CCASCII "duce"
0012F918 00D048E0ASCII "duce"
判断完假码了,这说明我们也跟的差不多了。不能再往下了。好往上找到段首下断,重新载

入程序,F9运行,输用户名和假码,注册,点对话框No,断下了,取消断点,单步跟:
0040AC5C/.55pushebp
0040AC5D|.8BECmov ebp, esp
0040AC5F|.B9 10000000 mov ecx, 10


0040AD27|.837D D0 00cmp dword ptr [ebp-30], 0 出现假码

0040AD3C|.8B45 B0 mov eax, dword ptr [ebp-50] 出现duce

0040AD8C|.50pusheax 中间窗口出现eax=00D0489C, (ASCII "C3-C5-

C4-B5"),长的有点像注册码,哈哈!继续。。。

0040AD9C|.E8 6390FFFF call00403E04 跟到这里,看寄存器窗口,真假码对比就

是C3-C5-C4-B5啦!

好啦,到这里吧!好累,要休息了,祝大家奥运快乐!
感谢cshow大侠提供的Crackme!谢谢!
survival 发表于 2008-8-10 17:35
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 10:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表