好友
阅读权限40
听众
最后登录1970-1-1
|
芽衣
发表于 2020-9-19 09:52
本帖最后由 417788939 于 2020-10-3 09:27 编辑
菜鸟写的帖子,标题只为吸引点击量,实际上是菜鸟教程不设阅读权限了,大神勿喷
清浊是一款非常优秀的清理类工具,真的找不到第二款比他更好的app了,软件虽小,但功能齐全。比如空文件夹扫描,你去看看谷歌市场的app,随便挑一款那个扫描速度慢的要死,完全比不上清浊。当前使用的软件样品为最新版1.5.4,请勿用于最新版1.5.5。此后的版本如果被检测到签名失败会格式化手机,请注意!如果你不确保完全去除签名校验请不要使用破解版。5块钱永久激活,建议支持正版。
逆向中发现的问题:
1、如下图,第一次启动这个提示不知道为什么偏移了,应该属于bug,不知道作者什么时候修复。
2、如果手机中没有安装QQ,点击设置→加入QQ群谈论,会导致程序崩溃的严重bug。
准备工具:
1、IDA,以64位so为例
2、反编译工具,自备
部分分析结果略过,直接说结果,有兴趣的可以举一反三。
首先重签名软件,安装后崩溃。根据DDMS的日志找到出问题的类,发现是验证MD5。所以反编译的时候全词匹配关键字〖MD5〗,看看会有什么发现。
如上图,有10个结果,这些结果我都看过了,关键的只有红色箭头的方法。文件位于com/farplace/qingzhuo/c/C。然后找一下调用,看看是什么地方调用了a方法,所以继续搜索com/farplace/qingzhuo/c/C;->a。
如上图,只有2个调用,先看第二个。run()V在smali里面代表线程,而这个线程调用了签名校验,也就是说这个run线程在验证签名值是否正确,所以一启动就退出了。改法也很简单,图中红框代码全删他就不会执行签名校验了。这个和最新版share3.6.5一个逻辑,检测hook同样有线程。
至于第一个结果,有3个done方法,我还没搞清这个是干什么的,好像是验证版本,应该和联网升级有关,如果感觉心慌可以删掉。
最后来看一下上图绿色箭头的类,文件位于com/farplace/qingzhuo/util/DataCheckUtil。
如上图,红框的方法中有个finish,会关掉app,get0oo00Md5应该就是获取md5了,不对的话就会关掉,如果低内存的话也会关掉。黄色箭头的方法checkPmProxy应该是检测自身是否被一键拦截工具hook了,如果你用了一键去除签名校验应该会出问题。但是现在据我所知,除了MT管理器,极少数逆向玩家开发出了各种强大的过签工具,比如无视PM检测应该是近期才出现的新型一键技术,方便快捷。还有hook原安装包也是强大的过签名技术,重定向以后基本上很难检测到自身是否被修改了。
接下来是开启高级版功能,也比较简单。如果直接修改smali是不是太简单了点,所以我打算修改so达到开启高级版的目的,也是为了让一些小白萌新学习一下思路。
随便点击一个高级版的功能,会弹出“需要升级到高级版”的提示,根据提示逆向寻找弹出来源。
第一步res文件夹搜索关键字,只有1个结果,复制英文名字not_pro_notice,如下图:
第二步接着在values文件夹寻找ID,只有1个结果,可以知道ID为0x7f0f00e1。这个id就是在dex里面的地址,如下图:
搜索dex里面的id,有几个结果,我随便找了一个,部分代码如下:.method public synthetic n(Landroid/view/View;)V
.locals 11
invoke-static {}, Lcom/farplace/qingzhuo/util/EatMemory;->test()Z〖关键处〗
move-result v0〖抽取上方test的值放入v0〗
if-nez v0, :cond_0〖判断v0的值,如果等于1或者其他则跳转到:cond_0,反之继续运行〗
const v0, 0x7f0f00e1〖需要升级到高级版〗
const/4 v1, -0x1
invoke-static {p1, v0, v1}, Lcom/google/android/material/snackbar/Snackbar;->h(Landroid/view/View;II)Lcom/google/android/material/snackbar/Snackbar;
move-result-object p1
invoke-virtual {p1}, Lcom/google/android/material/snackbar/Snackbar;->j()V
return-void〖结束〗
:cond_0〖高级版地址〗
new-instance p1, Lcom/google/android/material/bottomsheet/BottomSheetDialog;
……
所以v0不能等于0,如果等于0就运行到非高级版的地方了,一般情况下赋值1即可开启高级版。通过跳转来到test方法,如下图这个方法在native-lib.c这个so里面加载,这时候需要祭出神器IDA
bool __fastcall Java_com_farplace_qingzhuo_util_EatMemory_test(__int64 *a1)
{
__int64 v1; // x21
__int64 *v2; // x19
__int64 v3; // x0
__int64 v4; // x20
__int64 v5; // x0
v1 = *a1;
v2 = a1;
v3 = (*(__int64 (**)(void))(*a1 + 48))();
v4 = v3;
v5 = (*(__int64 (__fastcall **)(__int64 *, __int64, const char *, const char *))(v1 + 1152))(v2, v3, "l1", "I");
return (*(unsigned int (__fastcall **)(__int64 *, __int64, __int64))(v1 + 1200))(v2, v4, v5) == 1971;
}
如上图,加载完毕后打开输出窗口,双击Java_com_farplace_qingzhuo_util_EatMemory_test,这个其实就是输出路径。看到这里萌新可能已经感到某个地方开始隐隐作痛了吧
通过伪代码分析,return就是要返回的数据,v5=x0,最后返回的是v5,所以我们现在只需要对x0进行赋值1,让函数无条件输出1即可。需要用到的汇编指令为MOV,和smali的const类似,比如mov r0,r1,就是把r1的值放到r0里面去。
回到IDA视图,定位到CSET W0, EQ,把这个指令改成MOV W0, #2(40008052),然后再来看一下伪代码,如下图:
伪代码已经显示最后返回1了,然后把修改好的so放回去,试试看能不能开启高级版。
测试打开缓冲区内存,成功!
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|