吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 3787|回复: 76

[经验资料] SteerMouse注册算法分析

  [复制链接] 出处:吾爱破解论坛
ShareKing 发表于 2022-2-3 17:02 | 显示全部楼层 |阅读模式

SteerMouse是款MacOS上关闭USB外接鼠标的加速度,滚轮加速度(这个USB外接也用触摸板的滚动加速度把我恶心坏了),修改鼠标前进返回键等功能,本想论坛找下注册码用用,无果就自己分析下算法看看能不能搞个注册码给大伙带点福利。分析的是5.5.6版本。由于MacOS平台的XPC服务组件的调试需要关闭SIP,操作起来还比较麻烦,索性把bin拖进IDA里直接找找注册算法长什么样,IDA用的是官方Free版,对付防护精简小工具应该搓搓有余的。进去先找下输入注册码错误信息:
182049q511mn1meoefeeyp.png

182026ltmiprxmnx96hx0p.png

F5一下看下引用的代码:
182111qvtgllflqlxtqxgl.png

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

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

翻译为python实现:
[Python] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[backcolor=rgb(27, 36, 38) !important][color=rgb(255, 255, 255) !important]
[color=#ffffff !important]?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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 <= 'Z':
                        base_value = 0.0024 + float(ord(cdkey) - 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_value
    return ret_table






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

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

那么注册机就要实现这个从用户id字符串拼接为20长度的数组进行8 x 20的转换生成新的长度20整数数组,然后以20进制将单个整数一拆二扩大为40长度数组,将0-20的整数以A-Z的形式表示就是注册码了,注册机python脚本见附件
[Python] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[backcolor=rgb(27, 36, 38) !important][color=rgb(255, 255, 255) !important]
[color=#ffffff !important]?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

#!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 // 20
        low = int_array % 20
        if 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] = 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:] 这个过程调用中会再次检查注册名及注册码的合法性,如果校验失败则会弹出试用到期的弹窗并推出。
124413seu71hxggbsxpb4z.png
这块的算法与控制面板的注册逻辑一样,后面会插入不一样的针对对注册名和注册码的字符范围检查:
124653gavzzbbiybihyar2.png
这个是用户名字符范围判断 ‘1’-‘9’ ‘A-Z’  '(' ')' '-' 其他都非法
125025hjtf2obt6rcrir2j.png
这块就是不一样的检查了,注册码中A-F都表示为数字“0” ,从F开始才表示“1-19“,但是要求必须大于3个的‘A’-‘E’,上个注册机就没注意这个,全部都是‘F’代替0所以还会有检验失败。

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

最后附上新注册算法代码:
[Python] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[backcolor=rgb(27, 36, 38) !important][color=rgb(255, 255, 255) !important]
[color=#ffffff !important]?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

#!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 << 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 = 0
    for i in range(len(int_array)):
        high = int_array // 20
        low = int_array % 20
        if i % 2 == 0 and i > 0:
            result.append('-')
        if high == 0 and not_f_count < 4:
            result.append(add_random())
            not_f_count += 1
        else:
            result.append(chr(high + 70))
        if low == 0 and not_f_count < 4:
            result.append(add_random())
            not_f_count += 1
        else:
            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()




评分

参与人数 22HB +22 THX +5 收起 理由
虚心学习 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
Jawon + 2
七九 + 1
DDK4282 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
一路走来不容易 + 1
消逝的过去 + 2
459121520 + 1
Wayne + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
冷亦飞 + 1
l278785481 + 1
szukodf + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
hackysh + 1
清风而已 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
PDWORD + 1
muker + 1
boot + 1
阿涛牛 + 1
XiaoWeiSec + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
福特 + 2 + 1
成丰羽 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
曦照 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
zxjzzh + 2 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
冥王星516932 发表于 2022-2-3 17:03 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
fIcwvJhTiYx 发表于 2022-2-3 17:05 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
eTPtJuZd85 发表于 2022-2-3 17:19 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
朋友614 发表于 2022-2-3 17:22 | 显示全部楼层

谢了啊,啥也不说了,记心里了!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
eTPtJuZd85 发表于 2022-2-3 17:27 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
aiYHPMeqDC 发表于 2022-2-3 17:29 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
火车06184 发表于 2022-2-3 17:52 | 显示全部楼层

楼主好强啊!学习了!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
白羊3480 发表于 2022-2-3 18:02 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
GSkulFOjfAW 发表于 2022-2-3 18:03 | 显示全部楼层

感谢楼主
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表