首页 > 代码库 > android逆向入门及工具下载

android逆向入门及工具下载

本文所用到的工具下载:

链接:http://pan.baidu.com/s/1i3uw4NN 密码:8hz5

最近在研究如何逆向android的app,于是就有了这篇android逆向入门的总结回馈互联网。

由于Android的.apk文件实际上就是一个zip文件,修改文件后缀后直接可以打开,效果如下图所示:

image

里面包含了的文件有:

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文件:

image

执行反编译之后:

<?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="http://www.mamicode.com/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的逆向工具。程序的界面如图所示:

image

输入dex文件路径或者app路径,再选择smali输出路径,就可以反编译出smali程序代码。

这个程序因为有界面所以比较好用,但是这个程序的作者没有再更新版本了,所以刚开始入门用这个玩玩还行,真要继续做的话,还得换工具。

可以用baksmali.jar这个工具,国外一个对Android研究的很深入的大牛做的。

执行代码

java -jar baksmali.jar -o classout/ classes.dex

将classes.dex能逆向成一个文件夹。

image

点开其中一个文件 我们继续来看:

image

这个代码和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包,即可看到源代码了。

android逆向入门及工具下载