APK逆向过程基础

一.APK的打包过程

首先可以看到Android官网给出的一张apk打包的基本流程图:

       


从中可以梳理出apk打包的基本流程有如下7步:

1. 打包资源文件

对象:Resource文件(res目录中的文件)、 Assets文件(assets目录中的文件)、 AndroidManifest.xml文件

工具:aapt(Android Asset Package Tool)工具,负责编译和打包资源

产物:项目中的AndroidManifest.xml文件和布局文件XML都会编译,然后生成相应的R.java,另外AndroidManifest.xml会被aapt编译成二进制,除了assets和res中的raw资源被原封不动地打包进APK之外,其它的资源都会被编译或者处理,会生成一个resources.arsc文件和一个R.java,前者保存的是一个资源索引表,后者定义了各个资源ID常量

 

2. 处理AIDL文件

对象:aidl文件

工具:aidl(Android Interface Definition Language)工具,即Android接口描述语言工具

产物:生成相应的Java文件供程序调用,若项目中没有使用到aidl文件,则跳过这步

 

3. 编译项目源代码

对象:R.java、Java接口文件以及工程源代码

工具:Java编译器(javac)

产物:生成多个.class文件(字节码文件)

 

4. 转换所有.class文件

对象:.class文件和第三方库的jar包

工具:dx工具

产物:生成classes.dex文件(Dalvik字节码)


5. 打包生成apk


对象:classes.dex文件、resources.arsc和其他的资源(没有编译的资源,如assets目录下资源、/res/raw目录下的资源)

工具:apkbuilder

产物:未签名的apk文件

 

6. 对apk文件签名

对象:apk文件

工具:JDK提供的jarsigner工具或Android源码提供的signapk工具

产物:Android调试程序时带有默认debug.keystore签名的apk 或者 打包发布时提供特有的签名文件的apk

 

7apk对齐处理

对象:签名的apk文件

工具:zipalign工具

产物:使apk中所有资源文件距离文件起始偏移为4字节的整数倍,从而在通过内存映射访问apk文件时会更快,对齐的作用就是减少运行时内存的使用

二、Android反编译

Android开发者反编译别人的apk,主要目的还是为了学习到更多,取彼之长,补己之短。那么如何反编译呢?

首先了解基本的apk包都包括哪些文件:(以下是本人打的最基础的apk包,解压后如图)

     
具体文件如下:
      名称       
        内容
                                                                                                     详细
META-INF
签名文件夹
三个签名证书(MANIFEST.MF、CERT.SF、CERT.RSA)。MANIFEST.MF文件是对每个文件的SHA-256-Digest;CERT.SF是对每个文件的头3行进SHA-256-Digest;CERT.RSA这个文件保存了签名和公钥证书。
res
资源文件
有animator,anim,color,drawable,layout,menu,raw,value等文件夹
AndroidManifest.xml
清单文件
记录应用的包名、版本、权限、引用的库文件等信息
classes.dex
执行文件
java编译后的Android可执行的dex文件
resources.arsc
编译后的二进制资源文件
记录了所有的应用程序资源目录的信息,包括每一个资源名称、类型、值、ID以及所配置的维度信息。 这是一个索引文件。

        其次了解Android中常用的反编译工具有三个:dex2jar、jd-gui和apktool,这三个工具的作用如下:


  1.  apktool:反编译生成smali字节码文件,提取apk中的资源文件。工具下载地址:https://ibotpeaches.github.io/Apktool/install/
  2.  dex2jar:将apk中的classes.dex文件转换成jar文件。工具下载地址:https://github.com/pxb1988/dex2jar
  3.  jd-gui:查看由dex2jar转换成的jar文件,以界面的形式展示反编译出来的Java源代码。工具下载地址:http://java-decompiler.github.io/


工具具体的使用方法:

(一)apktool的使用:

① 进入apktool文件夹执行如下命令,反编译指定apk文件

② 最终会生成一个对应文件夹,如下:

          
具体文件如下:

名称

内容

详细

original

包括/META-INF、

AndroidManifest.xml(这是二进制的清单)

 

三个签名证书(MANIFEST.MF、CERT.SF、CERT.RSA)

.....

res

资源文件

有animator,anim,color,drawable,layout,menu,raw,value等文件夹

smali

源代码文件夹

项目源代码.smali文件

AndroidManifest.xml

清单文件

记录应用的包名、版本、权限、引用的库文件等信息

apktool.yml

apktool.yml文件

记录了apk名、packageInfo、sdkInfo(minSdkVersion和targetSdkVersion)、versionInfo(versionCode和versionName)

③ 根据需求修改相关的资源和代码后,利用apktool进行二次打包:

       

 经过执行以上的命令,app-release文件夹会增加两个文件:

         

⑤ 其中/dist文件夹里面的便是二次打包生成的未签名的apk包,接下来便要对其进行签名才能正常安装:


 
其中第一个红圈指的是签名文件,绿色框指的是签名后的文件名, 黄色圈指的是待签名的apk, 第二个红圈指的是签名文件的别名。执行命令后输入签名文件对应的密码便可生成指定名称的签名apk,至此apktool工具大概的使用就差不多了。

(二)dex2jar的使用:

① 如图,执行d2j-dex2jar.bat app-release.apk命令:(实际上是反编译apk里的classes.dex文件,读者也可以执行d2j-dex2jar.bat classes.dex这个命令)


② 生成一个app-release-dex2jar.jar文件(或者是classes-dex2jar.jar文件) 

(三)jd-gui的使用:

运行下载的jd-gui.exe,运行jd-gui.exe 点击File--->OpenFile--->classes-dex2jar.jar,打开刚才使用dex2jar反编译生成的jar文件便可出现如下界面:

至此,本人所了解的apk逆向过程的基础基本如此,若要了解更多还需更进一步的学习!

 

 

参考链接:https://blog.csdn.net/luoshengyang/article/details/8738877

https://www.cnblogs.com/royi123/p/3576746.html

https://blog.csdn.net/goodlixueyong/article/details/51126874

https://www.cnblogs.com/xunbu7/p/7345912.html

https://blog.csdn.net/loongago/article/details/89646920#7_APK_55

https://www.52pojie.cn/forum.php?mod=viewthread&tid=822434&page=1

 

 

 

 

 

 


全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务