一个真的适合新手的Crackme
脚本已经注明出处 by willJ作者:————JoyChou
查壳是yoda's Protector 1.03.2
然后脚本我已经打包了,用脚本脱壳后会有个自校验,然后自己F12调用堆栈,nop掉那个“雅蠛蝶就ok了”
这里就由菜鸟我简单说下这个CM的不脱壳破解。
F12调用堆栈后,来到这,其实看到下面的提示就知道可以通过下断点可以关键的地方
在77D6657A C2 1000 retn 10处下段,单步到程序领空
然后观察到字符串了,关键的地方也就找到了
004011AC .FFD6 call esi ; \获取用户名,长度返回给eax
004011AE .6A 09 push 9 ; /Count = 9
004011B0 .8D4424 0C lea eax,dword ptr ss: ; |
004011B4 .50 push eax ; |Buffer
004011B5 .68 EB030000 push 3EB ; |ControlID = 3EB (1003.)
004011BA .57 push edi ; |hWnd
004011BB .FFD6 call esi ; \获取假码,长度依然给eax
004011BD .8D7424 08 lea esi,dword ptr ss: ;假码
004011C1 .8D4C24 1C lea ecx,dword ptr ss: ;用户名
004011C5 .E8 36FEFFFF call Crackwho.00401000 //这里就是算法,进去看就知道了,算法了,很简单的,还是比较适合新手,这里我就把注册机贴出来吧。
004011CA .5E pop esi
004011CB .6A 00 push 0
004011CD .68 3C9A4000 push Crackwho.00409A3C
004011D2 .85C0 test eax,eax
004011D4 .74 20 je short Crackwho.004011F6
004011D6 .68 449A4000 push Crackwho.00409A44 ;UNICODE "Congratulation"
004011DB .57 push edi
004011DC .FF15 FC804000 call dword ptr ds:
004011E2 .33C0 xor eax,eax
004011E4 .5F pop edi
004011E5 .8B4C24 28 mov ecx,dword ptr ss:
004011E9 .33CC xor ecx,esp
004011EB .E8 D1000000 call Crackwho.004012C1
004011F0 .83C4 2C add esp,2C
004011F3 .C2 1000 retn 10
004011F6 >68 649A4000 push Crackwho.00409A64 ;UNICODE "Sorry,You are wrong"
004011FB .57 push edi
004011FC .FF15 FC804000 call dword ptr ds:
进入call到这发现算法,这只是第一重循环,我想下面的7次循环应该也没问题了
0040103E|.0FB701 movzx eax,word ptr ds: ;eax指向用户名
00401041|.0FB71424 movzx edx,word ptr ss: ;edx指向syclover
00401045|.33C2 xor eax,edx ;第一位用户名和‘s’异或
00401047|.99 cdq
00401048|.57 push edi
00401049|.BF 1A000000 mov edi,1A
0040104E|.F7FF idiv edi ;异或的结果与1A的余数给edx
00401050|.0FB741 02 movzx eax,word ptr ds: ;此时将假码第二位给eax,准备进行下一次循环
00401054|.6A 09 push 9 ; /Arg3 = 00000009
00401056|.56 push esi ; |Arg2
00401057|.51 push ecx ; |Arg1
00401058|.83C2 41 add edx,41 ; |余数加41
0040105B|.66:8911 mov word ptr ds:,dx ; |结果放回ecx
用户名:JoyChou
注册码:FWAVHZQK
PS:当看到出现一个字符串:syclover就可以猜测注册码是8位的。此题是明码比较的,菜鸟就装B的吧算法写了出来,忘老鸟勿喷。
算法:
用户名每一位和syclover十六进制异或,结果%1A,再+0x41,结果转字符
换成十进制就是,结果%26,再加上65
由于菜鸟只会C语言,所以只能写个苦逼的C程序,忘大牛见怪
#include <stdio.h>
int main(void)
{
char name;
int i, c;
char temp = "syclover";
char key;
printf("input your name:");
gets(name);
for (i = 0; i < 8; i++)
{
key = ( (name ^ temp)%26 ) + 65;
}
key= '\0';
printf("the key is: ");
puts(key);
printf("\n");
c=getchar();
return 0;
}
菜鸟第一次写这个,好紧张 火速前来膜拜! 现在看了下,写得太不详细了,额。可耻的匿了,睡觉去了。睡觉前先膜拜下J大牛 学习下!!! 可以讲讲那个壳的手动脱法,写得不错 膜拜楼主 。 呵呵 菜鸟学习了 脚臭带我算法分析...教我写C语言程序.... 分析的不错···谢谢分享!