〖专业教程〗逆向一款清理工具 清浊 过签名校验和开启高级功能 dex分析 so修改

菜鸟写的帖子,标题只为吸引点击量,实际上是菜鸟教程不设阅读权限了,大神勿喷

清浊是一款非常优秀的清理类工具,真的找不到第二款比他更好的app了,软件虽小,但功能齐全。比如空文件夹扫描,你去看看谷歌市场的app,随便挑一款那个扫描速度慢的要死,完全比不上清浊。当前使用的软件样品为最新版1.5.4,未来软件更新方法可能会失效,具体升级后的效果请自测。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放回去,试试看能不能开启高级版。

测试打开缓冲区内存,成功!

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
  • 管埋员

    昵称

  • 取消
    昵称