看了坛友们的许多精华帖子,也看了H大和小生等前辈的教学视频,很后悔没有在大学的时候就加入吾爱大家庭,但我相信,只要肯学什么时候都不晚!愿和吾爱的坛友们共同进步!以下是晚辈的第一次破解(感觉也算不上破解,就是钻了个空子),说的不好的地方还请各位大佬指导(PS:楼主计算机专业-程序狗一枚)
起因:最近朋友发给我一款帝国时代3的联机外挂,卖的人管我朋友要50,凑巧最近正在泡吾爱论坛,遂决定见义勇为一把,尝试一下哈~
-------------分割线------------------
1.查壳-用的H大推荐的新手软件ExeInfo
点比较高,发现是C#的程序,没有加壳好的,进行下一步!
2.反编译分析
因为看的帖子都是关于OD的,所以开始也用了OD,但是每回一拖进去程序就直接运行了(因为是新手,与平常看的教程有点出入,一脸泰勒展开式蒙蔽),于是开始搜索论坛的帖子。大致知道了OD对于破解.Net程序微微有些不足,遂切换工具,选择了爱盘的DnSpy。
拖入查看
分析了一下主文件,重点来了!!!不知道大家有没有看到那个SerialNumber的类,我不管怎么看都像关于序列号验证的函数。点进去一看,果不其然!这个就是计算序列号的然后把你输入的序列号和程序计算出的一对比,一致就激活,不一致就退出程序。因为最近一直都在跟着H大等大佬们学习OD的内容,.Net爆破可能有些力不从心,遂打算写个程序直接计算出效验码得了。
3.分析算法
根据DnSpy反汇编的内容,可以分析出算法如下:
(1)取得系统时间,并格式化处理
(2)取10位数字存入数组,分别是
以下均已系统时间为准
(2-1)年份的后两位 即2018 ---> 18
(2-2)月份的两位 即03 ---> 03
(2-3)日期的两位 即11 ---> 11
(2-4)小时的两位 即14:00:05 ---> 14
(2-5)第九位数字为前八位数字的和余9 即 (1+8+0+3+1+1+1+4)%9 --->1
(2-6)第十位数字为前九位数字的和余9 即 (1+8+0+3+1+1+1+4+1)%9 --->2
(3)生成序列号
在上一步骤所得数组进行扩展,需得出两组新的数组
新的数组一:将基础数组每个数据加上65即ASCII码的A基础上进行偏移 -暂且命名为a[10]
新的数组二:将基础数组每个数据加上75即ASCII码的K基础上进行偏移 -暂且命名为b[10]
然后以下列形式构建激活码:
‘U'+a[0]+a[1]+b[0]+b[1]+'-'+a[2]+'V'+a[3]+b[2]+b[3]+'-'+a[4]+a[5]+'W'+b[4]+b[5]+'-'+a[6]+a[7]+b[6]+'X'+b[7]+'-'+a[8]+a[9]+b[8]+b[9]+'Y'
OK了,算法都出来了,基本就完成了,写个计算的程序还不是分分钟的事儿?
4.编写程序,计算序列号(楼主选则了C语言)
[C] 纯文本查看 复制代码 #include <stdio.h>
#include <time.h>
int main()
{
int temp[10] = {0};
char serial[30]={0};
char code[6]="UVWXY";
char *textName="SerialNumber.txt";
FILE *fp;
if((fp = fopen(textName,"w+"))==NULL)
{
printf("Open file error !!!");
return 0;
}
int i=0,j=0;
time_t t;
struct tm *lt;
time(&t);
lt = localtime(&t);
fprintf(fp,"%d %d %d %d:%d:%d \n",lt->tm_year+1900,lt->tm_mon+1,lt->tm_mday,lt->tm_hour,lt->tm_min,lt->tm_sec);
for(i=0;i<5;i++)
{
int count = 0;
switch(i)
{
case 0:
{
temp[0] = (lt->tm_year+1900)/10%10;
temp[1] = (lt->tm_year+1900)%10;
break;
}
case 1:
{
temp[2] = (lt->tm_mon+1)/10%10;
temp[3] = (lt->tm_mon+1)%10;
break;
}
case 2:
{
temp[4] = (lt->tm_mday)/10%10;
temp[5] = (lt->tm_mday)%10;
break;
}
case 3:
{
temp[6] = (lt->tm_hour)/10%10;
temp[7] = (lt->tm_hour)%10;
break;
}
case 4:
{
int sum=0,i1=0;
for(i1 = 0;i1<8;i1++)
{
sum+=temp[i1];
}
temp[8] = sum%9;
temp[9] = (sum+temp[8])%9;
break;
}
default:
{
break;
}
}
for(j=0;j<5;j++)
{
if(i==j)
{
continue;
}
count++;
if(count<3)
{
serial[i*6+j] = count==2?65+temp[i*2+1]:65+temp[i*2];
}
else
{
serial[i*6+j] = count==4?75+temp[i*2+1]:75+temp[i*2];
}
}
if(i!=4)
{
serial[i*6+5]='-';
}
serial[i*6+i]= code[i];
}
serial[29]= '\0';
fprintf(fp,"This is serial number : %s \n",serial);
fclose(fp);
return 0;
}
源码贴出,和大家分享,编译本代码后,运行可执行文件,在执行目录下,会生成一个SerialNumber.txt的文件,激活码就写在里面了!
附件是帝国时代Ⅲ的外挂和我写的程序的源代码,由于楼主不玩这种游戏(一只CSGO菜鸟一枚),所以也没有验证这个挂好不好使。
至此,破解就完成了!如果各位吾爱的小伙伴喜欢的话,请不要吝啬你们的大赏哈! |