Vvvvvoid 发表于 2024-4-24 20:51

Studio 3T 2024.2.0 [JAVA] 逆向分析,跨平台通杀

本帖最后由 Vvvvvoid 于 2024-11-16 17:30 编辑

## 关于(Studio 3t 2024.2.0)

studio 3t是一款能够有效让数据库的管理进行更好的可视化工具,又称Robomongo;
是由MongoDB客户端Studio 3T的开发人员维护和提供的,适用于Windows,MacOS和Linux的跨平台。

## 环境

- IDEA
- JDK 17
- jadx

## 前记
似乎翻遍了 Google 也没找到Studio 3t新版的 hack 版; 所以今天试着看了下;
而且, 在不搞点 JAVA 的东西, 别人都不知道我是干 JAVA 的了....


## 分析

免费版会少很多功能, 菜单也是精简过的; 如下图所示



通过抓包发现软件在用户登陆后,会发送一个请求接口来获取当前用户的凭证信息



GET /s3t-api/usage-token

注意看请求 body,可以看到目前 license 状态目前是过期的

"trialStatus": "LICENSE_EXPIRED'

接口返回如下:
```json
{
"certificateChain": [
    "xxxx"
],
"serverTokens": {
},
"usageToken": "xxx"
}
```

返回有一堆加了密的东西, 看着头疼;

我们用 jadx 全局搜索下 classpath 所有的 jar   
跟踪一下这个请求的上下文



定位到了 data-man-mongodb-ent-2024.2.0.jar 这个 jar 包;


分析代码:

```java
yjsj cS = cS();
jsonObject.addProperty("trialStatus", cS.cc);
```


接着进入 当前类的 cS() 方法,看看 yjsj cS 具体的实现



295 行可以看到 yjsjVar.cc = n_trVar2.getStatus().ay().name();

然后我们在继续跟进,看看 getStatus() 方法



定位到这里 t3.common.c.h.n_tr.getStatus() , 稍微有些眉目了;
我们试着改改这个方法.让他直接返回第 433 行的 Your trial license expires in %d days

## 重写

打开 IDEA 新建一个 JAVA Project;
Studio 3T 用的 JDK 为 17, 我们也用 17;
把 classpath 所有的 jar 添加到我们依赖中
然后把 n_tr 的假码 copy 一份进去;


开始改造:
1. 把 423 行的俩个函数 (dy() || dK())返回值改为 return true; // 这俩个是判断 license 是否过期的
2. 把 426 行的函数 (dA()) 返回值改为 return false; // 这个函数是判断 license 是否禁用
3. 把 432 行的函数 dG() 返回值改为 30; // 这个看起来是使用到期天数



```
public boolean dy() {
      return false;
    }

public boolean dK() {
      // if (this.cK) {
      //   return true;
      // }
      // if (this.cP == null) {
      //   this.cP = dJ();
      // }
      // int epochDay = (int) (this.cP.toEpochDay() - t3.utils.j.GnBN.aQn().toEpochDay());
      // if (epochDay < 0 || epochDay > 35) {
      //   j(true);
      //   c((LocalDate) null);
      //   return true;
      // }
      return false;
    }
public boolean dA() {
      return false;
    }

public int dG() {
      // if (null == this.cP) {
      //   return 0;
      // }
      // int epochDay = (int) (this.cP.toEpochDay() - LocalDate.now().toEpochDay());
      // if (epochDay >= 1) {
      //   epochDay++;
      // }
      // int max = Math.max(0, Math.min(dI(), epochDay));
      // if (this.cK) {
      //   return 0;
      // }
      return 30;
    }
```


改造完之后编译, 生成 t3.common.c.h.n_tr.class;
之后压缩软件打开 data-man-mongodb-ent-2024.2.0.jar 替换之




## 移除签名认证
然后重启, 发现程序启动不了, 用命令行重启, 发现一下报错;



看来程序有文件完整检测;
要关闭也很简单, 把 这个 jar 包 META-INO 下的签名信息删掉就可;



删掉后, 继续重启, 这个时候程序进来了, 但是弹出一个对话框之后就退出去了;



看来签名没有彻底关闭 ; 我们搜索下关键字 Please re-install



定位到了 hbwp的 e 方法, 看了下, 这个函数会教研所有jar 的 签名, 如果签名不存在也会报错;
跟之前的处理办法一样, copy 改造;

```java
    public static void e(URL url) {
      if (cZ) {
            return;
      }
      // 这里删除掉所有签名验证的代码;
      cZ = true;
    }
```

然后继续, 编译, 覆盖,重启, 成功拿下



      




## Release

编译后的 class 文件, 以及脚本已放 Github:

https://github.com/marlkiller/studio_3t_patch


## 后记


仅供研究学习使用,请勿用于非法用途
注:若转载请注明来源(本贴地址)与作者信息。


无敌小儿 发表于 2024-4-25 15:27

Vvvvvoid 发表于 2024-4-25 15:16
是的, 混淆过的代码, 太恶心了,不想费劲折腾了


大佬,我照着您的步骤编译了下没有成功,方便了给看一下错在什么地方了,给指点指点

请叫我QS 发表于 2024-6-6 17:21

Vvvvvoid 发表于 2024-6-5 18:58
有个空指针要处理;
参考:
https://github.com/marlkiller/studio_3t_patch/tree/main/out/2024.2.0/t3

解决了,原来第二次进入能看得到报错的日志,获取体验截止时间的LocalDate报npe, 直接给它设个30天了

狂侠先森 发表于 2024-4-24 21:16

666 太强大了~支持

↗神奇、宝贝↘ 发表于 2024-4-24 22:01

这玩意儿好用吗?

songxp03 发表于 2024-4-24 22:08

这软件感觉比navicat好使

Vvvvvoid 发表于 2024-4-24 22:13

songxp03 发表于 2024-4-24 22:08
这软件感觉比navicat好使

mongodb 这种细分领域, 还是这个强

xixicoco 发表于 2024-4-24 22:58

这个软件不错,感谢这么详细的分析

SGC沉默 发表于 2024-4-24 23:32

大师是依据的几千年大数据

Lty20000423 发表于 2024-4-25 07:41

真的太强大了

tianmenghuan 发表于 2024-4-25 07:48

强大   支持 支持{:1_921:}

WilsonZtw 发表于 2024-4-25 09:54

大佬iOS 逆向有相关的资料学习吗
页: [1] 2 3 4
查看完整版本: Studio 3T 2024.2.0 [JAVA] 逆向分析,跨平台通杀