-
-
[原创]适合新手的CrackMe算法分析(处男秀)
-
发表于:
2010-2-12 17:47
4645
-
[原创]适合新手的CrackMe算法分析(处男秀)
【文章标题】: 超菜的CrackMe算法分析
【文章作者】: forget
【作者邮箱】: 120977727@qq.com
【作者主页】: 不明
【软件下载】: 不详
【软件名称】: 只是供学习的crackme
【加壳方式】: 无
【保护方式】: NO 有
【使用工具】: OllyICE
【文章日期】: 2010.2.12
本人给大家提前拜年了!
祝愿大家在新的一年里身体健康,虎虎生威。
心情愉悦,合家幸福!
1、拿到软件先运行,了解到它是以输入name和serial的方式进行保护的,输错有错误提示。
2、查壳,无壳。不是重点,就选了一个没壳的。
3、用OllyICE打开,点运行程序
4.查找--->所有参考字符串(眼睛一亮发现文本ASCII "That isn't it, keep on trying..."
5.双击进入。
[LEFT]00425040 /. 55 push ebp
00425041 |. 8BEC mov ebp, esp
00425043 |. 33C9 xor ecx, ecx
00425045 |. 51 push ecx
00425046 |. 51 push ecx
00425047 |. 51 push ecx
00425048 |. 51 push ecx
00425049 |. 53 push ebx
0042504A |. 56 push esi
0042504B |. 57 push edi
0042504C |. 8BD8 mov ebx, eax
0042504E |. 33C0 xor eax, eax
00425050 |. 55 push ebp
00425051 |. 68 11514200 push 00425111
00425056 |. 64:FF30 push dword ptr fs:[eax]
00425059 |. 64:8920 mov dword ptr fs:[eax], esp
0042505C |. 8D55 FC lea edx, dword ptr [ebp-4]
0042505F |. 8B83 B8010000 mov eax, dword ptr [ebx+1B8]
00425065 |. E8 96C9FEFF call 00411A00
0042506A |. 8D55 F4 lea edx, dword ptr [ebp-C]
0042506D |. 8B83 BC010000 mov eax, dword ptr [ebx+1BC]
00425073 |. E8 88C9FEFF call 00411A00
00425078 |. 8B45 F4 mov eax, dword ptr [ebp-C] ; 假注册码
0042507B |. 8D55 F8 lea edx, dword ptr [ebp-8]
0042507E |. E8 71D7FDFF call 004027F4
00425083 |. 8BF0 mov esi, eax
00425085 |. 8B45 FC mov eax, dword ptr [ebp-4]
00425088 |. E8 13010000 call 004251A0 ; 算法
0042508D |. 8BF8 mov edi, eax ; edi=0AE27680
0042508F |. 3BFE cmp edi, esi ; 比较是不是等于0AE27680
00425091 |. 74 18 je short 004250AB ;跳就完蛋
00425093 |. 6A 00 push 0
00425095 |. B9 20514200 mov ecx, 00425120 ; ASCII "cyT0m!c's CrackMe #1"
0042509A |. BA 38514200 mov edx, 00425138 ; ASCII "That isn't it, keep on trying..."
0042509F |. A1 28764200 mov eax, dword ptr [427628]
004250A4 |. E8 23CAFFFF call 00421ACC
004250A9 |. EB 16 jmp short 004250C1
004250AB |> 6A 00 push 0
004250AD |. B9 20514200 mov ecx, 00425120 ; ASCII "cyT0m!c's CrackMe #1"
004250B2 |. BA 5C514200 mov edx, 0042515C ; ASCII "Hey, you have done it"
004250B7 |. A1 28764200 mov eax, dword ptr [427628]
跟进call 004251A0
004251A0 /$ 53 push ebx
004251A1 |. 89C3 mov ebx, eax ; bx=用户名
004251A3 |. 83FB 00 cmp ebx, 0 ; 比较用户名是否为空
004251A6 |. 74 13 je short 004251BB ; 为空就跳了
004251A8 |. B8 01000000 mov eax, 1 ; eax=1
004251AD |. 31C9 xor ecx, ecx ; ecx清0
004251AF |> 8A0B /mov cl, byte ptr [ebx] ; 提取假注册码的第一位
004251B1 |. 80F9 00 |cmp cl, 0 ; 比较ASCII码
004251B4 |. 74 05 |je short 004251BB
004251B6 |. F7E1 |mul ecx ; eax*ecx
004251B8 |. 43 |inc ebx ; 提取下一位注册码
004251B9 |.^ EB F4 \jmp short 004251AF
004251BB |> 25 FFFFFF0F and eax, 0FFFFFFF ; CAE27680+0FFFFFFF
004251C0 |. 5B pop ebx ; 009D2314
[/LEFT]
算法思路。提取用户名的每一个啊斯克马值.进行相乘
最后得出来的值和0FFFFFFF 相加.再转换在10进制 最后得出来的结果就是注册码
注册机:
long sum=1;
for (int i=0;i<=strlen(user);i++)
{
sum=sum*user[i];
}
sum=sum+0x0FFFFFFF;
printf("%d",sum);
getchar();
本人第一次写破文。如果有不好的地方。大家别笑撒。。。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课