落尘大大和你呢 发表于 2024-6-25 19:56

某小说去壳+VIP分析

本帖最后由 落尘大大和你呢 于 2024-6-27 11:54 编辑

## 前言
看完正己视频后一直想练手,又找不到好一点的目标,偶然一次听朋友说看小说要钱后就想到了一些小说APP,本来是直奔大一点的APP下手的,但是简单看了一下直接扔回收站了,转头找了一个小一点的APP作为练手。
**PS:新手入门真不建议直接上手大厂APP,纯纯折磨。**

### 某某小说
加固:腾讯加固。
检测:无frida检测,无xp检测。
版本:1.4.5

### 去壳
![](https://gagaimage-1306361164.cos.ap-nanjing.myqcloud.com/image/202406251654956.png)
FunDex去壳,运行FunDex后启动APP等待一下后回到APP的私有目录会看到几个dex文件。
![](https://gagaimage-1306361164.cos.ap-nanjing.myqcloud.com/image/202406251713449.png)
左边是APP私有目录,右边是APP结构。
对比一下dex文件可以发现左边有两个dex文件与右边的dex大小刚好一致,由此可以推断这两个dex文件就是壳,而剩下的dex文件就是脱壳后的。
把脱壳后的dex文件替换到APP结构目录中后**修复一下dex文件**签名APP安装(如有核心破解可不签名)。
启动APP无闪退即脱壳成功。

### VIP分析
拖到jadx分析,**isVip**大法找到方法。
```java
public boolean isVip() {
      return this.vip;
    }

```
在User类下定位到这个isVip方法,显然这个是用户信息类了。
我首先尝试使得这个isVip方法直接返回**true**。
#### frida调试
```js
let UserVip = Java.use("com.*******.******.****.model.****.User");
    UserVip["isVip"].implementation = function () {
      let result = this["isVip"]();
      result = true;
      console.log(`User.isVip result=${result}`);
      return result;
    };
```
spawn 和 attach 模式均可以。
刷新一下APP后可以看到Hook代码回显。
![](https://gagaimage-1306361164.cos.ap-nanjing.myqcloud.com/image/202406251911819.png)
同时APP也显示了会员信息。
![](https://gagaimage-1306361164.cos.ap-nanjing.myqcloud.com/image/202406251912543.png)
测试一下vip功能是否正常:

![](https://gagaimage-1306361164.cos.ap-nanjing.myqcloud.com/image/202406251913455.png)
显然只修改 isVip 的返回值是无法正常使用vip的功能的。

回到 isVip 方法继续分析:
查看方法的交叉引用:
![](https://gagaimage-1306361164.cos.ap-nanjing.myqcloud.com/image/202406251915827.png)
其中这个**return**嫌疑最大,跟进方法分析
```java
private static final boolean b() {
      User u = AppHelper.c().u();
      return (u == null || u.isVip() || u.getVipEndTime() == g.f("key_last_vip_end_time", 0L, 1, null)) ? false : true;
    }

```
其中的 isVip 方法已经处理过了,那么剩下的就是**getVipEndTime**方法了。
该方法直接返回了 vipEndTime 属性的数据。
不妨交叉引用看一下这个方法的调用:
```
str = String.format("会员有效期至:%s", Arrays.copyOf(new Object[]{DateTimeUtil.e(u.getVipEndTime() - 1440000)}, 1));

```
如此以来,代码就明确了。
虽然使得isVip方法直接返回了true,但 vip 的时间是小于当前时间的,所以vip功能无法使用。
1440000显然是时间戳了。
直接构造一个大于当前时间的时间戳使得 getVipEndTime 方法永久返回这个时间戳。

Hook
```
let UserVipTime = Java.use("com.*******.******.****.entity.User");
    UserVipTime["getVipEndTime"].implementation = function () {
      // console.log(`User.getVipEndTime is called`);
      let result = this["getVipEndTime"]();
      result = 4735689600000;
      console.log(`User.getVipEndTime result=${result}`);
      return result;
    };
```
此时再看vip到期时间:

![](https://gagaimage-1306361164.cos.ap-nanjing.myqcloud.com/image/202406251929798.png)
测试vip功能:

![](https://gagaimage-1306361164.cos.ap-nanjing.myqcloud.com/image/202406251930563.png)
正常使用。

PS:这个APP还可以自定义用户名,如果直接调取 User类下的 getNick 方法设置返回值的话是无法正常显示自定义用户名的
需要在调用 getNick 方法前调用一次 GetMobile 方法。具体逻辑就不再阐述了。

### 结语
其实逻辑并不复杂,稍微有点 java 功底都可以分析出 vip 的逻辑。以上算是看完正己大佬视频后的一个小锻炼,不过这还远远不够,在我寻找目标时发现一款天气APP,也可以分析出 vip 的逻辑,再后来编写为XP模块,目前已经完成对两款APP的 vip 功能 hook。

免责声明:
以上分析仅作为技术交流,凡是以此文章作为破坏目标APP,牟利均与作者无关。

pxhzai 发表于 2024-6-26 00:49

以下是20个知名的小说应用程序名称,这些应用在中国广受欢迎,提供了丰富的小说资源和良好的阅读体验:

1. 爱奇艺小说
2. 书旗小说
3. 掌阅iReader
4. QQ阅读
5. 翻阅小说
6. 多看阅读
7. 宜搜小说
8. 免费小说大全
9. 阅文小说
10. 米读小说
11. 追书神器
12. 17K小说
13. 飞卢小说
14. 晋江小说阅读
15. 起点读书
16. 红袖添香
17. 塔读文学
18. 横扫天涯
19. 百度阅读
20. 熊猫看书

这些应用不仅提供了广泛的图书选择,包括原创小说、经典作品、网络小说等多种类型,还常常有个性化推荐、夜间模式、离线下载等功能,满足不同读者的需求。

kittylang 发表于 2024-6-26 16:45

TwentyFour 发表于 2024-6-25 22:31
想请问一下 ,如果是作者要怎么修改这个才,能防住被破解

这种伪造客服端信息,伪造请求信息的破解方式,都可以用后端鉴权搞定。返回小说时先判断(从数据库中获取信息)他是否是真的vip,而不是前端传了个我是vip,你就信了,也不看数据库有没有他

小夜好坏 发表于 2024-6-25 20:11

看不懂代码 = = 愣是没看懂

kittylang 发表于 2024-6-25 20:59

大厂居然没对资源做鉴权:wwqwq

abc1234567890 发表于 2024-6-25 21:11

膜拜ing,视频还没学完

MrQuinn 发表于 2024-6-25 21:31

和楼上一起膜拜中!

lujiaqi66 发表于 2024-6-25 21:39

感谢分享!@!!!!

yan999 发表于 2024-6-25 21:43

感谢分享!!!

huguiquan 发表于 2024-6-25 22:14

大佬,膜拜,如何联系您啊,有问题请教!

TwentyFour 发表于 2024-6-25 22:31

想请问一下 ,如果是作者要怎么修改这个才,能防住被破解

rimelight 发表于 2024-6-25 22:47

感谢分享!
出现了,真正的逆向基础:isVip(不是
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 某小说去壳+VIP分析