-
-
[分享] 010 注册机的实现
-
发表于: 7小时前 142
-
先看版本号:

如果已经注册了可以删除这里的注册表进行测试,整个010注册表全删就行:
计算机\HKEY_CURRENT_USER\Software\SweetScape\010 Editor
可以看到未注册的说明:

随便输入一下,可以看到报错字符串(Qt窗口用的控件直接复制):

交叉引用找到位置直接 F5 可以查看前后逻辑:

显然这一块是注册成功的提示窗:

再往上翻
v21 = sub_1400088A5(g_c1, 17, 20300); //g_c1为某全局类当一块内存区域就行
进入到 sub_1400088A5 函数可以发现需要一个函数的返回值为 0x2D,暂且命名为 verifyLicense:

这个函数需要重点分析一下:
前面是一段判断用户名是否在黑名单的逻辑,我们自己生成的用户名撞车概率接近于 0 ,直接跳过:

code_buf 进入 parseLicenseKey 函数可以发现是将序列号两两转成十六进制的 unsigned char

然后可以发现是利用这个 code_buf 计算结果,判断结果:



我们发现走到 0xFC 分支一定无法返回 0x2D,所以跳过该分支
0x9C 分支计算的值跟 code_buf[4] 没关系,所以直接计算就行,过于简单跳过
主要看 0xAC 分支
首先看一下相关函数,:


其中 Mod17 这个函数的第二个参数直接 用 5999655 常量替换就行
假设原注册码为 X0X1-X2X3-X4X5-X6X7-X8X9
其中 Xi, i = 0, ..., 9 为 unsigned char
X3 = 0xAC
slat1 = decryptAndValidateValue_Mod17((X6 ^ X0) + ((X8 ^ X4) << 8) + ((X5 ^ X9) << 16);
需要保证 slat1 >= 20300
slat2 = decryptAndValidateValue_Mod11((X5 ^ X2) + ((X7 ^ X1) << 8));
需要保证 1 <= slat2 <= 5000
需要保证 X7X6X5X4 == calcCustomAvalancheHash(m_name.toUtf8().data(), true, slat1, slat2);
注意到:
X5 ^ X2 = 3B
X7 ^ X1 = A9
X6 ^ X0 = 81
X8 ^ X4 = D9
X5 ^ X9 = 95
时满足所有条件,此时 slat1 = 0xC22E,slat2 = 0x3E8,此时可以实现注册机了
可以直接复制 calcCustomAvalancheHash 的汇编,注意全局变量需要替换为自己的指针
通过 calcCustomAvalancheHash 的结果初始化 X4 ~ X7
通过异或可以计算出剩余的

附件中包含注册机源码和exe
赞赏
- [分享] 010 注册机的实现 143
- [分享]od为何进程列表显示不全 1089
- [原创]王之凝视修改资源数量 1084