标签:span length 字符转换 长度 技术 string alt 查看 item
可见 name文本长度 >0x13 或 <=3 均会失败
接下来计算name哈希值
通过GetUserNameA 来获取当前系统用户名
并计算SysUserName字符串 哈希值
再接着计算 name 和 SysUserName 的哈希值
通过把这三个哈希值 都转换成ANSI码 字符串 放入同一个缓冲区 得到一串ANSI码字符串
序列号格式化, 并填充指定位置为指定数据
接下来就是一些对比的操作
0x04.注册机的编写
1 //计算字符串哈希值
2 DWORD C__02_注册机Dlg::CalcHash_str(PBYTE name, DWORD len)
3 {
4 DWORD ret = 0;
5 int temp_len = len; //长度参数
6 DWORD dwTemp = 0;
7 do
8 {
9 *(PBYTE)&dwTemp = (BYTE)*name;
10 dwTemp = (DWORD)(ret * 72 - dwTemp - 111);
11 ret = dwTemp ^ 0xBACAF;
12 ++name;
13 --temp_len;
14 } while (temp_len);
15
16 return ret;
17 }
18
19 //计算两个整形的哈希值
20 DWORD C__02_注册机Dlg::CalcHash_dword(DWORD a1, DWORD a2)
21 {
22 return (a2 ^ a1 ^ 0xFFAC) + (a2 ^ 0x553) - 1 + (a2 ^ 0x553) + a1;
23 }
24
25 //把哈希值转为字符串
26 bool C__02_注册机Dlg::toAnsi(char* Buffer, DWORD hash)
27 {
28 Buffer += 7;
29 for (int i = 0; i < 8; i++)
30 {
31 DWORD a = hash % 0x10 + 0x30;
32 if (a >= 0x3A)
33 {
34 a += 7;
35 }
36 *Buffer = a;
37 Buffer--;
38 hash /= 0x10;
39 }
40 return true;
41 }
42
43 //填充格式化序列号
44 void C__02_注册机Dlg::FillSer(char* buff)
45 {
46 *(buff + 4) = 0x2D;
47 *(buff + 4 + 10) = 0x2D;
48 *(buff) = 0x4B;
49 *(buff + 1) = 0x4F;
50 *(buff + 2) = 0x53;
51 }
52
53
54 //按钮事件
55 void C__02_注册机Dlg::OnBnClickedButton1()
56 {
57 CString str;
58 m_Edit_Name.GetWindowTextW(str); //获取用户输入name
59 if (str.IsEmpty())
60 {
61 AfxMessageBox(L"请输入name!");
62 return;
63 }
64 if (str.GetLength() <=3 || str.GetLength() > 19)
65 {
66 AfxMessageBox(L"name长度不合法.(合法长度>3 && <=19)");
67 return;
68 }
69
70 char szName[MAX_PATH] = { 0 };
71 WideCharToMultiByte(CP_ACP, 0, str.GetBuffer(), str.GetLength(), szName, MAX_PATH, 0, 0); //宽字符转换多字节
72
73 DWORD haxi_Name = CalcHash_str((PBYTE)szName, strlen(szName));
74
75 DWORD pcbBuffer = MAX_PATH;
76 char szUserName[MAX_PATH] = { 0 };
77 GetUserNameA(szUserName, &pcbBuffer); //获取系统用户名
78
79 DWORD haxi_UserName = CalcHash_str((PBYTE)szUserName, strlen(szName));
80 DWORD haxi_Double = CalcHash_dword(haxi_Name, haxi_UserName);
81
82 char szBuf[25] = { 0 };
83 toAnsi(&szBuf[0], haxi_UserName);
84 toAnsi(&szBuf[8], haxi_Double);
85 toAnsi(&szBuf[16], haxi_Name); //哈希值转换字符串
86 FillSer(szBuf); //格式化填充序列号
87
88 str = szBuf;
89 m_Edit_Serial.SetWindowTextW(str); //计算完毕
90 }
测试成功!
标签:span length 字符转换 长度 技术 string alt 查看 item
原文地址:https://www.cnblogs.com/wensday/p/9099557.html