Windows優化大師v3.0-v3.4的序號產生器原始碼

看雪資料發表於2015-11-15

Windows優化大師v3.0-v3.4的序號產生器原始碼

時空幻影於2001年3月15日

我在《Windows優化大師》這個軟體開始使用某種加密演算法時就在破解時有點摸不著頭腦,不知道這個演算法是RSA加密演算法。自從幾個月前拜讀了《論壇精華Ⅱ》中的《Windows優化大師v2.9+的註冊碼加密演算法》一文後我就開始按照該文所講的方法編寫序號產生器,從此噩夢開始......

我先把n=0x0000000069AAA0E3進行因子分解求出p=0x80BD和q=0xD21F,於是就求得f=0x0000000069A53372,然後又按照第四條規則很辛苦地程式設計求出d=0x000000003E0877FD。至此我想應該可以順利地編寫出序號產生器了吧,然而作出來的序號產生器不但算出來的註冊碼不對,而且用加密演算法算出來的結果不能用解密演算法還原成原來輸入的兩個數值。這個問題一直弄得我頭大,直到最近我從別人那弄的一個註冊申請碼和正確的註冊碼,我才算出解密金鑰d不是0x000000003E0877FD,而是0x00000000002C86F9,於是我終於寫成了序號產生器。

原始碼如下:(C++ Builder 5.0編譯通過)

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

unsigned __int64 __fastcall Encrypt_Decrypt(unsigned __int64 m,unsigned __int64 e,unsigned __int64 n)
{
unsigned __int64 a,b,c;

a=m;
b=e;
c=1;

while(b)
{
if ((b%2)==0)
{
b=b/2;
a=(a*a)%n;
}
else
{
b=b-1;
c=(c*a)%n;
}
}
return (c);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button2Click(TObject *Sender)
{
Application->MessageBox("時空幻影於2001年3月12日,如有什麼問題請E-MAIL:shikonghuanying@sina.com","關於",MB_OK);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned __int32 s[4]={0x20756f59,0x20657261,0x20676962,0x2e676970};//"You are big pig."的記憶體表示
unsigned __int32 t1=0,t2=0,esi=0x9e3779b9,temp;
unsigned __int64 n=0x69aaa0e3,d=0x002c86f9,m1,m2,n1,n2,t;
int i,j;
AnsiString Buffer=Edit1->Text;
if (Edit1->Text.IsEmpty())
{
Application->MessageBox("請輸入註冊申請碼!","提示",MB_OK);
return;
}
Buffer=Buffer+"1234567";
Buffer.SetLength(8);
i=4;
while (i>0)
{
t1=0x100*t1+(StrToInt(Buffer[i])+0x30);
i--;
}
i=8;
while (i>4)
{
t2=0x100*t2+(StrToInt(Buffer[i])+0x30);
i--;
}
for (j=0;j<32;j++)
{
temp=t2<<4;
t1=t1+temp+(s[0]^t2);
temp=t2>>5;
t1=t1+(temp^esi)+s[1];
temp=t1<<4;
t2=t2+temp+(s[2]^t1);
temp=t1>>5;
t2=t2+(temp^esi)+s[3];
esi=esi+0x9e3779b9;
}
t1=t1+2;
i=0;
j=0;
temp=t1;
if (t1>0x3fffffff)
{
temp=t1&0x0fffffff;
s1:
;
if (temp<=0x3fffffff)
{
j=1;
while (j<=4)
{
t=j*0x100000000+(temp<<2);
if ((t>>2)%0x100000000==t1) goto s2;
else j++;
}
i=i+0x10000000;
temp=temp+0x10000000;
if (i<0x40000000) goto s1;
}
}
s2:
;
m1=temp;
m2=(0x50|j)+2;
n1=Encrypt_Decrypt(m1,d,n);
n2=Encrypt_Decrypt(m2,d,n);
Edit2->Text=IntToHex((__int64)n1,8);
Edit3->Text=IntToHex((__int64)n2,8);
}
//---------------------------------------------------------------------------

相關文章