在应用开发的过程中难免会遇到想要看看某一款App的功能是如何实现的,这样就需要逆向对方的代码。
所需环境,工具
工欲善其事必先利其器,需要准备如下工具:
ApkTool:是一款应用在Apk上的逆向工程的工具,它有编译、反编译、签名等功能,在这篇文章中会讲解如何利用ApkTool查看apk的xml文件、AndroidManifest.xml和图片等。
dex2jar:顾名思义,这款工具的作用主要是将dex文件转换成jar文件,转换成jar后我们才好借助JD-GUI来查看反编译dex后的代码;
JD-GUI:一款Java反编译器GUI,通过它我们能查看到反编译后的dex的代码,通常需要配合dex2jar使用;
关于这些可以参考这篇文章:link
更为方便的是:jadx,jadx可以直接将apk反编译出java源码,但是并不是所有的都能被反编译出来需要我们学一些smali语法来了解相关实现逻辑。
Root手机并修改成可调试release应用:
以上是逆向apk所需要的工具,其次还需要一台root的手机,关于root手机可以参考twrp相关的介绍,还需要安装Magisk等。在安装好Magisk并root手机后安装其相关插件,props和依赖等busybox,这些插件的安装最好系手机系统版本而定可能老一些的系统在使用props修改系统的ro.debuggable属性失败,在这个时候可以用mprop尝试修改系统属性实现对release包的debug。
需要配置Android Studio以调试apk反编译出来的smali代码:link(有些需要动态调试下断点的地方需要此类功能)
举例说明
故事是这样开始的,一日xx领导说让在下看看某某app的某某功能是怎么实现的?在一顿操作猛如虎后完成环境搭建。安装好某某app,进入其中某某页面抓其布局如下:
根据页面布局呢,我们可以找到对应组件的id,既然知道id,那么就可顺藤摸瓜找到相关逻辑,比如id/ps的按钮,通过软件行为可知是做了删除操作,具体逻辑怎么看呢?窃听我慢慢分析。
首先作为开发者我们肯定希望组件是可以复用的,那么根据布局即可猜测ps组件所在的ViewGroup很可能是一个单独的布局文件,于是我开启了全局的搜索,我找到了如下文件:
看看抓取的布局结构与找到的基本能对应上了。ps这个关键字还有利用价值,我继续寻找其对应的16进制id值,搜索范围可以定在xml文件中即可,在public.xml中我找到了对应的值
<public type="id" name="ps" id="0x7f110262" />
有了这个0x7f110262值搜索范围可以确定在java或者smali文件中了。继续搜寻
至此我们找到了对应组件的创建逻辑,但是其点击后执行的逻辑还没有找到。
在前面我提到过,一般开发者会将一个组件封装进行后续多次使用,鉴于这种思想我们全局去搜索这个组件所在类的使用地方
鉴于我分析的页面这个组件也的确可能是动态创建出来的,至此基本符合我们的预期猜测。到这里我们继续寻找是不是有onClick点击的事件呢?
果然在这个类的最下方我看到了点击后删除的逻辑。至此分析完成。
后记
在这个分析过程中需要站在一个开发者的角度去思考,如果你是开发者你会怎么写这种代码?有了上述工具与环境还有一些经验即可找到一些我们想要的逻辑,当然这个例子相对简单,有些复杂的逻辑不方便寻找可能还需要我们使用到Xposed进行远程hook查看相关逻辑比如在怀疑点打印调用堆栈,log日志等。
一定要学习的目的来看别人的劳动成果每一款app都是凝结很多开发者的心血,不可利用到商业用途。切记~~~~~~