反编译简单介绍

反编译简单介绍
计算机语言(Computer Language)指用于人与计算机之间通讯的语言。计算机语言是人与计算机之间传递信息的媒介。
计算机语言包括机器语言、汇编语言和高级语言三种。
1 编译与反编译介绍
机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。机器语言具有灵活、直接执行和速度快等特点。但是不同型号的计算机其机器语言是不相通的,按着一种计算机的机器指令编制的程序,不能在另一种计算机上执行。
机器语言是使用二进制表示的,所以编出的程序全是些0和1的指令代码。
在这里插入图片描述

编译由词知意,是编程代码译成计算机可以识别的东西,这样程序就能在相应机器上跑起来了。
1.1 浅聊Java语言编译
Java语言作为一种高级语言,想要被执行,就需要通过编译的手段将其转换为机器语言。Java语言的源文件是一个java文件,要将一个java文件,转换为二进制文件一共要经过两个步骤。
在这里插入图片描述

首先经过前端编译器,将java文件编译成中间代码,这种中间代码就是class文件,即字节码文件。
然后,在经过后端编译器,将class字节码文件,编译成机器语言。
Java的前端编译器主要是javac, Eclipse JDT 中的增量式编译器 ECJ 等。
Java的后端编译器主要是各大虚拟机实现的,如HotSpot中的JIT编译器。
1.2 反编译
Java作为一种编程语言,提供了很多语法糖,如泛型、自动装箱与拆箱等,而这些语法糖Java虚拟机是不认识的,所以在javac编译的时候,就会进行解糖,而得到的class文件中就是解糖后的代码,这时候我们把这种解糖后的class文件进行反编译,就可以得到一份java文件,从这份java文件中,我们就可以学习到这些语法糖到底是如何实现的。
有了反编译的工具的话,我们就可以把别人的代码进行反编译,然后学习别人的代码是怎么实现的。或者可以通过源代码查找bug,制作外挂等。
因为java有Java虚拟机,所以可以实现跨平台执行,因此java一次编译,到处运行,这个一次编译的产物就是.class文件,凭借优秀的java虚拟机,可以到处去运行。这里只需要把.class文件反编译到.java文件,我们就可以读懂源文件了。
反编译的工具
Java中有很多反编译工具,这里简单介绍几种,javap,jad,CFR,JD-GUI。
2 如何防止反编译
由于我们有工具可以对Class文件进行反编译,所以,对开发人员来说,如何保护Java程序就变成了一个非常重要的挑战。
但是,魔高一尺、道高一丈。当然有对应的技术可以应对反编译。
但是,这里还是要说明一点,和网络安全的防护一样,无论做出多少努力,其实都只是提高攻击者的成本而已。无法彻底防治。
典型的应对策略有以下几种:

  • 隔离Java程序,让用户接触不到你的Class文件
  • 对Class文件进行加密,提到破解难度
  • 代码混淆,将代码转换成功能上等价,但是难于阅读和理解的形式
    如阿里巴巴开源的分布式事务中间件的jar包就通过混淆技术进行了加密,反编译后内容如下:
    在这里插入图片描述

3 反编译应用,apk反编译
作为开发人员我们都知道,Android程序打完包之后得到的是一个APK文件,这个文件是可以直接安装到任何Android手机上的,我们反编译其实也就是对这个APK文件进行反编译。Android的反编译主要又分为两个部分,一个是对代码的反编译,一个是对资源的反编译,我们马上来逐个学习一下。
我们自己准备一个APK文件,自己写一个Demo用来测试。
我们建立一个新项目,在Activity里加入一个按钮,当点击按钮时弹出一个Toast,就这么简单,效果如下所示:
在这里插入图片描述

自己写一个app应用Demo,如上,用AndroidStudio生成一个apk文件 如生成一个apk文件链接
以下是AndroidStudio默认导出的apk文件,app-debug.apk
在这里插入图片描述

3.1 接下来完成对apk文件java文件的反编译
先介绍apk的Java编译后文件反编译,java编译后文件反编译分两步走,如下步骤完成反编译,

  1. dex2jar 这个工具用于将dex文件转换成jar文件
  2. jd-gui 这个工具用于将jar文件转换成java代码(读取.class文件的工具)
    上述工具下载路径 下载路径链接
    下载完成后,解压工具。
    在这里插入图片描述

dex2jar解压后如下:
在这里插入图片描述

其中我们要用到的是d2j-dex2jar.bat这个文件,当然如果你是linux或mac系统的话就要用d2j-dex2jar.sh这个文件。
然后我们将app-debug.apk文件也进行解压。解压之后你会发现里面有一个classes.dex文件,如下图所示:
在这里插入图片描述

