址对应值
004038DA |. 8B57 FC mov edx, dword ptr [edi-4] ; 该地
址对应值
004038DD |. 29D0 sub eax, edx
最终跟踪后得到,只要call1 内的序列号正确则完成注册。由此得出call1内的两个循
环体既是算法关键。具体分析见上面代码注释
sum=0;
//循环开始
sum +=user[i];
sum = sum<<8;
sum = sum | str[i];
//循环结束
sum = sum^0x12345678
sum%0xa = X
[X+428884] 即为最终序列号
既然如此我们直接写出注册机,因为算法分析出来了,所以就比较容易写出注册机了,
贴下代码:
#include<stdio.h>
#define MAX 100
int main()
{
char *str="LANNYDIBANDINGINANAKEKHYANGNGENTOT";char pass[] = {0x4C,
0x41, 0x4E, 0x4E, 0x59, 0x35, 0x36, 0x34, 0x36, 0x35, 0x32, 0x31};char
xor[MAX]="";
char user[MAX];char *password;
int i=0;int sum=0;int last; int m; int j;
password = (char*)malloc(sizeof(char*));
printf("User:");
scanf("%s", user);
//步骤 1
for(i=0; i<strlen(user) && i<strlen(str); i++)
{
sum +=user[i];
sum = sum<<8;
sum = sum | str[i];
if(sum<0) sum=-1*sum;
}
sum = sum^0x12345678;
last = sum;
//步骤 2
i=0;
while( sum != 0)
{
m = sum%0xa;
sum = sum/0xa;
m += 0x30;
if( m >= 0x3A)
{
m += 0x7;
}
xor[i]=m;
i++;
}
//步骤 3
j=0;
for(;i>0;i--)
{
m=last%0xa;
password[j] = pass[m];
j++;
last=last/0xa;
}
printf("Serial:%s\n", password);
return 0;
注册机写出来了进行一下测试看看是不是可以。
至此我们的本次Crackme逆向之旅就算是完成了,这个crackme的难度应该还算可以吧,
程序里面调用了很多函数,需要一层层去分析,是需要花费很多时间去彻底理清思路的,学
习破解逆向最好的办法就是不断地尝试。希望读者能自己去亲自调试一下,技术都是在不知
不觉的尝试中进步的。
|