首先俺是一个菜鸟。关于算法也是第一次思考。
下面是关于这次思考的思路:
这段是加解密三中的原文:
++++++++++++++++(P28—P30)+++++++++++++++++++++++
unsigned char Table[8] = {0xC,0xA,0x13,0x9,0xC,0xB,0xA,0x8}; //数据表,全局变量
BOOL GenRegCode( TCHAR *rCode, TCHAR *name ,int len)
{
int i,j;
unsigned long code=0;
for(i=3,j=0;i<len;i++,j++)
{
if(j>7) j=0;
code+=((BYTE)name[i])*Table[j]; }
wsprintf(name,TEXT("%ld"),code);
if(lstrcmp(rCode, name)==0)
return TRUE;
else
return FALSE;
}
。。。。。。
。。。。。
“反汇编的分析”
。。。。。
。。。。。。
这样一个程序就分析完了,读者感兴趣,可以写出这段代码的逆算法,写出注册机。
++++++++++++++++++++++++++++++++++++++++++++++++++
我知道写注册机应该就是根据的汇编代码搞清算法
但是逆算法呢?
上面这个示例是根据用户名算出的序列号
逆算法是用已知的序列号算法出用户名吗?
(本人纯属菜鸟,请高人莫笑)
如果是,那么我是这样推的(当然我搞不定呢,搞的定就不叫求助,呵呵)
我就是用序列号减去用户名从i 算到用户名的长度len,而这个len又不知道他的值
而假设我知道了len 后面又该如何呢?
下面的代码很是乱(本人太菜,写东西很乱)
unsigned char Table[8] = {0xC,0xA,0x13,0x9,0xC,0xB,0xA,0x8};
long rCode=0;
long code=0;
printf("请输入序列号");
scanf("%ld",&rCode);
int i=3,j=0;
while(true)
{
code=rCode-name[i]*Tabel[j]-code; //这里可行吗?这里的name数组又应该怎//样去定义呢?或者我们可以用文中那
//个正向的算法推出code在某一大
//小范围时用户名name的长吗?
if(code = =0)
break;
i++;
j++;
}
int len = i++; //len 为用户名的长度
for(i = 3, j = 0 ; i < len ; i++, j++)
{
name[i]*Tabel[j]+………+name[len-1]*Tabel[len-4]; //这里又应该怎样呢!
}
当然如果有其他的方法不妨分享一下。
谢谢耐心看完我的问题!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课