|
|
本帖最后由 不熬夜的听冬酱 于 2025-6-27 23:57 编辑
前 言
我发现论坛很多人被这个APP的签名校验所困扰。
那我听冬大好人不得站出来一下了
事 先 声 明
该软件我在去年就已经研究好了,由于时间磨练,今天是完全重新从头开始分析
(方便代入第一人称)。
改法不同于我之前,也就是完全新写!
版本:最新版(理论通用)
教 程 目 录
• 前言
• 分析(学霸请看此处)
• 总结(懒人请看此处)
搬好小板凳,做好笔记,开讲咯!
教 程 开 始
首先我们定位到导致闪退的两个so文件:
- libunity-interface.so(本期主角)
- libns.so( 保护)
我们发现初始化JNI方法在so里面,所以我们直接卸载软件即可。

开玩笑!我们直接打开ida分析。
先搜索方法

图解:我们发现方法是JNI交互方法,就是和JAVA沟通的桥梁。
注意看这里调用了一个函数,我们进去看看

关键伪C代码:
- if ( !(*(unsigned __int8 (__fastcall **)(__int64))(*(_QWORD *)a1 + 1824LL))(a1) )
- {
- free(v5);
- free(v7);
- free(v9);
- v13 = sub_6107C(v15);
- if ( (v15[0] & 1) == 0 )
- return v13 & 1;
- goto LABEL_5;
- }
- (*(void (__fastcall **)(__int64))(*(_QWORD *)a1 + 128LL))(a1);
- (*(void (__fastcall **)(__int64))(*(_QWORD *)a1 + 136LL))(a1);
- v13 = 0;
- if ( (v15[0] & 1) != 0 )
- LABEL_5:
- operator delete(v16);
- return v13 & 1;
复制代码
且最后有一个异常调用
翻译:检测失败

小总结:
该调用函数是检测某样东西的。
根据伪C的关键代码,分析得知,通过比较如果v13等于0,就视为检测不通过,报出异常结果。如果等于1,就直接给v13返回检测通过,就正常加载。
我们不急,退出函数,我们接着看init。
仔细观察中间的代码

有一个"BLR"指令,大概意思就是虚函数。
在这里是全局初始化。
当通过该指令时,就忽略掉其他信息,直接加载所有资源。
换句话说就是,他默认是不走这里的,所以导致初始化未完成直接闪退了。
这个就是一个修复性的关键指令。
知道就行了。
多一嘴:
你看明白后应该就会发现,这个so文件,并不是签名校验,而且更偏向于环境监测。
于是,我们衍生出两种解锁方法!
方法一(个人推荐)
之前也说了,调用的检测函数需要返回真就是检查通过,那么我们可以这样改:

图解:
从ADD指令直接B指令跳转到最后的RET框。然后给第一条修改为MOV X0, #1
这样函数就跳过中间复杂的验证,直接返回1给v13作为返回值。
至于为啥保留STP,LDP这些指令,了解过的都知道。这里就不过多解释。
目的:堆栈平衡,避免溢出。
方法二
之前说了BLR X8是一个无敌加载指令,所以我们直接强制经过该指令就行了。

你可以使用B跳转,也可以直接像我一样NOP即可。
两个方法二选一都可以达到去除环境监测的效果。
教 程 结 束
最后发言:
因为要两个so一起才能达到手撕目的,但是我之所以先发一个是因为已经够了!
当然……
根据陈玉京二傻子总结,libns.so是整个签名so文件。
所以……
MT普通去签就可以直接去除了。
(前提,先把libunity-interface.so环境给过了)
就酱紫,拜拜~ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +3
金币 +3
|