AndroidPackage(APK)文件是Android应用程序的安装包,通过将APK文件直接传输到Android设备中来实现安装。APK文件实际上是以zip格式打包的,但后缀名被修改为apk。解压APK文件可以看到其中的Dex文件,这是Android Dalvik执行程序的字节码。与Java ME的字节码不同,Android在运行程序时需要先解压文件。你甚至可以将APK文件的后缀名改成zip,然后打开查看其内容。
我们可以随便找个apk,将apk后缀改成 zip,既可打开查看里面的内容:
META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。
在eclipse编译生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。同样在 Android平台安装apk时,应用管理器会对按照同样的算法对包里的文件做校验,如果校验结果与METAINF下的内容不一致,系统就不会安装这个apk。这就保证了apk包里的文件不能被随意替换。
res目录下存放的是资源文件。
AndroidManifest.xml(程序全局配置文件)是每一个应用必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等信息。
classes.dex是java源码编译生成的java字节码文件。
dex文件是应用安装时生成的虚拟机可执行二进制文件,如果应用还存在,删除了下次手机开机时还会 再次生成,卸载软件时会同时删除dex文件。所以没有必要手动删除dex文件。
resource.arsc是编译后的二进制资源文件。
正如上面所看到的,安卓应用apk文件不仅仅是包含有resource和编译的java代码的zip文件,还包含有classes.dex和resource.arsc等文件,但是这些文件直接打开是看不懂的,此时就需要借助工具--APKTool来帮助查看。
APKTool是用于逆向工程第三方,封闭式二进制Android应用程序的工具。它可以将资源解码为近乎原始的形式,并在进行一些修改后重建它们。它还使得使用应用程序更容易,因为项目如文件结构和一些重复性任务 的自动化,如构建apk等。
-
拆卸资源近原始形式(包括resources.arsc,classes.dex,9.png.和XMLs)
-
-
-
Smali调试(删除了2.1.0有利于IdeaSmali)
-
下载Windows 包装器脚本(右键单击,将链接另存为apktool.bat)
![AndroidPackage 反编译入门(一) AndroidPackage 反编译入门(一)]()
当然也可以 右键打开链接,然后复制,然后桌面新建文本.txt,然后将复制的粘贴进去,保存,将名字改为apktool.bat。
这里我将使用2.7.0版本进行演示,将下载的jar重命名为 apktool.jar
官网给予的步骤是,将两个文件(apktool.jar&apktool.bat)移动到Windows目录(通常 C://Windows),当然可以将这两个文件放在任何位置,然后将该目录添加到Environment Variables System PATH变量中。这里我放在了C盘,新建文件夹apktool:
![AndroidPackage 反编译入门(一) AndroidPackage 反编译入门(一)]()
添加至环境变量
![AndroidPackage 反编译入门(一) AndroidPackage 反编译入门(一)]()
尝试apktool通过命令提示符运行
![AndroidPackage 反编译入门(一) AndroidPackage 反编译入门(一)]()
一般来说,在用apktool反编译前不需要做其他任何事情,然而有些厂商,如小米,htc,三星等,定制 了framework文件并且他们在系统应用中使用了这些文件,因此,为了能够正常反编译这些apk,则必须拷贝反编译apk依赖framework文件。
apktool
if
/install-framework
使用apktool b testapp –o outtestapp.apk,不出意外程序就会编译成功,单编译生成的testapp.apk 并没有签名,还不能安装测试。一般情况下,保持原始签名不变,使用-c选项来保持。否则就要使用其他的签名工具来对apk签名了,如signapk.jar,auto-sign等。
META-INF包含apk的签名,使用-c/--copy-original来保持签名,使用原始AndroidManifest.xml文件。但是如果修改AndroidManifest.xml文件,签名也就丢失了。就要重新对其签名。
切换到apk所在的路径,并输入命令:apktool d xxx.apk,即可解压apk文件到当前文件夹
![AndroidPackage 反编译入门(一) AndroidPackage 反编译入门(一)]()
顾名思义,dex文件to jar文件,也就是将apk中的Java源码编译生成的Java字节码文件反编译成Java源码。
1. dex-reader旨在读取Dalvik可执行文件(.dex / .odex)格式,它具有与ASM类似的轻量级API。
2. dex-translator旨在执行转换作业。它读取dex-ir格式的dex指令,经过一些优化后,转换为ASM格式。
3. dex-translator使用的dex-ir,用于表示使用.class文件的dex指令dex-tools工具。
4. d2j-smali将dex反汇编为smali文件并从smali文件汇编dex。与smali / baksmali不同的实现,相同 的语法,但我们支持类型desc“Lcom / dex2jar t u1234;”中的转义
5. dex-writer以与dex-reader相同的方式编写dex。
下载:
https:
/
/sourceforge.net/projects
/dex2jar/files
/latest/download
安装:下载后直接解压即可
将test.apk 改为 test.zip,并解压得到:
![AndroidPackage 反编译入门(一) AndroidPackage 反编译入门(一)]()
运行命令:d2j-dex2jar.bat classes.dex,完成编译
JD-GUI是用于查看APK中的classes.dex转化成的jar文件的工具,即源码文件。
双击jd-gui.exe ,将jar文件拖到工作区即可打开
至此,对于apk文件的反编译就结束啦!!!
原文始发于微信公众号(灰枝大侠):AndroidPackage 反编译入门(一)
评论