吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9257|回复: 57
收起左侧

[MacOS逆向] MacOS 高颜值的 数据库客户端工具 Tableplus 简单逆向分析

  [复制链接]
Vvvvvoid 发表于 2023-6-13 16:19
本帖最后由 Vvvvvoid 于 2023-7-18 17:50 编辑

0x0

navicat 给公司发律师函了, 所以不能白嫖了..
后来一直在找替代品, 但均感觉略有不足.
dbeaver : java 开发的, 依赖 jdk , 而且BUG较多,也不流畅
mysqlworkbench : 官方出品, 功能强大. 但是用着不带劲
Sequel Ace : 开源免费, 但是只支持mysql,功能简单

最后试了下 Tableplus , 感觉还不错. 颜值高, 支持的协议多,跨平台.
免费版有很多限制, 所以今天试了简单逆向了下..

0x1

环境:
Tableplus Version 5.3.8 (500) (https://tableplus.com/)
ida64
hopper

0x2

免费版有如下限制, 我们可以从这些关键字入手

  1. 只能打开俩个查询Tab页
  2. 只能打开俩个窗口
  3. 只能添加俩个where条件

hopper 搜索 str "Free Trial limited 2" , 定位到这些str的内存地址

__cstring:00000001006BF130      00000020        C       Free Trial limited 2 workspaces
__cstring:00000001006C74D0      0000001A        C       Free Trial limited 2 tabs
__cstring:00000001006CC220      0000001D        C       Free Trial limited 2 filters

0x3

分析0x2的第一个变量地址, 查看引用.这里有三个引用, 先看第一个.
进入到函数首 , 看到这块有个关键跳转.

在这里下断,然后依次 Command + T 增加tab 页 ,分析得出以下结论

call       sub_1002a56b0  ;  sub_1002a56b0 这个函数应该是取当前tab页数量,复值给 rax
cmp        rax, 0x2 ; 将 rax 与 2 做比较, 这里的 2 就是限制条件
mov        qword [rbp+var_38], r13
jl         loc_1000c17c1 ; rax<2 是跳转成立, 否则会执行弹框

这里要爆破就很简单了,

jl         loc_1000c17c1 > jmp         loc_1000c17c1.

至于另外俩个关键字也是一样的方式..

## -----------
__cstring:00000001006BF130      00000020        C       Free Trial limited 2 workspaces

__text:00000001000C16EB cmp     rax, 2
__text:00000001000C16EF mov     [rbp+var_38], r13
__text:00000001000C16F3 jl      loc_1000C17C1 , jl > jmp

## -----------
__cstring:00000001006C74D0      0000001A        C       Free Trial limited 2 tabs

__text:00000001001F90C2 cmp     rbx, 2
__text:00000001001F90C6 mov     r13, r15
__text:00000001001F90C9 jl      loc_1001F9184 , jl > jmp

## -----------
__cstring:00000001006CC220      0000001D        C       Free Trial limited 2 filters

__text:00000001002EA3E0 cmp     r14, 2
__text:00000001002EA3E4 mov     [rbp+var_58], r13
__text:00000001002EA3E8 jl      loc_1002EA4AE , jl > jmp

0x4

用 ida 修改 jl > jmp .
然后保存 (不用 hopper 修改是因为穷)

保存完之后记者重新加签


target_app=/Applications/TablePlus.app
sudo xattr ${target_app}

# 删除签名
sudo xattr -r -d com.apple.quarantine ${target_app}
sudo xattr -cr ${target_app}

# 重新签名。
sudo codesign -f -s - --deep ${target_app}

由于 free ida 不支持修改 arm , 只支持 x86 架构的修改
所以 m1/m2 系列 , 请用 Rosetta (兼容模式)打开 软件


Snipaste_2023-07-18_17-47-09.png

免费评分

参与人数 9吾爱币 +15 热心值 +8 收起 理由
笙若 + 1 + 1 谢谢@Thanks!
5omggx + 1 + 1 用心讨论,共获提升!
lalicorne + 1 我很赞同!
炽之夕 + 1 + 1 谢谢 @Thanks!
macyoyo + 1 + 1 鼓励转贴优秀软件安全工具和文档!
sunlei658 + 1 + 1 谢谢@Thanks!
Only丶爱你 + 1 + 1 热心回复!
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
shuaibi_chen + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

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

QiuChenly 发表于 2023-9-4 16:02
本帖最后由 QiuChenly 于 2023-9-5 03:09 编辑

存在一个全局变量存储LicenceModel类,如果没有合法授权这个全局变量将为0x0, 只要拦截设置函数后对其进行声明赋值即可。

void TablePlus(void){
    if (checkSelfInject("com.tinyapp.TablePlus")){
        //hook通杀开始
        int fileInx = 0;

        intptr_t fileOffset = getCurrentArchFileOffset(fileInx);
        //当前需要检查的架构
        NSString *patchImage = [NSString stringWithUTF8String:_dyld_get_image_name(fileInx)];

        //s6Shared16ActivationStatusC11isActivated10needUpdateS2b
        NSString *checkCode = @"55 48 89 E5 41 57 41 56 41 55 41 54 53 48 81 EC 98 00 00 00 48 8D 3D B5 8B 71 00 E8 20 A2 EF FF 48 8B 40 F8 48 8B 40 40 48 89 E3 48 83 C0 0F 48 83 E0 F0 48 29 C3 48 89 DC 31 FF E8 3E AC 52 00";
        NSString *checkCodeARM = @"FF 03 01 D1 F4 4F 02 A9 FD 7B 03 A9 FD C3 00 91 21 0D 00 F0 21 70 1C 91 E8 43 00 91 1B 30 05 94 08 00 B0 52 E8 0B 00 B9 FF 03 00 F9 E0 43 00 91 E1 03 00 91 93 30 05 94 13 00 00 52";

        NSArray<NSNumber *> *checkCodeMethod = findOffsetsForWildcardHexInFile(patchImage, isX86() ? checkCode : checkCodeARM, 1);
        if (checkCodeMethod.count > 0) {
            hookPtrI(fileInx,getRealFileOffset2RAMOffset(checkCodeMethod[0].intValue, fileOffset), retMyLicense);
        }
    }
}

id retMyLicense(void){
    id ret = class_createInstance(objc_getClass("LicenseModel"), 0);
    [ret performSelector:NSSelectorFromString(@"setEmail:") withObject:@"QiuChenly@52pojie.cn"];
    [ret performSelector:NSSelectorFromString(@"setDeviceID:") withObject:@"K'ed By TNT"];
    [ret performSelector:NSSelectorFromString(@"setUpdatesAvailableUntil:") withObject:@"2999-12-12"];

    [ret performSelector:NSSelectorFromString(@"setSign:") withObject:@"直到世界末日"];
    NSLog(@"设置授权信息完成");
    return ret;
}

最新版的函数为:

void *sub_1002A2C20()
{
  void *result; // rax

  result = sub_10011A370();
  qword_100851170 = result;
  return result;
}

arm64 函数为 sub_10010516C

__int64 sub_10026CCB4()
{
  __int64 result; // x0

  result = sub_10010516C();
  qword_1007E41D0 = result;
  return result;
}

hook点就是sub_10011A370函数。

参考我的注入库: https://github.com/QiuChenlyOpenSource/InjectLib




妈的,弄到凌晨三点,说一下我发现的问题。

这个App疑似有内存溢出Bug,全局变量qword_100851170会被不知名力量魔幻修改成NSURL/NSString类,然后objc_sendMsg就会收到错误导致无法打开超过两个页面 我四个小时一直在解决这个bug 这个App的作者真的求求你看看自己写的那个p代码吧


然后我的解决办法是:
增加Hook全局判断是否License函数,这个函数是控制超过两个页面是否允许被继续打开。


在hook伪造激活信息的函数上 我屏蔽了8条objc_sendMsg函数调用,这些函数调用会引起崩溃。


这App一眼定镇鉴定为纯纯的出生。
 楼主| Vvvvvoid 发表于 2023-6-14 09:41
Hmily 发表于 2023-6-14 08:11
改跳转上面的call返回值应该更通用吧,就不需要改三处跳转了。


是有三个不同的限制条件,  不是同一个 call 哟

[Asm] 纯文本查看 复制代码
## -----------
__cstring:00000001006BF130      00000020        C       Free Trial limited 2 workspaces

__text:00000001000C16EB cmp     rax, 2
__text:00000001000C16EF mov     [rbp+var_38], r13
__text:00000001000C16F3 jl      loc_1000C17C1 , jl > jmp

## -----------
__cstring:00000001006C74D0      0000001A        C       Free Trial limited 2 tabs

__text:00000001001F90C2 cmp     rbx, 2
__text:00000001001F90C6 mov     r13, r15
__text:00000001001F90C9 jl      loc_1001F9184 , jl > jmp

## -----------
__cstring:00000001006CC220      0000001D        C       Free Trial limited 2 filters

__text:00000001002EA3E0 cmp     r14, 2
__text:00000001002EA3E4 mov     [rbp+var_58], r13
__text:00000001002EA3E8 jl      loc_1002EA4AE , jl > jmp


点评

每个call只被调用一次吗?call内部的运算有没有共用的验证函数?  详情 回复 发表于 2023-6-14 10:12
头像被屏蔽
blindcat 发表于 2023-6-13 16:48
头像被屏蔽
sdieedu 发表于 2023-6-13 16:58
提示: 该帖被管理员或版主屏蔽
头像被屏蔽
jackwu06 发表于 2023-6-13 16:58
提示: 该帖被管理员或版主屏蔽
头像被屏蔽
DNZJZ52PJ 发表于 2023-6-13 17:39
提示: 该帖被管理员或版主屏蔽
头像被屏蔽
无言Y 发表于 2023-6-13 17:44
提示: 该帖被管理员或版主屏蔽
1022556987 发表于 2023-6-13 17:47
sequel pro 可以试试这个 我用的这个
 楼主| Vvvvvoid 发表于 2023-6-13 17:49
1022556987 发表于 2023-6-13 17:47
sequel pro 可以试试这个 我用的这个


我没记错的话 , sequel pro  已经不维护了,
起了一个新分支 叫 sequel ace
头像被屏蔽
rainerosion 发表于 2023-6-13 18:01
提示: 该帖被管理员或版主屏蔽
头像被屏蔽
zhang7069 发表于 2023-6-13 18:10
提示: 该帖被管理员或版主屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-26 04:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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