首页
社区
课程
招聘
[原创]某记账APP的永久VIP功能和签名绕过等
发表于: 2026-10-2 22:41 385

[原创]某记账APP的永久VIP功能和签名绕过等

2026-10-2 22:41
385

直接应用商场下载,MT看了下没加固

图片描述

打开提示要更新,而且没有关闭键,是强制更新,这不得看看啥逻辑

图片描述

因为弹窗在app启动就检测了,通过了才加载主页,那基本上就是启动开始阶段就去调用了,现在看到的页面已经是检测完的弹窗。那这时候的思路可以是

1、定位当前弹窗,定位弹窗调用的判断逻辑(关键词、算法助手定位堆栈、资源id定位等,当然也有可能关键词是接口返回的)

2、直接搜更新相关的关键词,尝试缕清逻辑

我这里用第二个方法,先尝试找到更新相关的方法

简单搜下更新相关的关键词 (systemUpgrade|forceUpdate|checkVersion)

图片描述

这里说个思路,大致定位缩小范围再逐步定位

所以基于这个思路,基本上,第三方SDK,bean,model等优先级先调低,先看自身包名调用的,那能不能找到蛛丝马迹。

最终定位到 forceUpdate 方法,这里实在不行用update去搜,再用上面的方法去缩小范围定位也是可以的

图片描述

forceUpdate获取布尔值后用做判断,zisShowing的值为false并且forceUpdate的值为true时,走else逻辑,实例化Alert弹窗,猜测这就是提示更新的逻辑,直接hook getforceUpdate返回false

没有符合的就大范围地搜,根据文件路径自行过滤 (Upgrade|Update),然后大略看一下, 比如看到forceUpdate这样就可以重点关注

登录后大致有这些功能,各个地方都在提示开通VIP,就按这些功能来吧,看哪些功能触发的时候提示要开通VIP。

图片描述

先点击聊天记账,看到有每日试用次数,并提示开通会员

图片描述

直接搜 今日试用 关键词,几个都一样点进去看

图片描述

这里讲一下,整体的逻辑先不看,先关注重点参数,不然一股脑地就分析各个调用逻辑容易被绕进去。这里着重关注还剩多少次这个多少,就 f32935i0 参数,往上追这个参数是 aiVipCount.getReceiveTrialTimes() - aiVipCount.getUsedTrialTimes(),这两个都是get方法,那思路就有了。

图片描述

hook getReceiveTrialTimes和getUsedTrialTimes,一个直接为超大数字,一个为0。

这里有个小坑,一开始为直接返回 9999 不行,因为这两个参数定义为 Integer (包装类型/对象) ,不是 int (基本类型)。Frida 在桥接 JavaScript → Java 时,需要保证返回值 类型兼容 。方法声明的返回类型是 java.lang.Integer (对象),而 JavaScript 的 9999 是一个 JS 原始 number。Frida 的 Java 桥接层 不会自动把 JS number 装箱为 Java Integer 对象。

小计:

然后就可以了

图片描述

自动记账默认是关的,点击开启会直接弹出开通VIP的按钮。

图片描述

这是算法助手抓 onclick 的,但实际看不到细节的方法调用

从这里可能看到回调类 = anp.kad.sdk.n2。搜索 7f0905b3 得到控件名 layout_switch 。触发的功能是"自动记账",最可能是 ActivityAutomateBinding。看一下谁在使用这个Binding

图片描述

这个 this.f31135l = constraintLayout10; 这里默认点ctrl+鼠标左键 / 选中按x,都查不到,要有有意识地去查找这个值

图片描述

然后就得找实际触发的方法了。

理论上通过封装好的什么方法都是用 setOnClickListener ,可以直接全局搜 f311351.setOnClickListener / setOnClickListener 再一个个去定位

图片描述

这里找到对应的方法,但实际触发的是case 1检查悬浮窗,这很明显不是我们要找的。之前绑定事件是嵌套式的子父结构,算法助手hook的是默认父节点,constraintLayout10 继续往下是 constraintLayout11,对应的 f31136m,就是上面截图中 i2 = 1上面那个,对应的ViewOnClickListenerC2532n2方法,第一个参数是 8,看下case 8分支。

图片描述

这里就开始判断分支了 m80f 方法进去判断等于,其实就是判断用户类型是否为 3,猜测就是判断用户是否为 VIP,第一个分支是不等于,第二个分支有 automateActivity 去调用方法,猜测第二个分支是判断用户为 VIP的情况。实在不行直接hook 返回true/false判断即可

图片描述

现在是hook可以,也知道要修改哪几个值,那就来修改静态 smali 代码,打包apk

这一块MT管理器确实不错,但这次我用电脑操作,反编译和打包 apk 用 apktool,签名用 apksigner。

文件路径: smali/com/jxm/bill/anxin/bean/AppInfos.smali

搜索 getForceUpdate ,找到:

替换为:

文件路径: smali/com/jxm/bill/anxin/bean/AiVipCount.smali

搜索 getReceiveTrialTimes ,找到:

替换为:

搜索 getUsedTrialTimes ,找到:

替换为:

文件路径: smali/com/jxm/bill/anxin/base/BaseActivity.smali

注意 :smali 里方法名是 N ,不是 m34835N 。

搜索 .method public final N()Ljava/lang/String; ,找到类似:

替换为:

这里忘记截图了,签名打包后,直接安装启动提示 "非法请求"。基本上就是 APK 有做签名校验了,毕竟hook没问题重新打包就出问题了,代码中也搜不到提示的关键词,猜测是服务器端的签名校验,这里可以用MT的去签名校验试试,但默认只能过客户端校验的,思路也是修改 smali 代码绕过校验。


传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!

收藏
点赞 ・2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回