刚开始学逆向工程,看雪真是个好地方。没能参加逆向分析挑战赛,感到很遗憾。
昨天把第一道题做了,勉强还可以写出算法注册机。
原码如下:
#include<iostream>
using namespace std;
void tra(char[],int);
int num=0; //存放注册码的位数
unsigned int cal1=0; //存放对用户名处理后的值
char reg[1200]; //存放注册码
int main()
{
char user[0x14]; //存放用户名
char cal2[9]={0,0,0,0,0,0,0,0,1};//存放cal1后几位二进制值以及1
unsigned int ml=0;
printf("用户名: ");
scanf("%s",user);
int len=strlen(user);
/*
计算用户名,得到处理后的值放入m1中
*/
__asm{
xor edx,edx
mov ebx,13572468h
mov ecx,dword ptr[ebp-28h]
f: movsx eax,byte ptr[ebp+edx-14h]
add eax,ebx
imul eax, eax, 3721273h
add eax, 24681357h
mov esi, eax
shl esi, 19h
sar eax, 7h
or esi, eax
inc edx
cmp edx, ecx
mov ebx, esi
jl f
mov dword ptr[ebp-24h],ebx
}
cal1=ml;
/*
计算cal1后几位二进制,放入cal2数组中
*/
for(int j=1;j<=8;j++)
{
unsigned mt=cal1>>j;
mt&=1;
cal2[j-1]=mt;
}
int i;
/*
生成注册码,放入reg数组中
*/
int min=0;
while(cal2[min]==0) min++;
int max=8;
while(cal2[max]==0) max--;
while(min<=max)
{
if(cal2[min+1]==0&&min!=max)
{
cal2[min+1]=!cal2[min+1];
reg[num]=(10+min+1+1-(cal1>>(num%31))%10)%10 +48;
num++;
}
tra(cal2,min);
min++;
}
/*
打印注册码
*/
printf("注册码: \n");
for(i=0;i<num;i++)
printf("%c",reg[i]);
printf("\n");
return 0;
}
/*
输入:数组cal2
整型数n
输出:无
功能:将cal2数组中第n位取反,要求第0至n-1都是0
*/
void tra(char cal2[9],int n)
{
if(n==0){
cal2[0]=!cal2[0];
reg[num]=(10+1-(cal1>>(num%31))%10)%10 +48;
num++;
return;
}
tra(cal2,n-1);
cal2[n]=!cal2[n];
reg[num]=(10+n+1-(cal1>>(num%31))%10)%10 +48;
num++;
tra(cal2,n-1);
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)