前面一节我们说过,修改APK最终是通过修改smali来实现的,所以我们接下来介绍的工具就是如何把APK中的smali文件获取出来,当然同时也需要得到AndroidManifest.xml等文件。直接修改APK后缀为ZIP得到的xml文件是不能直接打开的,需要转换一下格式才能查看和修改。横观所有的工具中,最最最强大的当然还是ApkTool,所以下面后重点介绍!OK,开始正题。
一、查看xml文件
如果只是简单的需要查看xml中的内容(例如只是想看看AndroidManifest.xml中的配置信息、主启动Activity、permission权限或布局文件等等),那么可以使用AXMLPrinter2.jar这个工具。使用方法很简单,例如想查看AndroidManifest.xml文件内容,为了方便,把AndroidManifest.xml和AXMLPrinter2.jar放到同一个目录下,在cmd中定向到该目录并输入:
- java -jar AXMLPrinter2.jar AndroidManifest.xml > tmp.txt
则会在该目录下创建一个tmp.txt文档,内容就是解码后的AndroidManifest.xml的内容。
这个方法有个缺点就是只能查看,不能修改后再转换回原格式的xml文件,需要修改xml文件内容的,下面会有介绍。
二、查看java源代码
直接解压apk只得到Dalvik VM执行的classes.dex文件,要通过这个dex文件查看Java源代码的话,需要使用dex2jar和jd-gui这两个工具。
我下载的是官方版本的dex2jar-0.0.9.9,解压后可以看到一大堆的bat和shell脚本。不过我们只需要用到其中的d2j-dex2jar或dex2jar.bat(Windows下)。具体操作步骤是:
1、把需要反编译的apk文件后缀改为zip,解压后取出其中的classes.dex文件,为了方便还是放到dex2jar-0.0.9.9目录下(和dex2jar.bat同一目录);
2、打开cmd,定位到该目录后输入:
- d2j-dex2jar.bat classes.dex
几秒后程序就会在该目录下生成了一个classes-dex2jar.jar文件,这个jar文件就是原java代码编译后产生的文件;
3、打开jd-gui软件,点击左上角的“Open a file”按钮并找到2步骤生成的classes-dex2jar.jar文件,找到你想查看的java文件,还原度还是挺高的。如果有需要把java代码保存下来,点击File-Save Sources或者Save All Sources把当前java文件或全部java文件保存起来。
注意的是,这些java代码(基本上)不能直接重新编译,因为可能存在代码混淆,而且复杂一点的逻辑有时候还原不回来,显示出很奇怪的代码,所以这个软件还不是很完善,但是用来参考原java代码逻辑够用了。
三、获取和修改smali文件
获取smali文件是反编译的第一步,获取的方法有两种:
1、baksmali.jar和smali.jar
baksmali.jar用来把dex或odex文件解析为一个一个的smali文件,使用命令:
- java -jar baksmali.jar -x classes.dex
它会在目录下生成一个文件夹(默认是out),里面保存的就是这个dex中的smali文件,我们可以打开查看和修改,修改完毕后,使用smali.jar打包回dex文件:
- java -jar smali.jar out -o classes.dex
其中out就是刚才使用baksmali.jar创建的文件夹名字。
这样修改后,直接放回zip中然后把后缀改为apk是不能直接安装到机子上测试的,因为你修改了里面的文件,还需要使用签名工具进行重新签名(稍后介绍)。
2、ApkTool——目前最强大的反编译工具
以上所有工作,除了查看java源代码,其实有一个工具可以帮你轻松做到,那就是由一个外国开发者制作的ApkTool.jar工具。它可以反编译apk中的资源文件、解码xml文件、生成smali文件,还能把修改后的工程逆向生成apk文件。换言之,有了它可以抛弃AXMLPrinter2.jar、smali.jar和baksmali.jar了,使用也相当的方便。
(1)、反编译apk得到smali和资源文件
例如要反编译的apk为zheshiyige.apk,那么把该apk与ApkTool放到同一目录,cmd执行:
- java -jar apktool.jar d zheshiyige.apk APKFiles
等待一段时间后(视乎apk文件大小),可以看到该目录下生成了一个APKFiles文件夹,里面就是我们需要的解码后的资源文件、xml文件和smali文件等。xml文件不需要再使用AXMLPrinter2.jar来解码即可直接查看。
(2)、回编译成apk文件
对反编译得到的文件进行修改后把它回编译也是很简单的:
- java -jar apktool.jar b APKFiles
同样等待一段时间后,如果修改正确没有错误的话,回编译产生的apk将会在APKFiles下的dist文件夹中,当然它也是没有重新签名的,不能直接安装使用。
四、对Apk进行签名
关于签名,可以有些童鞋会感到疑惑,下面先简要提一提:
1、为什么需要签名?
(1)发送者的身份认证,由于开发商可能通过使用相同的PackageName来混淆替换已经安装的程序,以此保证签名不同的包不被替换;
(2)保证信息传输的完整性,签名对于包中的每个文件进行处理,以此确保包中内容不被替换,防止交易中的抵赖发生,Market对软件的要求。
2、签名的一些说明
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序;
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证;
(3)如果要正式发布一个Android应用,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布;
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能;
(5)Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序;
(6)签名后需使用zipalign优化程序。
3、如何签名
签名工具有不少,这里仅提及其中的一个:signapk.jar。signapk.jar本来就是包含在android源码包中的一个工具,用它可以把上面经过反编译-回编译后得到的apk进行签名,由于直接使用signapk.jar进行签名很麻烦,而且最终使用的是下面最后谈及的综合工具,所以这里仅提及签名流程:
(1)、使用OpenSSL生成公钥/私钥对;
(2)、使用signapk.jar和(1)的公私玥对对apk进行签名。
这样经过签名后的apk才能安装到设备上进行测试。
五、推荐一个网友制作的综合工具:ApkTool + SignApk
程序员是最怕麻烦的,所以早就有网友用脚本把所有操作都帮我们整理好了,它其实就是帮我们做好了自动反编译、自动回编译和签名的工作,不用再每一次都输入大串的命令。需要下载的请点击下面的链接,使用方式直接打开就知道,说明中已经说得很明白了。
六、其他辅助工具
1、UltraFileSearch:这是个很!有!用!的软件!UltraFileSearch 允许你指定多个文件掩码和多驱动器和/或文件夹在同一时间,它能够整理出的文件和文件夹根据自己的性质(如更新日期),找到其中包含某特定词或句子的所有文件。
2、如果使用NotePad++修改smali文件,推荐使用一个语法高亮文件userDefineLang.xml,使用方法:放置到C:Users<用户名>AppDataRoamingNotepad++下即可。
Reference:
Android apk 签名: http://www.cnblogs.com/not-code/archive/2011/05/15/2047057.html