duce 发表于 2008-8-9 23:04

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

昨天奥运开幕,偶看完一个小时的节目后,在论坛你发现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 , esp
0040015A61popad
0040015B94xchgeax, esp
0040015C55pushebp
0040015DA4movsbyte ptr es:, byte ptr [esi>
0040015EB6 80 mov dh, 80
00400160FF13calldword ptr
00400162^ 77 F9 jashort 0040015D 不让它跳
0040016433C9xor ecx, ecxF4运行到这一行
00400166FF13calldword ptr
0040016877 16 jashort 00400180没实现
0040016A33C0xor eax, eax
0040016CFF13calldword ptr
0040016E73 1F jnb short 0040018F没实现
00400170B6 80 mov dh, 80
0040017241inc ecx
00400173B0 10 mov al, 10
00400175FF13calldword ptr
0040017712C0adc al, al
00400179^ 73 FA jnb short 00400175 不实现
0040017B75 3A jnz short 004001B7 F4到这里,没实现。
0040017DAAstosbyte ptr es:
0040017E^ EB E0 jmp short 00400160不实现
00400180FF53 08 calldword ptr F4到这里
0040018302F6add dh, dh
0040018583D9 01 sbb ecx, 1
0040018875 0E jnz short 00400198 往下跳,实现。
0040018AFF53 04 calldword ptr
0040018DEB 24 jmp short 004001B3

来到:
0040019891xchgeax, ecx
0040019948dec eax
0040019AC1E0 08 shl eax, 8
0040019DAClodsbyte ptr
0040019EFF53 04 calldword ptr
004001A13B43 F8 cmp eax, dword ptr
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:, byte ptr>
004001BE5Epop esi
004001BF^ EB 9F jmp short 00400160不让它实现
004001C15Epop esi F4到这里
004001C2ADlodsdword ptr
004001C397xchgeax, edi
004001C4ADlodsdword ptr
004001C550pusheax
004001C6FF53 10 calldword ptr
004001C995xchgeax, ebp
004001CA8B07mov eax, dword ptr
004001CC40inc eax
004001CD^ 78 F3 jsshort 004001C2没实现
004001CF /75 03 jnz short 004001D4这个跳实现了,但不能让

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

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

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

这里是伪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
7C92EB9C8D6424 00 lea esp, dword ptr
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 , 0 出现假码

0040AD3C|.8B45 B0 mov eax, dword ptr 出现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

不错不错哦,长知识,学习了
页: [1]
查看完整版本: 关于cshow大侠发的CM之脱壳与追码!