【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验

  • A+
所属分类:逆向工程

作者坛账号:


SteerMouse是款MacOS上关闭USB外接鼠标的加速度,滚轮加速度(这个USB外接也用触摸板的滚动加速度把我恶心坏了),修改鼠标前进返回键等功能,本想论坛找下注册码用用,无果就自己分析下算法看看能不能搞个注册码给大伙带点福利。


分析的是5.5.6版本。由于MacOS平台的XPC服务组件的调试需要关闭SIP,操作起来还比较麻烦,索性把bin拖进IDA里直接找找注册算法长什么样,IDA用的是官方Free版,对付防护精简小工具应该搓搓有余的。进去先找下输入注册码错误信息:

【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验


【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验


F5一下看下引用的代码:

【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验


这块是个注册码是否正确的判断分支,如果最后计算的数值大于2.843这个浮点数就GameOver了,往上找找CDKEY怎么计算的:

【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验


取出输入的用户名与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长度的整数数组。

【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验


翻译为python实现:

def gen_table_float(cdkey):    table = []    j = 0for i in range(len(cdkey)):if cdkey[i] != '-':            base_value = 407.19if cdkey[i] >= 'A':                base_value = 0.0031if cdkey[i] >= 'G':                    base_value = 1012.28if cdkey[i] <= 'Z':                        base_value = 0.0024 + float(ord(cdkey[i]) - ord('F'))            table.append(base_value)print(table)print(len(table))    mix_table = []for i in range(20):        mix_table.append(int(float(int(table[i*2] * 20.0) & 0xFF) + (table[i*2 + 1])) & 0xFF)print(mix_table)    ret_table = [0 for x in range(20)]for i in range(160):var = mix_table[i % 0x14]        bit = 1 if (var & (1 << (i // 0x14))) else 0        bit = bit << (i & 7)        old_value = ret_table[i >> 3]        ret_table[i >> 3] = bit | old_valuereturn ret_table


后续就是把这个20长度的数组列表与用户输入的id字符串对比

【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验


另外还有个额外的比较,转换数组最后两个byte必须等于“0x55 0x46“

【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验


那么注册机就要实现这个从用户id字符串拼接为20长度的数组进行8 x 20的转换生成新的长度20整数数组,然后以20进制将单个整数一拆二扩大为40长度数组,将0-20的整数以A-Z的形式表示就是注册码了,注册机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 << i // 20)return ret_table



def integer_to_hex(int_array): result = []for i in range(len(int_array)): high = int_array[i] // 20 low = int_array[i] % 20if i % 2 == 0 and i > 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] = 85for i in range(17): init_table[i] = ord(user_id[i]) 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:] 这个过程调用中会再次检查注册名及注册码的合法性,如果校验失败则会弹出试用到期的弹窗并推出。

【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验


这块的算法与控制面板的注册逻辑一样,后面会插入不一样的针对对注册名和注册码的字符范围检查:

【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验


这个是用户名字符范围判断 ‘1’-‘9’ ‘A-Z’  '(' ')' '-' 其他都非法

【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验


这块就是不一样的检查了,注册码中A-F都表示为数字“0” ,从F开始才表示“1-19“,但是要求必须大于3个的‘A’-‘E’,上个注册机就没注意这个,全部都是‘F’代替0所以还会有检验失败。


这个函数有大堆的重复注册码校验,还有一大堆的使用时间检查,注册码黑名单等等,暂时就发现这一处暗桩,不知道这样能不能”完全注册“了,有兴趣的小伙伴可以继续研究~


最后附上新注册算法代码:

#!pythonimport 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 << i // 20)return ret_table



def add_random():return random.choice(['A', 'B', 'C', 'D', 'E'])



def integer_to_hex(int_array): result = [] not_f_count = 0for i in range(len(int_array)): high = int_array[i] // 20 low = int_array[i] % 20if i % 2 == 0 and i > 0: result.append('-')if high == 0 and not_f_count < 4: result.append(add_random()) not_f_count += 1else: result.append(chr(high + 70))if low == 0 and not_f_count < 4: result.append(add_random()) not_f_count += 1else: 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] = 85for i in range(17): init_table[i] = ord(user_id[i]) ret = reverse_table(init_table)return integer_to_hex(ret)



def main(): print(gen_register_code(id))



if __name__ == '__main__': main()


--

www.52pojie.cn


--

pojie_52

本文始发于微信公众号(吾爱破解论坛):【MacOS】SteerMouse 5.5.6 注册算法分析 新增一处暗桩校验

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: