【Mac】记一次对付费Markdown软件Typora 1.0的逆向

查看 92|回复 2
作者:TLHorse   
前言
说句题外话,学业负担逐渐加重,好久没有整逆向工程了。我没有更新操作系统的教程,也是这个原因。我对此深深地表示歉意,所以我今天抽空写一篇文章。
正巧最近我用的Typora发布了1.0版本,到官网看看,发现开始收费了,售价 $14.99 ,最多三台设备。可以先进行试用,试用期到了,就需要付费。论坛上已经有Typora的Windows逆向分析了,因此我今天就进行Typora的Mac逆向分析,为大家写篇没啥技术含量的文章,也算是我操作系统教程迟迟未更新的补偿。
(为了防止和谐,加了10级阅读权限)
分析
把Typora丢进Hopper里分析一波。对于这个简单轻量级的软件,我很容易就可以搜到关键词。拿subscription、trial、days、license这些敏感词试一试,就可以发现一些相关的OC类,例如LicenseManager和LicenseWindowController。我将一些之后需要逆向的函数加了黑。


typora-search.png (423.25 KB, 下载次数: 0)
下载附件
搜索
2021-12-13 22:54 上传

先打开-[LicenseManager hasLicense],看上去是判断是否有许可证的函数。生成伪代码,很容易发现是个简单的逻辑判断流程,rax寄存器储存返回值。
/* home.php?mod=space&uid=341152 LicenseManager */
-(char)hasLicense {
    rdi = self->_hasLicense;
    if (rdi != 0x0) {
            rax = [rdi boolValue];
            rax = rax != 0x0 ? 0x1 : 0x0;
    }
    else {
            rax = 0x1;
    }
    rax = rax & 0xff;
    return rax;
}
我们直接在汇编中按下Option+A,输入mov rax, 0x1; ret进行暴破,如图。


typora-bp.png (247.95 KB, 下载次数: 0)
下载附件
破解
2021-12-13 22:55 上传

接下来,用调试器运行。很讽刺的一件事是,试用期提醒的弹窗直接消失了。我把系统时间往后调,软件仍然可以正常运行,这不是伪破解。所以,这就破解完了……
但是,还有一件事。我发现虽然暴破的软件可以正常使用,但是菜单栏上有个“查看许可证”按钮。点开它,软件就会检测出,剩余试用天数已经归零,此时弹出的窗口只有激活和退出两个按钮。


typora-licensebt.png (52.25 KB, 下载次数: 0)
下载附件
许可证按钮
2021-12-13 22:55 上传

为了防止误触这个键,就得把对话框去掉。我不再tweak试用天数了,更懒得写注册机,所以我准备让它弹出另一个对话框,显示软件已破解。
逆向
既要暴破软件,还要加对话框,我就用了动态库注入破解。我用的是MonkeyDev框架,也就是substrate。先新建MonkeyAppMac工程,命名TyporaTweak,然后将Typora拖进TargetApp,最后打开TyporaTweak.m文件。
先写两个替代函数:
#include  // 记得引入Cocoa
@class LicenseManager; // 定义类
// hook是否有许可证
static char new_hasLicense(LicenseManager* self, SEL _cmd) {
    return 1;
}
// hook许可证弹窗
static void new_showLicense(LicenseManager* self, SEL _cmd, char arg2){
           // 新建一个警告弹窗
    NSString *message = @"您正在使用Typora破解版";
    NSAlert *alert = [NSAlert new];
    [alert addButtonWithTitle:@"知道了"];
    [alert setMessageText:message];
    [alert setAlertStyle:NSAlertStyleCritical];
    [alert runModal];
}
然后在动态库加载入口hook(一些基本的语法,可在官网上搜索,不再解释):
static void __attribute__((constructor)) initialize(void) {
    MSHookMessageEx(objc_getClass("LicenseManager"), @selector(hasLicense), (IMP)&new_hasLicense, NULL);
    MSHookMessageEx(objc_getClass("LicenseManager"), @selector(showLicense:), (IMP)&new_showLicense, NULL);
}
所有的代码看起来像这样:
#import "TyporaTweak.h"
#import "substrate.h"
#include
@class LicenseManager;
static char new_hasLicense(LicenseManager* self, SEL _cmd) {
    return 1;
}
static void new_showLicense(LicenseManager* self, SEL _cmd, char arg2){
    NSString *message = @"您正在使用Typora破解版";
    NSAlert *alert = [NSAlert new];
    [alert addButtonWithTitle:@"知道了"];
    [alert setMessageText:message];
    [alert setAlertStyle:NSAlertStyleCritical];
    [alert runModal];
}
static void __attribute__((constructor)) initialize(void) {
    MSHookMessageEx(objc_getClass("LicenseManager"), @selector(hasLicense), (IMP)&new_hasLicense, NULL);
    MSHookMessageEx(objc_getClass("LicenseManager"), @selector(showLicense:), (IMP)&new_showLicense, NULL);
}
运行一下,大功告成!


typora-product.png (614.22 KB, 下载次数: 0)
下载附件
成品
2021-12-13 22:56 上传

动态库注入
拿到了libTyporaTweak.lib,就可以对二进制进行注入了。
./insert_dylib  
当然,MonkeyDev已经帮我们完成了这一步。将Typora.app从TargetApp文件夹里拖出,即是我们的成品。
总结
Typora就这么被逆向完了。不得不说,它在反破解方面还有待提高。没有反调试、没有加密加壳,什么都没有。这是值得开发者维护的地方。但就软件本身而言,它的确是个良心的Markdown编辑器,值得我们去购买支持。

软件, 下载次数

TLHorse
OP
  


尘叶云渡 发表于 2021-12-15 15:59
您好,请问可以分享一下hopper较新的版本吗?之前使用的以及网上的都不能用了。

抱歉,我的hopper用的是正版,而且最近许可证更新也到期了,发了也用不了。
你可以拿论坛爱盘的IDA试试。Windows是管用的,但是mac我以前试的时候好像不太行。
jiang910615   

感谢楼主提供思路,typora一开始很好用,随着使用的增加。
总感觉typora会不自觉的卡一下,尤其是在增加表格的时候。
现在已经换成Mweb了,虽然增加表格依旧难用,不过二者配合,还是极好的。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部