新手学逆向 拿到了junzz在09年做的一个CRACKME
样本加密过了,附加调试找到了KEY算法和关键跳-----这不是重点
因为想DUMP出来,先用各种查壳工具都查不出来是什么壳
算了 自己手动搞吧-----09年的东西 想必强度不是很大,后来也证明我的猜测是正确的。
先是用了各种查壳工具 都不知道是什么壳(希望各位日壳千万的大神帮忙看看这是什么壳)。
0047A034 > 60 pushad
0047A035 9C pushfd
0047A036 E8 8E000000 call CrackMe.0047A0C9
0047A03B C3 retn
0047A03C EB 06 jmp short CrackMe.0047A044
入口明显的压站 对ESP下硬访
中断到
002E087A E8 980D0000 call 002E1617 断在这里
002E087F 51 push ecx
002E0880 E9 600C0000 jmp 002E14E5
002E0885 83C6 04 add esi,0x4
002E0888 E8 D4FCFFFF call 002E0561
F7跟进 call 002E1617
002E1617 8D6424 04 lea esp,dword ptr ss:[esp+0x4]
002E161B 61 popad
002E161C ^ E9 E7F9FFFF jmp 002E1008
002E1008 - FFE0 jmp eax ; CrackMe.0047148B ----------飞向光明
002E100A 8D6424 04 lea esp,dword ptr ss:[esp+0x4]
002E100E 6A 00 push 0x0
002E1010 E8 8EFAFFFF call 002E0AA3
jmp eax 跳向OEP
0047148B /. 55 push ebp
0047148C |. 8BEC mov ebp,esp
0047148E |. 6A FF push -0x1
00471490 |. 68 28514700 push CrackMe.00475128
00471495 |. 68 58214700 push CrackMe.00472158 ; SE 处理程序安装
0047149A |. 64:A1 0000000>mov eax,dword ptr fs:[0]
004714A0 |. 50 push eax ; CrackMe.0047148B
004714A1 |. 64:8925 00000>mov dword ptr fs:[0],esp
004714A8 |. 83EC 58 sub esp,0x58
004714AB |. 53 push ebx
004714AC |. 56 push esi
004714AD |. 57 push edi
004714AE |. 8965 E8 mov [local.6],esp
004714B1 |. FF15 80504700 call dword ptr ds:[0x475080]
004714B7 |. 33D2 xor edx,edx ; CrackMe.<ModuleEntryPoint>
然后看IAT
搜索FF 15
004714B1 |. FF15 80504700 call dword ptr ds:[0x475080]
我们看 ds:[0x475080]=3b5039
明显 IAT被处理了
数据窗口中先确定下长度
00475000 003B2264 d";. ---start
*
*
*
*
0047511C 003B052F /;. ASCII "h\n" ----end
然后我们跟进
004714B1 |. FF15 80504700 call dword ptr ds:[0x475080]看看IAT的调用
003B5039 68 0A000080 push 0x8000000A
003B503E 53 push ebx
003B503F 57 push edi
003B5040 E8 00000000 call 003B5045
003B5045 5B pop ebx ; kernel32.GetVersion
003B5046 81EB 0C104000 sub ebx,0x40100C
003B504C 81C3 24104000 add ebx,0x401024
003B5052 8BFB mov edi,ebx
003B5054 8B3F mov edi,dword ptr ds:[edi]
003B5056 897C24 08 mov dword ptr ss:[esp+0x8],edi
003B505A 5F pop edi ; kernel32.GetVersion
003B505B 5B pop ebx ; kernel32.GetVersion
003B505C C3 retn
retn到 kernel32.GetVersion
地址是
74EE4467 > /EB 05 jmp short <jmp.&API-MS-Win-Core-SysInfo->
74EE4469 |90 nop
74EE446A |90 nop
74EE446B |90 nop
74EE446C |90 nop
74EE446D |90 nop
74EE446E -\FF25 0C0CEE74 jmp dword ptr ds:[<&API-MS-Win-Core-SysI>; KernelBa.GetVersion
74EE4474 8B4D A8 mov ecx,dword ptr ss:[ebp-0x58]
74EE4477 8908 mov dword ptr ds:[eax],ecx
74EE4479 8B4D AC mov ecx,dword ptr ss:[ebp-0x54]
74EE447C 8948 04 mov dword ptr ds:[eax+0x4],ecx
74EE447F E9 983E0000 jmp kernel32.74EE831C
74EE4484 8B55 D4 mov edx,dword ptr ss:[ebp-0x2C] ; CrackMe.0047A41D
74EE4487 8910 mov dword ptr ds:[eax],edx ; CrackMe.<ModuleEntryPoint>
74EE4489 E9 783E0000 jmp kernel32.74EE8306
于是我们手动修复这条IAT
把ds:[0x475080]=3b5039
改成ds:[0x475080]=74ee446e
这一条就修复完成了
但是手动修复IAT实在工程量太过庞大
想请各位高手看看 这是什么壳 有没有现成的修复工具(我不是伸手党啦~~~)
下面发几个该壳的一些特征
首先是壳的入口
0047A034 > 60 pushad
0047A035 9C pushfd
0047A036 E8 8E000000 call CrackMe.0047A0C9
0047A03B C3 retn
0047A03C EB 06 jmp short CrackMe.0047A044
0047A03E 44 inc esp
0047A03F EB 0F jmp short CrackMe.0047A050
0047A041 44 inc esp
0047A042 EB 0F jmp short CrackMe.0047A053
0047A044 8B1C24 mov ebx,dword ptr ss:[esp] ; kernel32.74EE33CA
其次是飞向OEP的特征
jmp eax
最后是对GetVersion的处理
003B5045 5B pop ebx ; kernel32.GetVersion
003B5046 81EB 0C104000 sub ebx,0x40100C
003B504C 81C3 24104000 add ebx,0x401024
003B5052 8BFB mov edi,ebx
003B5054 8B3F mov edi,dword ptr ds:[edi]
003B5056 897C24 08 mov dword ptr ss:[esp+0x8],edi
小弟冰天雪地裸身三百六十度后空翻跪地求指导这到底是啥壳~~
手动修复IAT的工程量实在太大啊。。。。。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!