五、Android安全机制之反编译(你也可以拥有iPhone X)

    Android应用的反编译需要了解smali,熟练使用常用的反编译工具。比如apktool,Jd-jui,dex2jar,Android逆向助手,AXMLPrinter2,jadx,Xposed,IDA,APK改之理,AndroidKiller以及一些adb、aapt指令和windows批处理等。

    关于反编译的流程和工具的使用方式,下面以一个反编译实例来进行阐述。首先明确我们的目标就是逆向手机QQ,需要达到两个目的:

1,修改QQ空间说说尾巴的手机型号,比如修改为iPhoneX,先上效果图


2,阻止QQ消息的撤回。

    实现这两个功能只需要三步即可:

破解签名→修改本机信息→找到并删除撤回逻辑代码

1、破解签名:

    这里可以使用网上一个大神4哥写的工具——kstools,其原理就是hook了pms,工具地址:https://github.com/fourbrother/kstools

    首先下载此工具,然后根据操作说明,配置好JAVA_HOME和aapt工具目录,把手机QQ的Apk命名为src.apk放入文件夹,双击kstools.bat即可执行破解。

扫描二维码关注公众号,回复: 5555649 查看本文章

    步骤都很明确,这里就不赘述了,执行完后生成signed.apk,直接安装发现并没有破解成功,提示Appid is invalid!


    直接打开把刚刚安装的apk里面class.dex解压出来用jadx打开:

    发现hook代码是成功添加了的,然后查看是否有添加在application的attachBaseContext


    显然并没有添加hook调用代码,这也是此工具的一个bug,那么接下来我们手动添加,为了方便,我这里写了两个批处理Dex2Smali.bat和DexDecompile.bat:


    Dex2Smali是把dex转为smail,当前文件夹放入class.dex,双击生成包含smail的classes文件夹:

    接着找到从classes文件夹找到QFixApplication.smali,接下来只要修改此文件即可

    为了更便捷的修改,这里直接将此文件复制到AndroidStudio里,同时把那两个hook文件代码也复制过来,保持相同的包名,然后在相同包名下新建一个QFixApplication.java继承Application,重写attchBaseContext方法,在方法里写入hook代码的调用,为什么要相同包名呢?因为生成的smali的方法调用是携带包名信息的,如果不一样则会重打包失败。弄好了如下图所示:

接着通过插件执行Smali转换,插件请自行去下载安装

    转换完成后直接找到attchBaseContext方法,复制下面红框那句,这句其实就是调用hook方法转换为smali代码的形式。

    接下来打开QFixApplication.smali,找到attchBaseContext方法添加上面这句代码


    把修改好的QFixApplication.smali文件覆盖原文件,完成后直接执行DexDecompile.bat,这个批处理文件作用是将smali转成dex,然后替换src.apk里的dex文件,重签名,adb安装和打开应用。通过这一系列的步骤之后,签名就已经被破解,并可以直接安装打开,此时的QFixApplication.java的attchBaseContext代码如下:


2、修改本机信息:

    至此,签名已破解完毕,接下来修改本机信息,安卓中获取手机信息是通过Build类来获取,所以只要修改Build类里对应的值,则可以修改本机的一些信息,比如,硬件厂商,手机型号等信息。在ServiceManagerWraper添加如下代码,转为smali并替换即可。


3、找到并删除撤回逻辑代码:

    当消息被撤回,聊天窗口会显示xxx撤回了一条消息,那么我们以“撤回了一条消息”这个字符串为入口,找到最终的逻辑代码,为方便查找,这里用了改之理工具打开。

    直接搜索“撤回了一条消息”,在strings.xml里搜索到对应的结果,显然资源名被混淆了。

    搜索_?m@0x7f0b2b32,找到对应的id

    接着再搜索id“0x7f0b2b32”

    代码里有两个类用到,分别是TroopHandler和BaseMessageManager,因为消息撤回可以在多个场景(私聊,群聊,讨论组聊)下使用,应该有统一的某处处理,猜想应该是在BaseMessageManager类里处理。BaseMessageManager类用到此id的在一个 public void b(ArrayList arrayList) 方法里。直接暴力一点把BaseMessageManager.smali里这个方法里所有代码去除,然后替换重打包。发现消息已经无法被撤回了,也证明了我们的猜想是正确的。

    适当的猜想有助于我们在反编译过程中快速找到正确的突破点。上面搜索关键信息用到了改之理,它是一款反编译编辑器,反编译后的smali代码可以直接编辑完重打包安装,但仅限于体积较小、未加固、未防apktool的apk,所以局限性很大,这里只用到了它的搜索功能。

郑重声明:本编内容只限于学习研究范围,请勿用于商业谋利及任何非法的目的,否则带来一切法律责任都由操作者承担,与本文作者无关。








猜你喜欢

转载自blog.csdn.net/u012874222/article/details/78765746
x