欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

基于BASE64解密算法的Turbo Note+ V4.4窗口界面注册机(15千字)

基于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/////////////////////////////////

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功