本文所用到的工具下载:
链接:http://pan.baidu.com/s/1i3uw4NN 密码:8hz5
最近在研究如何逆向android的app,于是就有了这篇android逆向入门的总结回馈互联网。
由于Android的.apk文件实际上就是一个zip文件,修改文件后缀后直接可以打开,效果如下图所示:
里面包含了的文件有:
META-INF:这个文件夹是用于保存签名文件,确保包的完整性的
res:apk所要用的资源文件,都是原封不动地保存,我们可以直接提取出来,做汉化时就可以直接阅读string文件然后进行修改
AndroidManifest.xml:编译过后的一个配置文件,用于声明程序中所包含的activity,service以及程序所具有的能力,也就是权限。
resources.arsc:编译过后的一个资源说明文件
classes.dex:重点来了,我们编写的Android程序,在源程序里的所有.java的文件,最终都编译到这样1个.dex文件当中,在Android手机上的dalvik虚拟机上执行。
下面开始讲解如何破解一个app程序的各种信息。
1、逆向.xml文件
由于apk包里的xml文件我们直接用记事本打开还是有一些乱码,所以需要我们还原才能更好的看出。
这里需要用到AXMLPrinter2.jar 工具
具体的则是打开命令行 我们以AndroidManifest.xml为例,输入如下命令:
java -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest.txt
有兴趣的也可以写成一个.bat的脚本,方便执行。
执行前的AndroidManifest.xml文件:
执行反编译之后:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="322" android:versionName="ver 3.2.2" package="com.eoeandroid.wallpapers.christmas" > <application android:label="@7F040000" android:icon="@7F020004" > <activity android:label="@7F040001" android:name=".Main" > <intent-filter > <action android:name="android.intent.action.MAIN" > </action> <category android:name="android.intent.category.LAUNCHER" > </category> </intent-filter> </activity> <service android:name=".service.SyncDeviceInfosService" > </service> <meta-data android:name="com.mobclix.APPLICATION_ID" android:value="30c0e2bb-a878-43cb-830b-a39fcae33b0c" > </meta-data> </application> <uses-sdk android:minSdkVersion="3" > </uses-sdk> <uses-permission android:name="android.permission.INTERNET" > </uses-permission> <uses-permission android:name="android.permission.SET_WALLPAPER" > </uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> </manifest>
基本能还原的跟源程序大致相同。
2、classes.dex的逆向
关于classes.dex的逆向,需要掌握两种方法。
第一种是将classes.dex反编译成smali格式的文件,然后查看smali基本可以看出程序是如何执行的。
第二种是将classes.dex用dex2jar反编译成.jar格式的文件,再使用jd-gui来查看jar包里面java源代码。
首先介绍第一种方法。这种方法的工具非常多,网上一搜就能搜到。我使用的是一个名叫DiPiPiApk的逆向工具。程序的界面如图所示:
输入dex文件路径或者app路径,再选择smali输出路径,就可以反编译出smali程序代码。
这个程序因为有界面所以比较好用,但是这个程序的作者没有再更新版本了,所以刚开始入门用这个玩玩还行,真要继续做的话,还得换工具。
可以用baksmali.jar这个工具,国外一个对Android研究的很深入的大牛做的。
执行代码
java -jar baksmali.jar -o classout/ classes.dex
将classes.dex能逆向成一个文件夹。
点开其中一个文件 我们继续来看:
这个代码和java源程序已经很像了,关于如何读懂smali程序,就需要更进一步的研究和学习了。
我们上一步已经将classes.dex反编译成了.smali文件,在偿试把它编译成classes.dex吧:
这里会用到smali.jar工具。
输入如下命令:
java -jar smali.jar classout/ -o classes.dex.
我们可以将新生成的classes.dex塞入ApkInstaller.apk里覆盖原来的classes.dex文件,这样我们的apk还是一样能用的。
但是某些apk程序在修改后会出现明明安装了但是无法使用,显示程序未安装。这是因为程序修改了,但是签名没有修改的缘故,使用AndroidResEdit可以为软件重新签名。这里就不再细说了,可以上网查找相关教程。
下面介绍第二种方法。
首先要下载两个工具:dex2jar和JD-GUI。
前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。
首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的;
解压下载的dex2jar,将classes.dex复制到dex2jar.bat所在目录。在命令行下定位到dex2jar.bat所在目录
运行:
dex2jar.bat classes.dex
生成:
classes.dex.dex2jar.jar
生成jar文件的截图如下:
运行JD-GUI(jd-gui.exe),打开上面生成的jar包,即可看到源代码了。