本帖最后由 〇〇木一 于 2013-6-14 11:33 编辑
CrackMe是昨晚cupid912提供的,(链接:http://www.52pojie.cn/thread-199971-1-1.html)刚准备睡觉了就看见了这个CrackMe,就下下来试一下,结果一发不可收拾搞到了大半夜。真心伤不起,大牛们勿笑。
这CrackMe貌似年代有些久远,无壳,无花,新手最喜欢这种了有木有。
OD载入,搜索字符串,很快就能找到关键的地方
下个断点,试验下找到按钮事件的地方
可以得出00442FB9处为验证是否正确的关键Call,我们跟进去看下
先来看看此Call里[变量1]值的来源,回溯看看
再到Call外看看
发现[变量1]就是Codice输入的数值。
接下来
在这个Call里运行观察了几遍就会发现,不管怎样00442A16处的edi都为0,因为是相乘就导致了最后得出的ebx始终为0,最后也使00442A58处的跳转始终实现,永远不会成功。
那么我们就应该看看是什么使这个edi为0的,回溯看看
发现是初始传进来的eax赋值给的edi,再到Call外看看
发现是445830地址处的值赋给了eax,再到数据窗口看看445830的值,发现一直为0,这就奇怪了,要使Crack成功此处一定不能为0,所以肯定有某处会给这个地址赋值,要把它找出来
细心一点就能发现,
在00442F86处经过一个Call后就把eax赋值给了445830这个地址,而此处分明就是当Codice框输入的是非纯数字而提示错误之后才能运行到的代码,哈哈,现在终于发现这个CrackMe贱在了什么地方了,它跟本就是要输入两次Codice,而第一次要非纯数字,第二次要正数。
我们跟进00442F81处的Call,看看是怎么计算的要赋给445830处的值:
现在知道了,如何得到的445830处的值,我们就可以来写算法了
用输入的Nome和第一次输入的Codice来计算第2次输入的Codice值,然后注册
我自己写vc6.0的代码如下:
[AppleScript] 纯文本查看 复制代码 #include <stdio.h>
void main()
{
char n[100];
char n0[100];
printf("请输入Nome:\n");
scanf("%s",n0);
printf("请输入第一次Codice:\n");
scanf("%s",n);
//////////////////////////////////计算要写入445830处的值
int a=0x37B;
int i=1;
while(n[i])
{
a+=((n%0x11+1)*n[i-1]);
i++;
}
//printf("0x%X\n",a);
//////////////////////////////////计算第2次要输入的Codice
int c=0;
while(n0[c])
{
c++;
}
int d=0;
for(int k=0;k<c;k++)
{
for(int j=c-1;j>=0;j--)
{
d+=(n0[k]*n0[j]*a);
}
}
if(d>0x80000000)
{
d^=0xFFFFFFFF;
d-=0xFFFFFFFF;
}
d=d%0xA2C2A;
//printf("0x%X\n",d);
int g=d*0x59;
for(;g/0x59+g%0x50+1!=d;g--)
{
}
printf("第二次Codice为:\n%d\n",g);
getchar();
}
测试一下:
输入第一次Codice提示不是整数,我们点OK
再输入会出现一个again按钮,代码可以看出这个按钮和第一的按钮事件是一样的,我们就在输一次
哈哈,成功Cracked。
bang姐说过CrackMe是提高自己的有力途径。
以上献给同为新手的同胞们,大家一起加油!!!
CrackMe这里也发下:
aLoNg3x.2.rar
(141.49 KB, 下载次数: 20)
〇〇木一
2013.6.14
|