开发工具
目前常用android studio进行安卓代码开发和调试,开发好一个安卓程序后一般会在虚拟机和真机上进行功能测试。
打包后代码一般是以为apk作为后缀,英文名为Android application Package。apk文件中包含了二进制代码,资源文件,配置文件等。他可以使用解压工具进行解压。
我们以一个简单的hello程序来看看解压apk后的文件是怎么样的。
这是一个apk文件
把他后缀名修改为.zip然后进行解压。如下
下面来说明一下各个文件的用途:
- AndoridManifest.xml
安卓程序必要文件,他描述了应用的名字,版本,权限等文件。 - res目录
存放一些图片等资源文件的地方 - META-INF目录
存放一些应用的签名信息等,保证应用的完整性。 - lib目录
存放一些程序依赖的native库,一般是c++编写的so文件。跟进cpu不同存储于不同的目录。 - resources.arsc
存储编译好的资源,包括项目工程中的res/values目录里的xml文件,它们都被编译成二进制格式 - classes.dex
项目中的java类都被编译到该dex文件
安卓分析过程
首先来看下安卓打包原理。这里主要侧重于java代码的编译。
普通的java文件一般由.java后缀命名,通过java编译器编译成.class文件字节码文件,然后通过java虚拟机来进行执行,目前主流java虚拟机为hotspot. 而安卓程序一般编译成dex文件,然后运行在Dalvik虚拟机上,所以我们上面看到的文件结构是classes.dex.
因此如果需求分析别人编译好的文件一般需要通过一些工具把dex文件转换成jar文件。
常用流程
- 通过dex2jar工具把dex文件转换成jar文件
- 通过jd-gui工具把文件导进来查看源代码文件
便捷流程,jadx-gui
jadx-gui工具是个可以快速反编译安卓apk包的工具,
直接把apk文件拖拽进来后就可以把文件的源码反编译出来,同时还可以把资源文件等反编译出来。他支持apk,dex,jar,aar等文件进行源码查看。比上述组合简单。我们看看jadx-gui反编译的文件结构。
可以看到,直接可以查看文件源码进行分析。
调试反编译后的文件
一般可以有两种方式来调试反编译后的方式
-
调试smali代码,重新打包编译
前面提到安卓程序是打包成dex文件的,运行在Dalvik虚拟机上,而我们反编译后的java代码是提供查看,不能修改的。想要修改的话,需要反编译出smali代码。smali语法是一种特定的 -
通过hook工具来动态修改程序运行过程中的数据
这种方式一般是通过查看源码,然后看看有哪些是可能是目标代码,通过劫持运行,修改内容达到影响程序运行目的。