这个classes.dex文件就是存放所有java代码的地方了,我们将它拷贝到dex2jar解压后的目录下,并在cmd中也进入到同样的目录(如果classes.dex这里没有源码可以试试classes2.dex,classes3.dex里面,步骤如此),然后执行:

d2j-dex2jar classes.dex

执行结果如下图所示:
在这里插入图片描述

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

可以看到,classes-dex2jar.jar,这个就是反编译出来的java源文件,接下来我们要用jd-gui这个工具来将jar文件转换成java代码。来打开jia包查看java源文件。
在这里插入图片描述

好的,由此可见,我们的代码反编译工作已经成功了,MainActivity中的代码非常清晰,基本已经做到了90%以上的还原工作。接下来完成对apk重要文件AndroidManifest.xml等资源文件的反编译。
3.2 完成apk重要文件AndroidManifest.xml的反编译
apk文件解压后已经存在AndroidManifest.xml文件,不过打开后是如下这种情况
在这里插入图片描述

接下来对AndroidManifest.xm文件进行反编译,用到的工具是apktool

  • apktool 这个工具用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。
    解压后的apktool
    在这里插入图片描述

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

如下,则运行成功
在这里插入图片描述

这就说明反编译资源已经成功了。
现在你会发现在当前目录下多了一个Demo文件夹,这个文件夹中存放的就是反编译的结果了。我们可以打开AndroidManifest.xml、activity_main.xml的原始文件了
4 apk重新打包
对于反编译出来的文件,我们可以重新打包嘛,答案是肯定的,当然可以,用很多方式都可以再生成apk文件。
其中有的人会说汉化,没错,汉化的方式确实就是将一个APK进行反编译,然后翻译其中的资源再重新打包,但是不管怎么说这仍然是将别人的程序进行破解,这并不是什么光荣的事情。那么我们就不去讨论本身这件事情的对或错,这里只是站在技术的角度来学习一下重新打包的相关知识。
首先我们来看一下通过apktool反编译后的包目录情况,如下图所示:
在这里插入图片描述

其中original文件夹下存放的是未经反编译过、原始的AndroidManifest.xml文件,res文件夹下存放的是反编译出来的所有资源,smali文件夹下存放的是反编译出来的所有代码,AndroidManifest.xml则是经过反编译还原后的manifest文件。这里值得一提的是smali文件夹,如果你进入到这个文件夹中你会发现它的目录结构和我们源码中src的目录结构是几乎一样的,主要的区别就是所有的java文件都变成了smali文件。smali文件其实也是真正的源代码,只不过它的语法和java完全不同,它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言,语法结构大概如下所示:
在这里插入图片描述

我们可以对反编译生成的Demo进行一点改动,然后进行重新生成.apk文件
改动之后,现在来把反编译后的Demo文件夹重新打包成APK吧,其实非常简单,只需要在cmd中执行如下命令:
apktool b Demo -o New_Demo.apk

其中b是build的意思,表示我们要将Demo文件夹打包成APK文件,-o用于指定新生成的APK文件名,这里新的文件叫作New_Demo.apk。执行结果如下图所示:
在这里插入图片描述

现在你会发现在同级目录下面生成了一个新的APK文件
目前这个New_Demo.apk还是不能安装的,因为没有进行签名。如果是别人的apk我们是没办法拿到他的签名的。所以我们只能进行重新签名。这同时也表明我们重新打包出来的软件就是个十足的盗版软件。这里大家学学技术就好了,希望不要有任何人去做什么坏事情。
使用Android Studio或者Eclipse都可以非常简单地生成一个签名文件。
有了签名文件之后在cmd中执行签名命令就可以进行签名了,命令格式如下:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名

其中jarsigner命令文件是存放在jdk的bin目录下的,需要将bin目录配置在系统的环境变量当中才可以在任何位置执行此命令。
签名之后的APK文件现在已经可以安装到手机上了,不过在此之前Android还极度建议我们对签名后的APK文件进行一次对齐操作,因为这样可以使得我们的程序在Android系统中运行得更快。对齐操作使用的是zipalign工具,该工具存放于/build-tools/目录下,将这个目录配置到系统环境变量当中就可以在任何位置执行此命令了。命令格式如下:
zipalign 4 New_Demo.apk New_Demo_aligned.apk

其中4是固定值不能改变,后面指定待对齐的APK文件名和对齐后的APK文件名。运行这段命令之后就会生成一个New_Demo_aligned.apk文件
至此,把apk反编译代码、反编译资源、重新打包、如何防止反编译,这几大大主题的内容都已经介绍完了。也已经熟悉了一个apk反编译的流程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北境王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值