image.png (81.4 KB, 下载次数: 0)
下载附件
2021-6-23 18:20 上传
image.png (157.09 KB, 下载次数: 1)
下载附件
2021-6-23 18:20 上传
F5一下看下引用的代码:
image.png (280.57 KB, 下载次数: 0)
下载附件
2021-6-23 18:21 上传
这块是个注册码是否正确的判断分支,如果最后计算的数值大于2.843这个浮点数就GameOver了,往上找找CDKEY怎么计算的:
image.png (423.12 KB, 下载次数: 0)
下载附件
2021-6-23 18:22 上传
取出输入的用户名与CDKEY字符串,然后根据A-Z的字符转为[0,20)的浮点数值,其实小数点后面的数都不用关心,主要是为了干扰逆向分析的,应该是用了专门混淆的SSE2指令库。最后按照[A-F]对应“0”[G-Z]对应到“1-19”,最后两个相邻的整数低地址乘以20与高地址位相加,变为一个0-255的int8整数后面进行一次bit级的transform转换,将20 x 8的矩阵变换成 8 x 20的bit矩阵,得到一个新的20长度的整数数组。
image.png (96.35 KB, 下载次数: 0)
下载附件
2021-6-23 18:22 上传
翻译为python实现:
[Python] 纯文本查看 复制代码def gen_table_float(cdkey):
table = []
j = 0
for i in range(len(cdkey)):
if cdkey != '-':
base_value = 407.19
if cdkey >= 'A':
base_value = 0.0031
if cdkey >= 'G':
base_value = 1012.28
if cdkey > 3]
ret_table[i >> 3] = bit | old_value
return ret_table
后续就是把这个20长度的数组列表与用户输入的id字符串对比
image.png (338.93 KB, 下载次数: 0)
下载附件
2021-6-23 18:23 上传
另外还有个额外的比较,转换数组最后两个byte必须等于“0x55 0x46“
image.png (202.35 KB, 下载次数: 0)
下载附件
2021-6-23 18:23 上传
那么注册机就要实现这个从用户id字符串拼接为20长度的数组进行8 x 20的转换生成新的长度20整数数组,然后以20进制将单个整数一拆二扩大为40长度数组,将0-20的整数以A-Z的形式表示就是注册码了,注册机python脚本见附件
[Python] 纯文本查看 复制代码#!python3
id = '100200-400600-071'
code = 'KMLH-JEEA-RKJM-NBGR-IXHH-LRAJ-POJK-BAFC-HHHH-LRFD' # 4.0.0 注册码
def reverse_table(target_table):
ret_table = [0 for x in range(len(target_table))]
for i in range(160):
var = target_table[i // 8]
bit_value = (var >> (i % 8)) & 0x1
index = i % 20
ret_table[index] = ret_table[index] | (bit_value 0:
result.append('-')
result.append(chr(high + 70))
result.append(chr(low + 70))
return ''.join(result)
def gen_register_code(user_id):
init_table = [0 for x in range(20)]
init_table[-1] = 70
init_table[-2] = 85
for i in range(17):
init_table = ord(user_id)
ret = reverse_table(init_table)
return integer_to_hex(ret)
def main():
print(gen_register_code(id))
if __name__ == '__main__':
main()
分割线
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
SteerMouse功能主体实际是由程序包中Library目录中的“SteerMouse Manage”常驻进程实现的,它负责监控数据数据并实现转换,然后其中在:-[AppControllerClass applicationDidFinishLaunching:] 这个过程调用中会再次检查注册名及注册码的合法性,如果校验失败则会弹出试用到期的弹窗并推出。
image.png (77.1 KB, 下载次数: 0)
下载附件
2021-6-26 12:44 上传
这块的算法与控制面板的注册逻辑一样,后面会插入不一样的针对对注册名和注册码的字符范围检查:
image.png (46.08 KB, 下载次数: 1)
下载附件
2021-6-26 12:46 上传
这个是用户名字符范围判断 ‘1’-‘9’ ‘A-Z’ '(' ')' '-' 其他都非法
image.png (58.74 KB, 下载次数: 0)
下载附件
2021-6-26 12:50 上传
这块就是不一样的检查了,注册码中A-F都表示为数字“0” ,从F开始才表示“1-19“,但是要求必须大于3个的‘A’-‘E’,上个注册机就没注意这个,全部都是‘F’代替0所以还会有检验失败。
这个函数有大堆的重复注册码校验,还有一大堆的使用时间检查,注册码黑名单等等,暂时就发现这一处暗桩,不知道这样能不能”完全注册“了,有兴趣的小伙伴可以继续研究~
最后附上新注册算法代码:
[Python] 纯文本查看 复制代码#!python
import random
id = 'ABCDEF-HIJKLM-(A)'
code = 'KMLH-JEEA-RKJM-NBGR-IXHH-LRAJ-POJK-BAFC-HHHH-LRFD' # 4.0.0 注册码
def reverse_table(target_table):
ret_table = [0 for x in range(len(target_table))]
for i in range(160):
var = target_table[i // 8]
bit_value = (var >> (i % 8)) & 0x1
index = i % 20
ret_table[index] = ret_table[index] | (bit_value 0:
result.append('-')
if high == 0 and not_f_count