好友
阅读权限10
听众
最后登录1970-1-1
|
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駷 |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|