Android反编译笔记

反编译代码

要想将APK文件中的代码反编译出来,我们需要用到以下两款工具:

dex2jar 这个工具用于将dex文件转换成jar文件
下载地址:http://sourceforge.net/projects/dex2jar/files/
jd-gui 这个工具用于将jar文件转换成java代码
下载地址:http://jd.benow.ca/

解压dex2jar压缩包后,你会发现有很多个文件,如下图所示:



其中我们要用到的是d2j-dex2jar.bat这个文件,当然如果你是linux或mac系统的话就要用d2j-dex2jar.sh这个文件。
然后我们将Demo.apk文件也进行解压,如果不知道怎么直接解压的可以先将文件重命名成Demo.zip,然后用解压软件打开。解压之后你会发现里面有一个classes.dex文件,如下图所示:


这个classes.dex文件就是存放所有java代码的地方了,我们将它拷贝到dex2jar解压后的目录下,并在cmd中也进入到同样的目录,然后执行命令语句:

d2j-dex2jar classes.dex

执行结果如下图所示:


没有报任何错误,这就说明我们已经转换成功了。现在观察dex2jar目录,你会发现多了一个文件,如下图所示:


可以看到,classes-dex2jar.jar这个文件就是我们借助工具之后成功转换出来的jar文件了。但是对于我们而言,jar文件也不是可读的,因此这里还需要再借助jd-gui这个工具来将jar文件转换成java代码。

先看眼jd-gui文件目录


双击jjd-gui.exed-gui.exe运行jd-gui工具打开classes-dex2jar.jar这个文件,结果如下图所示:


OK,由此可见,我们的代码反编译工作已经成功了,MainActivity中的代码非常清晰,基本已经做到了90%以上的还原工作。但是如果想要做到100%的代码还原还是非常有难度的,因为像setContentView()方法传入的参数,其实就是一个资源的id值而已,那么这里反编译也就只能将相应的id值进行还原,而无法变成像R.layout.activity_main这样直观的代码展示。
另外,除了MainActivity之外,还有很多其它的代码也被反编译出来了,因为当前项目有引用support-v4和support-v7的包,这些引用的library也会作为代码的一部分被打包到classes.dex文件当中,因此反编译的时候这些代码也会一起被还原。
好的,学完了反编译代码,接下来我们看一下如何反编译资源。

反编译资源


要想将APK文件中的资源反编译出来,又要用apktool 工具,它的作用是最大幅度地还原APK文件中的9-patch图片、布局文件等一系列的资源:
下载地址:http://ibotpeaches.github.io/Apktool/install/

接下来的工作就很简单了,我们将test.apk拷贝到和这两个文件同样的目录当中,然后cmd也进入到这个目录下,并在cmd中执行如下命令:

apktool d test.apk

其中d是decode的意思,表示我们要对Demo.apk这个文件进行解码。那除了这个基本用法之外,我们还可以再加上一些附加参数来控制decode的更多行为:

-f 如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
-o 指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
-s 不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
-r 不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)。
常用用法就这么多了,那么上述命令的执行结果如下图所示:


这就说明反编译资源已经成功了。
现在你会发现在当前目录下多了一个test文件夹,这个文件夹中存放的就是反编译的结果了。进到目录打开资源文件,布局文件都不再是乱码了,这就成功了。

重新打包

首先声明将别人的程序进行破解,再打包不是怎么光荣的事情。这里只是站在技术的角度来学习一下重新打包的相关技术知识。
首先我们来看一下通过apktool反编译后的包目录情况,如下图所示:


其中,original文件夹下存放的是未反编译过、原始的AndroidManifest.xml文件,res文件夹下存放的是反编译出来的所有资源,smali文件夹下存放的是反编译出来的所有java代码,smali文件其实也是真正的源代码,只不过它的语法和java完全不同,AndroidManifest.xml则是经过反编译还原后的manifest文件。

我们现在来把反编译后的test文件夹重新打包成APK吧,其实非常简单,只需要在cmd中执行如下命令:

apktool b test-o New_test.apk

其中b是build的意思,表示我们要将Demo文件夹打包成APK文件,-o用于指定新生成的APK文件名,这里新的文件叫作New_test.apk。执行结束后你会发现在同级目录下面生成了一个新的名字叫New_test的APK文件。
到这一步这个New_test.apk还是不能安装,因为它还没有进行签名。那么如果这是别人的程序的话,我们从哪儿能拿到它原来的签名文件呢?很显然,这是根本没有办法拿到的,因此我们只能拿自己的签名文件来对这个APK文件重新进行签名,但同时也表明我们重新打包出来的软件就是个十足的盗版软件。这里大家学学技术就好了,希望不要有任何人去做什么坏事情。
用jdk命令生成一个签名文件。

1. 生成签名证书
使用JDK自带的keytool工具, 运行下面的命令
keytool -genkey -alias test -keyalg RSA -validity 20000 -keystore test.jks

/*解释:keytool工具是Java JDK自带的证书工具
-genkey参数表示:要生成一个证书(版权、身份识别的安全证书)
-alias参数表示:证书有别名,-alias test表示证书别名为:test
-keyalg RSA表示加密类型,RSA表示需要加密,以防止别人盗取
-validity 20000表示有效时间20000天
-keystore test.jks表示要生成的证书名称为test.jks
*/
输入完回车后屏幕显示:
输入keystore密码:[密码不回显]
再次输入新密码:[密码不回显]
您的名字与姓氏是什么?
Unknown]:wj
您的组织单位名称是什么?
Unknown]:wj
您的组织名称是什么?
Unknown]:wj
您所在的城市或区域名称是什么?)
Unknown]:bj
您所在的州或省份名称是什么?
Unknown]:bj
该单位的两字母国家代码是什么
Unknown]:CN
输入< ***.keystore>的主密码
(如果和keystore密码相同,按回车):

执行以上语句后在执行的目录下会生成证书文件 test.jks

有了签名文件之后在cmd中执行签名命令就可以进行签名了,把需要签名的apk文件复制到jdk的bin目录下,然后保证刚才生成的jks签名文件也在jdk的bin目录中,然后cmd切换到jdk的bin目录下(不过我发现我粗心的都放在了jdk的jre下的bin目录,命令切换也是jre目录也成功了),执行命令格式如下:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名

其中jarsigner命令文件是存放在jdk的bin目录下的,需要将bin目录配置在系统的环境变量当中才可以在任何位置执行此命令。
签名之后的APK文件现在已经可以安装到手机上了,再次提醒,不要干坏事,第一没有意义,第二如果做出破格违法的事后果需要自负,所以只可以学习技术,不可以做小聪明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值