基于BASE64解密算法的Turbo Note+ V4.4窗口界面注册机(15千字)
Turbo Note+ V4.4窗口界面注册机课题: Turbo Note+ V4.4窗口界面注册机
出品: South Pacific InformationServices Ltd
平台: win95/98, winNT/2000
http://turbopress.com/tnplus44.exe
尺寸: 769KB
工具: LCC-WIN32
关键字: 软件破解 注册机
TurboNote+的注册码限定在0-9、A-Z、a-z、“+”和“/”的有效值范围内,由以下部
分组成:
第一部分,4位,随机码。
第二部分,4位,由注册时申请连接的计算机台数经两遍运算得出。
第三部分,4位,随机码。
第四部分,4-36位,由用户给出的全注册名经两遍运算得出。
第五部分,4位,由用户给出的注册名的累加和经一遍运算得出,允许末两位为
“==”。
注意:累加和只是以指定的算法求出的有限长度的前N位注册名的累加和。
运算模式一,用于第二部分和第四部分的第一遍运算:
四位ASC码一组:
A(i)B(i)C(i)D(i) xor 0xff3f7fde
运算模式二,用于第二部分和第四部分的第二遍运算以及第五部分的运算:
三位ASC码一组,作为例外,第二部分注册时申请连接的计算机台数以及第五部分的累
加和是事先转换为长整数再参与运算的:
(A(i)<<8|B(i))<<8|C(i)
得到的结果再以四位为一组:
O(i)P(i)Q(i)R(i)/0x40取余得R'(i)
O(i)(P(i)Q(i)R(i)/0x40/0x40取余得Q'(i)
O(i)(P(i)Q(i)R(i)/0x40/0x40/0x40取余得P'(i)
O(i)(P(i)Q(i)R(i)/0x40/0x40取商得O'(i)
重组为O'(i)P'(i)Q'(i)R'(i).
以上混合使用了算术表达和逻辑表达,只是为了较清楚地说明运算过程。这里:
>>6 等效于 /0x40
<<8 等效于 *0x100
然后,用运算结果去查表,以对应的下脚标为新值。
运算模式三,用于求出计算累加和的有限长度的位数N
N = 用户给出的全注册名长度减1后的能被3整除的最大数。
运算模式四,用于求出计算前N位注册名的累加和:
累加和 = 用户给出的全注册名前N位的累加和
下面介绍用LCC-WIN32(一个小巧的C集成编译环境)为TurboNote+写的一个窗口界面的
注册机。
LCC-Win32是运行于Windows9x/Me/NT/2000下的免费的32位C语言编译系统。它的原始发
布文件只有 3M,但却拥有一个功能强大的集成开发环境(IDE)、速度极快的编译器与连
接器、方便顺手的调试器、资源编辑器和版本控制系统。另外还提供图像编辑器和C 语
言源文件格式化缩进器等附加工具。你可以用LCC-Win32开发32位的控制台程序、
Windows常规程序、动态连接库(DLL)以及静态连接库(LIB)。LCC编译器支持标准的ANSI
C,同时支持 C语言的扩展。
注册码生成的C语言实现:
在下面的注册机源代码中已有清楚的注释,只对几处要点加以说明:
1、随机数:LCC的库中没有RANDMON()函数,可用下面方法实现:
srand(time(NULL));
for(i=0;i<4;i++)Buff0[i]=Buff1[rand()%j];
其中 rand()%j 能确保所引用的数据脚标不大于串的实际长度。
2、数值转换:
申请连接的计算机台数输入值是ASC码,必需转换成为长整数才能参与运算:
q=atol(Buff2);
3、下脚标:
我在C语言中没能发现有返回下脚标的函数,只好查表求出字符所在位置的指针,然后
减去字符串首指针,实现返回下脚标:
Buff0[j] = (int)memchr(Key1,q%64,192)-(int)Key1;
由于实现了窗口界面,有条件使用户界面更加友好,采取了以下措施:
1、OK按钮初始化为灰色,只有用户名长度大于3,申请连接的计算机台数不为0时,才
加亮。进行过一次运算后,编辑框必需清空,才能再次启用OK按钮。
DEFPUSHBUTTON "OK", IDOK, 20, 87, 40, 14, WS_DISABLED
if (Len1 > 3 && Len2 > 0 && w==0)EnableWindow(IDOKCode,1);
2、Key输出框设定为只读;控制状态改变时,加亮状态不可改变;并初始化为禁止访问。
EDITTEXT IDKey, 60, 58, 144, 12, ES_NOHIDESEL | ES_READONLY | WS_DISABLED
3、限制输入串长和限制输入字符不采用提示,而是用程序实现限制。
注意:有效字符区域除了可显示字符外,还应包括必要的编辑键,其中:
08 ← 退格
03 Ctrl + C 复制
0x16 Ctrl + V 粘贴
0x18 Ctrl + X 剪切
注意不要被屏蔽掉。
其它编辑键象Home、End、Page Up、Page Down、Ins、Del、Tab及方向键受系统支持,
不可能被屏蔽,可以不考虑。
4、使初始状态控制光标停留在用户名输入框中:
这个功能不是用命令语句实现的,而是使用了一个小小的技巧。在处理初始化消息
WM_INITDIALOG时,只要返回1,控制光标就一定会停留在资源脚本文件中第一个出现
的控制中。而大多数集成编译环境在自动生成资源脚本文件时,都会让OK键放在第一
个控制的位置上。这就是为什么刚刚编出来的程序,控制总是停留在OK键上的原因。
所以,除了返回1外,还应该用文本编辑器打开资源脚本文件tbnotekeygen.rc,将你
想要初始状态控制光标停留在那上面的编辑框放在紧靠BEGIN的第一行:
BEGIN
EDITTEXT IDYour_name, 60, 18, 130, 12, ES_AUTOHSCROLL | WS_GROUP
5、加亮输出的注册码:
我始终没有搞清在非MFC环境中哪些C语言函数可以实现文本加亮,只好使用下面的笨办
法:先用GetNextDlgTabItem(hwndDlg,0,0)获得第一个控制(不知为什么,这个函数的
名字和它的实际功能不符),增加一个偏移量,让它指向第二个控制,再用SetFocus()
函数把焦点设定在第二个控制上,紧接着用keybd_event()函数模拟一个Tab键,第三
个控制就处于加亮状态了。
SetFocus((HWND)((long)GetNextDlgTabItem(hwndDlg,0,0)+4));//焦点定位
keybd_event(9,0,0,0); //模拟按下TAB键
keybd_event(9,0,2,0); //模拟松开TAB键
由于已经设定了Key注册码输出框控制状态改变时,加亮状态不可改变(ES_NOHIDESEL),
所以此时即使用Tab键改变控制,输出的注册码总是加亮的。
有人会问,把焦点再定位在清空键上,不是更加友好吗?那是因为Lcc自动把回车键捆绑在
OK键上,这不失是一个友好的安排,我就保留了它。
6、将结果放入剪切板中:
剪切板使用的是系统内存,而不是分配给线程的内存,所以不能简单地直接使用
SetClipboardData()函数,而是要先申请系统内存,锁定后复制,复制后解锁;另外,
打开、清空和关闭剪切板也是必不可少的:
OpenClipboard(hwndDlg);
EmptyClipboard();
hGlobal = GlobalAlloc(GMEM_ZEROINIT, lstrlen(Buff0)+1);
if (hGlobal == NULL) return;
strcpy(GlobalLock(hGlobal), Buff0);
GlobalUnlock(hGlobal);
SetClipboardData(CF_TEXT, hGlobal);
CloseClipboard();
注册机源代码如下:
/////////////////////////Begin of tbnotekeygenres.c////////////////////////
/*@@ Wedit generated application. Written Mon Dec 31 19:31:37 2001
/*<---------------------------------------------------------------------->*/
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <string.h>
#include <time.h>
#include "tbnotekeygenres.h"
/*<---------------------------------------------------------------------->*/
static BOOL CALLBACK DialogFunc(HWND, UINT, WPARAM, LPARAM);
WNDPROC LimitCharYour_nameProc = 0;
int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
memset(&wc,0,sizeof(wc));
wc.lpfnWndProc = DefDlgProc;
wc.cbWndExtra = DLGWINDOWEXTRA;
wc.hInstance = hinst;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszClassName = "Cubprisoner";
RegisterClass(&wc);
return DialogBox(hinst, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL,
(DLGPROC) DialogFunc);
}
int __stdcall LimitCharProc(HWND hwndDlg, UINT message, WPARAM wparam,
LPARAM lparam) //限制输入字符
{
TCHAR chCharCode;
if(message == WM_CHAR)
{
chCharCode = (TCHAR) wparam;
if(chCharCode == 0x03 || chCharCode == 0x08 || chCharCode == 0x16
|| chCharCode == 0x18 || chCharCode == 0x2b || chCharCode >= 0x2f
&& chCharCode <= 0x39 || chCharCode >= 0x41 && chCharCode <= 0x5a
|| chCharCode >= 0x61 && chCharCode <= 0x7a) //有效字符区域
{
return(CallWindowProc(LimitCharYour_nameProc,
hwndDlg, message, wparam, lparam));
}
else return(0);
}
else return(CallWindowProc(LimitCharYour_nameProc, hwndDlg, message,
wparam, lparam));
}
/*<---------------------------------------------------------------------->*/
void RegProc(HWND hwndDlg, WPARAM wParam) //注册过程
{
const unsigned char Key0[4] = {0xde,0x7f,0x3f,0xff}; //0xff3f7fde
HGLOBAL hGlobal; // Global memory handle
TCHAR Buff0[60];
TCHAR Buff1[45];
TCHAR Buff2[32];
register int Slen,i=0,j,k,m=0;
long q,sum=0;
Slen = GetDlgItemTextA(hwndDlg,IDYour_name,Buff0,32)-1;
for(i=0;i<(Slen-Slen%3);i++)sum+=Buff0[i]; //计算名字累加和
Slen++;
k=Slen%3;
if(k!=0) //补0使串长能被3整除
{
k=3-k;
m=k;
while(k)
{
Buff0[Slen+k] = 0;
k--;
}
}
Slen+=m;
for (i=0;i<Slen;i++)Buff1[i]= Buff0[i]^Key0[i%4];//对名字做第一遍处理
Buff1[Slen] = 0;
Buff1[Slen+1] = 0;
CharOperation(Buff1); //对名字做第二遍处理
j=strlen(Buff1);
srand(time(NULL));
for(i=0;i<4;i++)Buff0[i]=Buff1[rand()%j]; //生成第一节随机串
Buff0[4] = 0;
GetDlgItemTextA(hwndDlg,IDComputers,Buff2,5);//取计算机台数
q=atol(Buff2); //对计算机台数做第一遍处理
if(q>0xff)q=0xff; //计算机台数设限
q^=0xff3f;
strcat(Buff0,(TCHAR *)CharOperation(&q));//对计算机台数做第二遍处理,
//生成首段注册码
j=strlen(Buff0);
srand(time(NULL));
for(i=0;i<4;i++)Buff0[i+j]=Buff0[rand()%(i+j)]; //生成第三节随机串
Buff0[j+i] = 0;
strcat(Buff0,Buff1);//生成前段注册码
strcat(Buff0,(TCHAR *)CharOperation(&sum)); //生成全部注册码
SetDlgItemTextA(hwndDlg, IDKey, Buff0);
OpenClipboard(hwndDlg); //将结果放入剪切板中
EmptyClipboard();
hGlobal = GlobalAlloc(GMEM_ZEROINIT, lstrlen(Buff0)+1);
if (hGlobal == NULL) return;
strcpy(GlobalLock(hGlobal), Buff0);
GlobalUnlock(hGlobal);
SetClipboardData(CF_TEXT, hGlobal);
CloseClipboard();
return ;
}
TCHAR *CharOperation(TCHAR *Buff)
{
const unsigned char Key1[192]=
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3E,0xFF,
0xFF,0xFF,0x3F,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0,1,2,3,4,5,6,7,8,9,0x0A,0x0B,0x0C,0x0D,0x0E,
0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,
0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0xFF,0xFF,
0xFF};
TCHAR Buff0[45];
register int Slen,i=0,j;
register long q;
Slen=strlen((char *)Buff);
for (i=0,j=0;i<Slen;i+=3,j+=4) //第二遍处理
{
q = ((Buff[i]&0xff)<<8|(Buff[i+1]&0xff))<<8|Buff[i+2]&0xff;
for (j+=3;j%4!=0;j--)
{
Buff0[j] = (int)memchr(Key1,q%64,192)-(int)Key1;//用余查
//表,取其下脚标
q^=q%64;
q/=64;
}
Buff0[j] = (int)memchr(Key1,q,192)-(int)Key1; //用商查表,
//取其下脚标
}
Buff0[j] = 0;
strcpy(Buff, Buff0);
return Buff;
}
static BOOL CALLBACK DialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam,
LPARAM lParam) //主程序
{
static HWND IDOKCode;
static HWND IDKeyCode;
static HWND InClipboardCode;
static int w=0;
TCHAR Buff0[32];
register int Len1,Len2; //串长
switch (msg) {
case WM_INITDIALOG: //初始化
IDOKCode = GetDlgItem(hwndDlg,IDOK); //取按钮句柄
IDKeyCode = GetDlgItem(hwndDlg,IDKey); //取对话框句柄
InClipboardCode = GetDlgItem(hwndDlg,InClipboard); //取提示句柄
SendMessage(GetDlgItem(hwndDlg, IDYour_name), EM_LIMITTEXT,
32, 0L); //限制输入串长
SendMessage(GetDlgItem(hwndDlg, IDComputers), EM_LIMITTEXT, 5, 0L);
LimitCharYour_nameProc = (WNDPROC) SetWindowLong(GetDlgItem
(hwndDlg, IDYour_name), GWL_WNDPROC, (long) LimitCharProc);//限制输
//入字符
return 1;
case WM_COMMAND: //响应输入
Len1 = GetDlgItemText(hwndDlg,IDYour_name,Buff0,32); //有有效输入
//时使能OK键
Len2 = GetDlgItemText(hwndDlg,IDComputers,Buff0,5);
if (Len1 > 3 && Len2 > 0 && w==0)EnableWindow(IDOKCode,1);
else EnableWindow(IDOKCode,0);
switch (LOWORD(wParam)) {
case IDOK:
RegProc(hwndDlg, wParam); //注册过程
EnableWindow(IDKeyCode,1);
EnableWindow(InClipboardCode,1);
w=1;
SetFocus((HWND)((long)GetNextDlgTabItem(hwndDlg,0,0)+4));
//焦点定位
keybd_event(9,0,0,0); //模拟按下TAB键
keybd_event(9,0,2,0); //模拟松开TAB键
//OpenClipboard(hwndDlg);//EnableWindow(IDOKCode,0);
//SetClipboardData(CF_TEXT,0);//Code);
return 0;
case IDErease: //清除输入,重新禁止OK键
SetFocus(GetNextDlgTabItem(hwndDlg,0,0)); //焦点归位
SetDlgItemTextA(hwndDlg,IDYour_name,0);
SetDlgItemTextA(hwndDlg,IDComputers,0);
SetDlgItemTextA(hwndDlg,IDKey,0);
EnableWindow(InClipboardCode,0);
EnableWindow(IDKeyCode,0);
EnableWindow(IDOKCode,0);
w=0;
return 1;
case IDCANCEL: //退出
EndDialog(hwndDlg,0);
return 1;
}
break;
case WM_CLOSE:
EndDialog(hwndDlg,0);
return TRUE;
}
return FALSE;
}
/////////////////////End of tbnotekeygenres.c//////////////////////////////
/////////////////////Begin of tbnotekeygen.rc//////////////////////////////
#ifdef __LCC__
#include <windows.h>
#endif
#include "tbnotekeygenres.h"
IDD_MAINDIALOG DIALOG 121, 40, 210, 107
STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Key Generator for Turbo Note + V4.4 Program by Cubprisoner"
FONT 12, "Fixedsys"
BEGIN
EDITTEXT IDYour_name, 60, 18, 130, 12, ES_AUTOHSCROLL | WS_GROUP
EDITTEXT IDComputers, 60, 38, 24, 12, ES_AUTOHSCROLL | ES_NUMBER
EDITTEXT IDKey, 60, 58, 144, 12, ES_NOHIDESEL | ES_READONLY | WS_DISABLED
DEFPUSHBUTTON "OK", IDOK, 20, 87, 40, 14, WS_DISABLED
PUSHBUTTON "Erease", IDErease, 82, 87, 40, 14
PUSHBUTTON "Cancel", IDCANCEL, 140, 87, 40, 14
RTEXT "Your name:", Your_name, 9, 20, 41, 12
RTEXT "Computers:", Computers, 9, 40, 41, 12
RTEXT "Key:", ID_Key, 34, 59, 16, 12
LTEXT "The key has been in the System Clipboard.", InClipboard, 39, 74, 165, 8, WS_DISABLED | NOT WS_GROUP
END
/////////////////////End of tbnotekeygen.rc////////////////////////////////
/////////////////////Begin of tbnotekeygen.h///////////////////////////////
#define IDD_MAINDIALOG 100
#define IDErease 101
#define IDYour_name 102
#define IDComputers 103
#define Your_name 104
#define Computers 105
#define IDKey 106
#define ID_Key 107
#define InClipboard 108
/////////////////////End of tbnotekeygen.h/////////////////////////////////
