首先要声明的是,反编译别人的程序,并不是值得炫耀的技能。但是自己依然去学习、分享,就是为了通过理解反编译的原理,来更好的避免自己的程序被别人攻击,避免自己公司的核心技术被窃取。好了,多的不说了,现在开始直奔主题,讲一下自己通过在网上以及资料上学习到的一些反编译的知识。ps:新手第一次写博客,如有不妥当的地方,望各位指出并理解。
我们都知道,android程序打包之后会生成APK文件,这个文件是可以安装到任何安卓手机上的,我们反编译,其实就是对这个文件进行反编译。安卓的反编译主要分为两部分,一个是反编译代码,一个是反编译文件。
首先来学习反编译代码,在进行反编译之前,我们最好自己先写一个Demo来测试(当然了,也可以用别的公司的APP进行反编译),我自己之前建了一个项目,这里把Activity里的代码和xml里面的代码粘贴上来。
这个是Activity里面的代码:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); }
这个是xml里面的代码:
xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.soufun.user.firstapp.MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> android.support.design.widget.AppBarLayout> <include layout="@layout/content_main" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_dialog_email" /> android.support.design.widget.CoordinatorLayout>
好了,一个简单的项目就建立完了,运行之后,就会以APK包的形式显示在安卓手机上。
好了,到这里,准备工作就已经完成了,接下来我们开始对这个APK包进行反编译吧。
反编译代码:
要想反编译代码,首先我们需要两个工具
dex2jar 这个工具用于将dex文件转换成jar文件 下载地址:http://sourceforge.net/projects/dex2jar/files/
jd-gui 这个工具用于将jar文件转换成java代码 下载地址:http://jd.benow.ca/
将这两个工具下载后并解压,然后我们开始对这个APK进行反编译代码,解压dex2jar后,你会发现有很多文件,如下图所示:
其中我们要用到的是d2j_dex2jar.bat这个文件,然后我们将APK包进行解压,如果不知道怎么解压,可以先将APK的格式改成zip,然后再解压就可以了。加压成功后你会发现里面有个classes.dex文件,如图所示:
这个classes.dex里面放的就是java代码。我们将他拷贝到dex2jar拷贝后的目录下,并在cmd中进入相同的目录。
然后输入如下命令: d2j-dexjar classes.dex 得到如下结果。没有出现错误,转换就结束了。
现在观察dex2jar目录下,多了一个jar文件,如下:
这个jar文件里面,存放的就是所有java的源码,接下来,我们借助jd-jui工具,来转化这个jar文件变成java代码。如下
这样,我们就看到了APK的源码,也就是反编译代码成功了。好了,到了这里,反编译代码掌握的应该差不多了,下一篇,我将讲述自己学习的关于如何反编译资源的内容。