Typora For Mac Crack
本帖最后由 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
最后确定激活请求返回值的必须内容:
```json
{
"code":0,
"msg":{
"email":"xxx@xxx.com",
"license":"xxxxxx-xxxxxx-xxxxxx-xxxxxx"
}
}
```
## 0x02 hook思路
- hook`verifySig`函数,让其永远返回真
- hook请求函数,让其在请求激活时返回符合条件的json数据
- json数据需要转换为Objective-C格式的对象
- Typora是有请求函数的,函数自动将json数据转换
- 两种方法
- 直接hook请求函数的返回值,返回自定义数据即可
- 代{过}{滤}理Typora,修改请求包返回值
- 输入激活码时本地有校验激活码是否符合要求
- 去网上找符合要求的激活码
- hook本地校验函数,这里就不展开了,自己追一下,很好找到,看谁调用了activate函数就行了
## 0x03 Frida hook
```javascript
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.implementation, {
onLeave(retval) {
retval.replace(ptr(0x1));
}
});
var email = "admin@admin.com";
var license = "XXXXXX-XXXXXX-XXXXXX-XXXXXX";
let validateEmail = "- validateEmail:";
Interceptor.attach(LicenseManager.implementation, {
onEnter(args){
let input = ObjC.Object(args).toString();
if (input != "" && input != undefined){
email = input;
}
},
onLeave(retval) {
retval.replace(ptr(0x1));
}
});
let quickValidateLicense = "- quickValidateLicense:";
Interceptor.attach(LicenseManager.implementation, {
onEnter(args){
let input = ObjC.Object(args).toString();
if (input != "" && input != undefined){
license = input;
}
},
onLeave(retval) {
retval.replace(ptr(0x1));
}
});
const Utils = ObjC.classes.Utils;
let jsonStringToObject = "+ jsonStringToObject:";
Interceptor.attach(Utils.implementation, {
onLeave(retval) {
let jsonData = `{
"code":0,
"retry":true,
"msg":{
"email":"${email}",
"license":"${license}"
}
}`;
retval.replace(json_to_objc(jsonData));
}
});
```
## 0x04 参考
- [浅谈Mac应用逆向破解](https://www.soft98.top/2000@%e9%80%86%e5%90%91%e7%a0%b4%e8%a7%a3/2001@%e6%b5%85%e8%b0%88Mac%e5%ba%94%e7%94%a8%e9%80%86%e5%90%91%e7%a0%b4%e8%a7%a3)
- (https://www.wolai.com/cdMBuRYaqGJ7bMa59rXxjK)
- https://developer.apple.com/cn/search/?type=Documentation&q=
- (https://blog.csdn.net/boildoctor/article/details/121997000) nmweizi 发表于 2023-10-17 15:26
用lldb跟了下崩溃的地方,没找到啥有用信息,怀疑和升级后的macos版本有关系。
大家有这种情况 ...
搞定,搞定!
返回json多了两个内容
另外多了一个重启会访问服务器,返回sucess:true即可 已买正版,但还是可以学习学习!!! 哈哈……学习了。 刚在看typroa就有了文章哈哈,学习学习{:1_893:} 大佬厉害啊,算法分分钟出来 厉害{:1_921:},提供了很好的思路 厉害真厉害 {:1_893:} 受益匪浅 Typora这么好的软件,一定要支持购买一波。{:1_921:} 学习下 Frida hook
受益匪浅