现在的位置: 首页 > 综合 > 正文

【Android每周专题】Android中的逆向工程

2018年03月22日 ⁄ 综合 ⁄ 共 2534字 ⁄ 字号 评论关闭

本系列文章均为A2BGeek原创,转载务必在明显处注明:
转载自A2BGeek的【Android每周专题】系列,原文链接:http://blog.csdn.net/a2bgeek/article/details/15338911

我们对一个apk做逆向工程分为两个方面,一是java源代码,二是xml。apk其实是一个压缩包,你可以把后缀名apk改成zip,解压后你就能看到一个apk内部的全貌:

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

res:存放资源文件的目录,例如图片和布局文件,注意图片可以直接拿出来用的,不用反编译。

AndroidManifest.xml:和Eclipse工程里面的那个是一样的,只不过不能直接看,需要反编译。

classes.dex:Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式DEX(Dalvik Executable)。在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文件中获取相应的字节码;Android应用虽然也是使用Java语言进行编程,但是在编译成CLASS文件后,还会通过一个工具(dx)将应用所有的CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从其中读取指令和数据。

resources.arsc:编译后的二进制资源文件。

只是看一看

首先来讲一下Android中第一种反编译方法,这种方法可以让你直观地阅读别人的源代码,虽然反编译出来的源代码和真正的源代码有一些不同,但不太影响阅读的。下面开讲:

1、工具下载

dex2jar :这个工具可以把.dex文件反编译成为.jar文件。

Java Decompiler :这个工具用来查看.jar文件。

AXMLPrinter :用来反编译xml文件。

2、开始反编译

首先需要把apk包解压缩,然后开始反编译。

step1:反编译xml文件

这一步需要使用刚才下载的AXMLPrinter2.jar,使用方法如下:

java -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest_decode.xml

反编译后AndroidManifest_decode.xml如下:

step2:反编译dex文件

这里首先需要使用的是dex2jar,使用方法如下:

sh dex2jar.sh classes.dex

执行完毕之后会得到一个文件classes_dex2jar.jar

接下来我们就可以使用Java Decompiler直接打开classes_dex2jar.jar:

OK,第一种反编译的方法就讲到这里,如果你只是抱着学习的心态,那么第一种就足够了,你可以看到别人的功能是怎么实现的。

索马里海盗

使用第一种方法我们虽然可以直观地查看源代码,但是做不到修改真正执行的代码,因为我们看到的是使用dex2jar转换来的代码。但是,使用smali,我们可以做到直接修改真正执行的代码,做一些好玩的事情,电子市场上一些流氓软件也是用这种方法添加恶意代码的,请读者不要学了之后搞破坏哦。

先来说一下smali是什么?看图:

这是一个smali文件,对应的java源代码是:

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
}

其实对照着看就能看出一些语法的规律,比如函数的结尾用.end method,p、v这样的都叫寄存器,我个人觉得没有必要学习太多smali语法,你可以把要添加的功能用java写好,反编译出来就能看到对应的smali写法,再加进去就可以了,不过这里还是附上smali语法介绍的链接http://blog.csdn.net/wdaming1986/article/details/8299996

下面来介绍使用smali反编译的步骤:

1、工具下载:

smali&&baksmali :用来反编译和回编译classes.dex。

apktool :封装了smail和baksmali,而且同时也能处理xml。推荐这种方法。

2、开始反编译:

使用smali和baksmali

首先需要把apk解压缩,得到classes.dex:

将classes.dex反编译:

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

将classesout目录回编译:

java -jar smali.jar classesout/ -o classes.dex

使用apktool

将整个apk反编译

 apktool d DeCompileDemo.apk DeCompileDemo/

DeCompileDemo目录如下:

将DeCompileDemo目录回编译:

 apktool b DeCompileDemo

会发现在DeCompileDemo/dist/下有一个apk。

OK,这个专题就到这里,下个专题准备写如何汉化apk以及如何利用masterkey漏洞,是对反编译的运用,敬请期待。

参考资料:

http://www.cnblogs.com/panchunting/archive/2011/10/25/android_apk.html

抱歉!评论已关闭.