吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6516|回复: 34
上一主题 下一主题
收起左侧

[MacOS逆向] Typora For Mac Crack

  [复制链接]
跳转到指定楼层
楼主
Soft98 发表于 2023-2-9 15:41 回帖奖励
本帖最后由 Soft98 于 2023-7-27 07:13 编辑

Typora For Mac Crack

Typora Mac版是用Objective-C写的,没有什么保护措施,直接反汇编逆向分析即可,这里记录在线激活的思路和方法。

0x01 定位关键点

使用proxifier或者其他代{过}{滤}理工具,将Typora流量转发到burpsuite中,之后去激活可以获取到关键请求,这里不过多描述,当然也可以自己猜关键字,在反汇编中查询。

关键请求:api/client/activate

通过查看引用,逆向追踪到LicenseManager activate方法

然后查看请求结束之后所调用的callback方法的执行内容,可以看到有code字样,如果你尝试去抓包,就能从这开始推断正确的返回值内容了

继续追踪,看处理函数writeLicenseInfo,见名知意,就是写授权信息的函数,这里也可以看出,激活请求返回值需要有msg字段

然后我们发现关键的判断函数verifySig,实际破解直接返回0x1即可,如果感兴趣,可以自行继续追踪,可以找到公钥信息

writeLicenseInfoOld和writeLicenseInfo对应旧版和新版的授权信息写入,但是后面追踪并没有具体的字段信息,所以我们要换个思路,从读取license信息的地方查看读取了哪些字段

直接搜索readLicenseInfo,找到方法实现,可以看到关键的关键字email和license

最后确定激活请求返回值的必须内容:

{
  "code":0,
  "msg":{
    "email":"xxx@xxx.com",
    "license":"xxxxxx-xxxxxx-xxxxxx-xxxxxx"
  }
}

0x02 hook思路

  • hookverifySig函数,让其永远返回真
  • hook请求函数,让其在请求激活时返回符合条件的json数据
    • json数据需要转换为Objective-C格式的对象
    • Typora是有请求函数的,函数自动将json数据转换
    • 两种方法
    • 直接hook请求函数的返回值,返回自定义数据即可
    • 代{过}{滤}理Typora,修改请求包返回值
  • 输入激活码时本地有校验激活码是否符合要求
    • 去网上找符合要求的激活码
    • hook本地校验函数,这里就不展开了,自己追一下,很好找到,看谁调用了activate函数就行了

0x03 Frida hook

var NSString = ObjC.classes.NSString;
var NSJSONSerialization = ObjC.classes.NSJSONSerialization;
function json_to_objc(data){
    let strData = NSString.stringWithString_(data).dataUsingEncoding_(0x4);
    return NSJSONSerialization.JSONObjectWithData_options_error_(strData,0x1,ptr(0x0));
}
const LicenseManager = ObjC.classes.LicenseManager;
let verifySig = "- verifySig:";
Interceptor.attach(LicenseManager[verifySig].implementation, {
    onLeave(retval) {
        retval.replace(ptr(0x1));
    }
});
var email = "admin@admin.com";
var license = "XXXXXX-XXXXXX-XXXXXX-XXXXXX";
let validateEmail = "- validateEmail:";
Interceptor.attach(LicenseManager[validateEmail].implementation, {
    onEnter(args){
        let input = ObjC.Object(args[2]).toString();
        if (input != "" && input != undefined){
            email = input;
        }
    },
    onLeave(retval) {
        retval.replace(ptr(0x1));
    }
});
let quickValidateLicense = "- quickValidateLicense:";
Interceptor.attach(LicenseManager[quickValidateLicense].implementation, {
    onEnter(args){
        let input = ObjC.Object(args[2]).toString();
        if (input != "" && input != undefined){
            license = input;
        }
    },
    onLeave(retval) {
        retval.replace(ptr(0x1));
    }
});
const Utils = ObjC.classes.Utils;
let jsonStringToObject = "+ jsonStringToObject:";
Interceptor.attach(Utils[jsonStringToObject].implementation, {
    onLeave(retval) {
        let jsonData = `{
            "code":0,
            "retry":true,
            "msg":{
                "email":"${email}",
                "license":"${license}"
            }
        }`;
        retval.replace(json_to_objc(jsonData));
    }
});

0x04 参考

免费评分

参与人数 6威望 +1 吾爱币 +26 热心值 +6 收起 理由
kihlh + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lordship + 1 + 1 谢谢@Thanks!
抱薪风雪雾 + 1 + 1 谢谢@Thanks!
MFC + 1 + 1 谢谢@Thanks!
prince_cool + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
nmweizi 发表于 2023-10-17 19:49
nmweizi 发表于 2023-10-17 15:26
用lldb跟了下崩溃的地方,没找到啥有用信息,怀疑和升级后的macos版本有关系。
大家有这种情况 ...

搞定,搞定!
返回json多了两个内容
另外多了一个重启会访问服务器,返回sucess:true即可
推荐
superyongzhe 发表于 2023-3-14 09:49
沙发
chenlongjs 发表于 2023-2-9 16:22
3#
MarvinJ 发表于 2023-2-9 16:31
刚在看typroa就有了文章哈哈,学习学习
4#
xixicoco 发表于 2023-2-9 16:56
大佬厉害啊,算法分分钟出来
5#
H0peLess 发表于 2023-2-9 17:12
厉害,提供了很好的思路
6#
sfy1999 发表于 2023-2-9 17:52
厉害真厉害     
7#
Huntergary 发表于 2023-2-9 18:02
受益匪浅
8#
vethenc 发表于 2023-2-9 18:20
Typora这么好的软件,一定要支持购买一波。
9#
hszt 发表于 2023-2-9 18:21
学习下 Frida hook
10#
zhangsan2022 发表于 2023-2-9 18:48

受益匪浅
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-14 13:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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