反编译 — 在apk文件中能得到什么
最近在做android客户端与服务器安全通信,有一种常见的不安全因素:很多软件常常会被人从apk文件中获取到下载地址或帐户信息。一个打包成apk的软件,通过反编译可以获得哪些信息呢?下面我们来动手反编译一个简单的demo--HelloWorld。
将生成的HelloWorld.apk使用压缩软件打开,看到下面几个文件/目录
- META-INF
- res
- AndroidManifest.xml
- classes.dex
- resources.arsc
其中,res中存放着所有的图片文件以及xml文件,也就是在eclipse工程目录中res下面的所有资源。这里的xml文件是经过压缩的,用AXMLPrinter2工具可以打开。
这是反编译出来的AndroidManifest.xml
怎么样,是不是跟源代码一模一样?
resources.arsc文件中保存的是编译后的二进制资源文件,许多做汉化软件的人都是修改该文件内的资源以实现软件的汉化的。
classes.dex是java源码编译生成的字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,.dex文件与.class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。
dex2jar是专为反编译.dex而开发的工具,它可以把.dex文件反编译成为.jar文件。然后用JD-GUI工具将.jar文件反编译成.java文件。
这是反编译出来的MainActivity.xml
下面是源代码:
经过反编译的代码虽然可读性不是很好,但是跟源码几乎没什么差别。在开发时如果你直接将账号等重要信息放到java代码中,那就没有任何安全性可言了。
经过反编译,anroid项目的源码全部暴露无疑,那是不是可以通过反编译将一个android软件改成自己想要的样子?答案是否定的,在META-INF目录下存放的是软件的签名信息,用来保证apk包的完整性和系统的安全。在软件安装时应用管理器会对包里的文件进行校验,如果校验信息与META-INF目录下的信息不一样,系统就会拒绝安装这个软件。另外,专业的编程人员都会把重要信息封装到.so库文件里,这些信息是无法被反编译的。
即使这样,对一个软件进行像汉化这样的操作却是足够了。