Surge For Mac修改试用判断方法达到无限试用

0x00 前言

官网:https://www.nssurge.com/

Advanced Network Toolbox for Mac & iOS

我这里没有研究过iOS端的软件,只是用Mac端来进行分析和演示文件修改和重签名。

0x01 定位关键点

试用过期之后会显示试用已过期,如果是试用期间会显示还有多少天试用,这个就是关键词。

image-20231227073112733

推荐使用vscode打开应用程序包内容的文件夹进行搜索,很便捷,这里找到相应的描述。

"activation.trial.expired" = "试用已过期"; //Free trial expired

image-20231227073507971

打开hopper,对关键词进行搜索,然后往上寻找引用,最后定为到WindowController - exec

image-20231227073809458

image-20231227074116411

image-20231227074140158

通过代码可以看出来是根据sub_100165463函数的返回值判断当前的试用状态,当返回值为1时,才会走到loc_1002c5ea6,显示当前还有多少天试用期,sub_10016546f就是返回试用结束时间的,但是经过测试,不改这个也没有问题,试用显示是负的也可以进行试用。

image-20231227074642460

0x02 hook调试

hook调试需要注意此处因为没有方法名,我们需要hook的是sub_100165463,需要根据偏移来进行hook,hopper中程序的基址默认应该是0x100000000,所以函数的偏移是0x165463。

此处因为是在程序启动时就进行执行,所以代码需要启动程序时进行注入,我这里使用ftool进行调试。

先编写一个测试js文件,代码如下:

# surge.js
obj.method.getMethodInfoByOffset("Surge",0x165463);

关闭surge程序,使用ftool启动并加载代码

hook:Surge,/Users/dawn/Desktop/self/code/ftool/target/surge.js

可以看到返回值是0x4,有一些报错无需关心,这个ftool还有很多地方需要完善。

image-20231227080315567

然后我们试一下修改返回值为0x1,看一下效果,会显示在多少天后过期,并且点击之后可以进行使用。

// surge.js
let retval_to_1 = "retval.replace(ptr(0x1));";
obj.method.hookMethodByOffset("Surge",0x165463,{"onLeave":retval_to_1});

image-20231227080854807

0x03 持久化尝试(未成功)

hook的方式比较麻烦就在于每次启动需要自己进行执行,所以就有了多种持久化方式,这里只是作为尝试描述,因为我都失败了,修改文件会涉及到其他层面的考虑,比如签名校验,程序崩溃等等。

1 二进制修改

工具:Hopper、Hex Friend(因为hopper免费版不支持修改导出)

Hopper -> Edit -> Copy Hex String of Selected Bytes 复制二进制数据
Hopper -> Modify -> Assemble Instruction... 通过汇编语句进行修改
Hex Friend -> Edit -> Find... 进行查找替换

考虑修改sub_100165463函数的二进制,eax就是它的返回值。

image-20231227081450509

先选中这几行代码,然后通过hopper进行复制二进制数据

55 48 89 E5 8B 05 E3 3B 40 00 5D C3

然后在hopper中修改这几条语句,修改之后再复制修改后的二进制数据

image-20231227081702019

image-20231227081733656

55 48 89 E5 B8 01 00 00 00 90 5D C3

然后试用Hex Friend打开/Applications/Surge.app/Contents/MacOS/Surge进行查找替换,然后进行文件保存或者另存为进行替换之前的文件,注意,操作之前先把源文件复制一份保存,避免出现问题。

image-20231227081919094

修改之后直接打开应用程序会报错EXC_BAD_ACCESS (SIGKILL (Code Signature Invalid)),也就签名错误,所以需要重签名。

image-20231227082224636

重签名往上也有很多方法,最常见的就是通过codesign进行签名。

钥匙串访问 -> 证书助理 -> 创建证书

证书类型选择“代码签名”

证书名称,随便填一个,但是要记住名称,签名要用到

cd /Applications/Surge.app/Contents/MacOS/
codesign -f -s "你的证书名称" Surge

image-20231227082442232

签名之后就可以打开使用了,界面也显示想要的效果了,但是实际上进去之后正常的功能无法使用,所以可能还存在其他的什么校验,这个需要后续研究。

image-20231227082543639

2 dylib注入

这个就是编写动态链接库进行注入,但是实际上直接注入程序本体也会破坏签名,还有就是注入到程序依赖库里,这个也是个办法,但是我也失败了,因为编写代码操作指针会存在其他问题,但是我不咋会C/C++编程。

可以参考QiuChenly大佬吾爱的文章:https://www.52pojie.cn/thread-1739282-1-1.html

我这里给出我尝试编写的代码,调试中虽然日志也返回了想要的内容,但是还是会报错,貌似是访问了不可访问的内存。

//
//  CrackSurge.m
//  CrackSurge
//
//  Created by Soft98 on 2023/12/20.
//

#import "CrackSurge.h"
#import <mach-o/dyld.h>
#import <objc/runtime.h>
#include "rd_route.h"

@implementation CrackSurge

int32_t (*sub_100165463_org)() = NULL;

//定义一个swift函数用于替换 可选是否static静态
int32_t sub_100165463_hook() {
    BOOL ret = sub_100165463_org();//调用原函数
    NSLog(@"======= load sub_100165463_hook called original return value is %d", ret);
    return 0x1;
}

void SurgeHook()
{
    unsigned long sub_100165463 = _dyld_get_image_vmaddr_slide(0) + 0x100165463; //trial period

    rd_route((void *) sub_100165463, sub_100165463_hook, (void **) &sub_100165463_org);
    NSLog(@"CrackSurge: %p", sub_100165463_org);
}

+ (void)load {
    SurgeHook();
}

@end

dylib注入方式也有多种,调试时可以采用环境变量的方式,正式使用再用insert_dylib注入

// DYLD_INSERT_LIBRARIES=<dylib path> <injected file path>
DYLD_INSERT_LIBRARIES=/Users/dawn/Desktop/self/code/libCrackSurge.dylib /Applications/Surge.app/Contents/MacOS/Surge

环境变量的方式就是直接在命令行里进行输入对应的内容回车就可以了。

inser_dylib如何使用,大家下载文件之后可以对照往上的参考文章和帮助文档进行测试即可。

0x04 参考

  • CleanMyMac X 国际测试版4.13.0b2 内存注入 https://www.52pojie.cn/thread-1739282-1-1.html

  • DYLD_INSERT_LIBRARIES DYLIB injection in macOS / OSX https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/

  • MacOS动态注入的三种方式及hook方案 https://blog.csdn.net/tangsilian/article/details/89442802

  • rd_route https://github.com/rodionovd/rd_route

  • ftool https://github.com/soft98-top/ftool