Android APK结构、反编译详细解说

来源:互联网 发布:java转smali工具 编辑:程序博客网 时间:2024/05/29 16:31

申明:本文部分内容为网络相关资料整理,并结合本人实际工作总结而成。请引用或者转载注明出处,对于文章内容有疑问请留言。

一、APK结构

APK是Android Package的缩写,即Android安装包。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。APK文件和Sis一样最终被android sdk编译的工具打包成一个为apk的安装程序文件格式,apk文件其实是zip格式,只是后缀名被修改为apk,其中包含Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。


Assets目录:可以存放一些配置文件,这些文件的内容在程序运行过程中可以通过相关的API获得。具体的方法可以参考SDK中的例子:在sdk地SDK\1.6\android-sdk-windows-1.6_r1\platforms\android-1.6\samples\ApiDemos例子中,有个com.example.android.apis.content的例子,在这个例子中他把一个text文件放到工程的asset目录下,然后把这个text文件当做普通文件处理。处理的过程在ReadAsset.java。同理,asset也可以放置其他文件。


Lib目录:目录下的子目录armeabi存放的是一些so文件。Eclipse在打包的时候会根据文件名的命名规则(lib***.so)去打包so文件,开头和结尾必须分别为“lib”和“.so”,否则不会打包到apk文件中。其他非Eclipse开发环境没有测试过。如果你是用sdk和ndk开发的话,这部分很重要,甚至可以通过一些不是so文件的文件通过改名打包到apk中。


META-INF目录:存放的是签名信息,用来保证apk包的完整性和系统的安全性。在eclipse编译生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。这就保证了apk文件里的文件不能被随意替换。比如拿到一个APK包后,如果想要替换里面的一幅图片,一段代码,或一段版权信息,想直接解压缩,替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有利于保护系统的安全。


Res目录:存放资源文件。包括图片,字符串等等。


AndroidManifest.xml:该文件是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息,如要把apk上传到Google Market上,也要对这个xml做一些配置。在apk中的AndroidManifest.xml是经过压缩的,可以通过AXMLPrinter2工具解开,具体命令为:java -jar AXMLPrinter2.jar AndroidManifest.xml


classes.dex文件:classes.dex是java源码编译后生成的java字节码文件(首先是java文件通过jdk编译成字节码文件然后经过dex编译成classes.dex)。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。Android模拟器中提供了一个dex文件的反编译工具,dexdump。用法为首先启动Android模拟器,把要查看的dex文件用adb push上传的模拟器中,然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。另,有人介绍Dedexer是目前在网上能找到的唯一一个反编译dex文件的开源工具,需要可自己编译源代码,还有,我发现在安卓上也有工具反编译出apk源代码。


Resources.arsc:编译后的二进制资源文件的索引(apk文件的资源表索引)。


上面这些资源最后通过aapt这个工具打包成apk,其实当生成apk的时候就会调用这个命令。

二、apk的反编译

使用工具:apktool

1.下载上述工具中的apktool,解压得到3个文件:aapt.exe,apktool.bat,apktool.jar ,将需要反编译的APK文件放到该目录下,打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令

apktool.bat d -fWebView1.0.apk  test

 

获取成功,之后发现在文件夹下多了个test文件,点击便可以查看该应用的所有资源文件了。

三、apk Assents文件夹url.properties配置文件的替换

   

assents里的url.properties文件进行替换一个新的同名文件,原来配置文件url:www.baidu.com,更换为www.sina.com。

四、将apk重新打包

1.将反编译完的文件重新打包成apk,输入apktool.bat   b    test(你编译出来文件夹)便可

    

新的apk生成在dist文件夹里。

 

2.将dist文件夹里的WebView1.0.apk文件夹放到autosign的目录下面,在命令行输入:java -jar signapk.jar testkey.x509.pem testkey.pk8WebView1.0.apk hellodemo.apk,得到的新的hellodemo.apk可以在手机上运行,登陆新浪网。

五、综上

1.Apk文件的反编译需要用到apktool工具,配合命令可以反编译apk。

2.反编译之后,配置文件在assents文件夹里,这里我是手动将里面的配置文件进行替换。

3.替换完之后,用命令行通过apktool将反编译得到的test文件夹进行打包,打包之后会在test文件夹里生成build文件夹和dist文件夹。重新生成的apk在dist文件夹里。此时,apk没有重新签名,不能运行。

4.对apk进行签名,将apk文件手动复制到Auto-sign文件夹里,通过命令行生成新的apk。此时可以成功运行。

Apktool.bat d -r WebView1.0.apk

apktool.bat   b  WebView1.0

六、相关工具下载

百度云:链接:http://pan.baidu.com/s/1caCOEi 密码:bp4v


1 0