浅谈反编译在项目中的使用

  • 什么是反编译
  • 反编译的作用
  • 反编译工具
  • 动态编程 JavaSsist
  • 源码安全

什么是反编译

将可读性较好的高级计算机语言(JAVA,C#,C)转换成计算机能解读、运行的低阶机器语言,这个过程其实就是编译。而反编译的过程与编译刚好相反,就是将已编译好的编程语言还原到未编译的状态,也就是找出程序语言的源代码。Java语言中的反编译一般指将class文件转换成java文件。



比如Java语言作为一种高级语言,想要被执行,就需要通过编译的手段将其转换为机器语言。Java语言的源文件是一个java文件,要将一个java文件,转换为二进制文件一共要经过两个步骤。
首先经过前端编译器,将java文件编译成中间代码,这种中间代码就是class文件,即字节码文件。然后,在经过后端编译器,将class字节码文件,编译成机器语言。Java的前端编译器比如javac, Eclipse JDT 中的增量式编译器 ECJ 等。而Java的后端编译器主要是各大虚拟机实现的,如JVM虚拟机。


反之,我们也可以通过低级语言进行反向工程,反编译获取其源代码。虽然很难将机器语言反编译成源代码,但是我们还是可以把中间代码进行反编译的,将javac编译得到的字节码class文件进行反编译得到源代码java文件。

反编译的作用

首先,反编译对于学习Java来说是一个很好的手段,我们可以对程序运行时有一个更清晰的认识。
另外Java作为一种编程语言,提供了很多语法糖,如泛型、自动装箱与拆箱等,而这些语法糖Java虚拟机是不认识的,所以在javac编译的时候,就会进行解糖,而得到的class文件中就是解糖后的代码,这时候我们把这种解糖后的class文件进行反编译,就可以得到一份java文件,从这份java文件中,我们就可以学习到这些语法糖到底是如何实现的。
其次,有了反编译的工具,我们就可以把别人的代码进行反编译,然后学习别人的代码是怎么实现的。或者可以通过源代码查找bug,甚至窃取信息等。

反编译工具

本文主要介绍3个Java的反编译工具:JD-GUI、luyten以及Android反编译工具jadx

JD-GUI
JD-GUI是一个具备用户图形界面的反编译器,它可以显示“.class”字节码文件的Java源代码。您可以使用JD-GUI浏览重建的源代码,以便立即访问方法和字段。
http://java-decompiler.github.io/

luyten
比较精准的一个Java 反编译工具,同样使用GUI图形用户界面
https://github.com/deathmarine/Luyten/releases/tag/v0.5.3

jadx
用于从 Android Dex 和 Apk 文件生成 Java 源代码的命令行和 GUI 工具
将 Dalvik 字节码从 APK、dex、aar、aab 和 zip 文件反编译为 java 类
https://github.com/skylot/jadx


这里我们来看一下同样的App登录页面这一块的代码,我们找到update这个方法,我们通过反编译得到android 的smali 汇编文件,我们可以看到getString 这个方法,是去获取某个字符串,那么这个字符串的索引就是我们这里框起来的部分,那么我们检索下工程看看这个索引指向了哪里。可以看到它指向了命名为name的字符串,那么我们也就知道它的内容是Welcome。从这个过程,我们也就知道了android 程序对于一个已存在字符串表中的字符串,是怎样找到它并显示这一系列的过程了。

动态编程 JavaSsist

当我们通过class文件看到了源码,又反编译不出源码但我们还是想修改源代码的情况下,这时候我们可以使用动态编程框架JavaSsist来帮我们在加载该class文件时动态修改代码。
https://github.com/jboss-javassist/javassist



上面介绍的是修改现有的类方法,我们也可以使用javassist动态生成类,或者在一个已经编译好的类中添加新的方法,修改或增加变量,删除变量或方法,这些操作都不需要对字节码方面有深入的了解。

源码安全

● 隔离Java程序,运行在云端上,让用户接触不到你的Class文件
○ 对Class文件进行加密,例如android apk包的加壳
● 代码混淆,提到破解难度,将代码转换成功能上等价,但是难于阅读和理解的形式

下面我们来讲一下代码混淆,混淆就是打乱我们class文件中的信息,使反向工程变得非常困难,即使反编译成功了,但是代码可读性也是很差的。
常见的混淆方法有

  • Name obfuscation.(类名/变量名/方法名混淆)- ProGuard
  • Code flow obfuscation.(代码流混淆)
  • String encryption (字符串混淆)
  • Intermediate code optimization.(中间层代码优化)
  • Debug information obfuscation.(调试信息混淆)
  • Watermarking. (数字水印)
  • Source code obfuscation.(源代码混淆)

下面我们介绍一下ProGuard和Allator这两种混淆工具

命名混淆

命名混淆工具,比较经典的我们可以看下ProGuard 这个框架,这个是我在android开发中经常使用到的混淆工具,同样他也可以对java代码进行混淆。他可以对我们的类名/变量名/方法名进行混淆,使得混淆后的文件可读性变差,增加了反编译的难度。



需要注意的是如果你开发的是一个类库,或者某些类需要动态装载,或者入口类,那些这些公共API就必须不能被混淆,这样别人才能使用你的类库。

字符串混淆

当我们反编译了一个程序时,那我们首先需要找到切入点,而在字符串文字就提供了一个很好的切入角度,这通常可以做为探索整个应用程序的起点。这些文字可能是:
1.对话框中的提示或交互文本
2.错误消息
3.异常消息的文本
对代码中字符串的检索将在反编译器中显示出它的确切使用位置,这意味着它将使反编译者更容易理解我们程序的运作。
Allatori的字符串加密技术对存储在类文件常量池中的字符串文字进行加密。在这种情况下,程序反编译后的字符串搜索将会很难被检索出来。Allatori将代码片段添加到您的类中,以便您的字符串在运行时被解密,这意味着从外部看,一切将照常进行。

流混淆

Allator还可以执行流混淆,一些JAVA代码结构,如for循环、if-else条件和switch,Allator对字节码进行了微小的更改,使控制流变得模糊,而无需更改代码在运行时的功能,使得在反编译后找不到与Java等效的命令。流混淆的字节码通常会迫使反编译器在其产生的源代码中插入一系列标签和非法的“ goto”语句,使得反编译后的源代码产生错误。


Class文件进行加密

比如: 用很复杂的算法加密 class文件,然后在虚拟机载入前调用解密程序。考虑使用jvmti,这样可以防止class loader被反编译导致加解密算法泄漏.

浅谈反编译在项目中的使用相关推荐

  1. 浅谈ARCGIS在测绘项目中的一般应用

    浅谈ARCGIS在测绘项目中的 一般应用 一.概述 众所周知,ARCGIS是由Esri公司生产的一款的GIS平台.问世至今,已升级数代,现在比较常用的是ARCGIS10.2的版本.由于其强大及全面的地 ...

  2. 浅谈 OneAPM 在 express 项目中的实践

    [编者按]OneAPM 运营团队,近日在 github 上发现了一篇文章,特别奉献给大家.本文作者王宇先生从2015年年初就开始使用我们的产品,也是OneAPM 的忠实用户. OneAPM 是一个优秀 ...

  3. build 之前执行task_浅谈VS编译自定义编译任务—MSBuild Task(csproject)-阿里云开发者社区...

    在上一篇浅谈.NET编译时注入(C#-->IL)中我们简单的反编译查看了几种c#语法糖和PostSharp在编译成IL时为我做的MSIL注入.紧接着在这节,要来看的就是MSBuild Task. ...

  4. 自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用...

    自己动手写一个推荐系统 废话: 最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来. 在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并 ...

  5. 浅谈如何编译COIN-OR的开源代码

    转载自http://hi.baidu.com/kaien_space/blog/item/420918134592880a5aaf53c9.html 浅谈如何编译COIN-OR的开源代码 2009-0 ...

  6. python竞赛_浅谈Python在信息学竞赛中的运用及Python的基本用法

    浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...

  7. 反编译Silverlight项目

    在文章的开头,我想事先说明,本文并非诱导读者恶意反编译他人作品,盗取他人代码成果,只是为了学习Silverlight讨论而用. 在互联网上,每天都会有很多Silverlight项目发布,有的是开源,有 ...

  8. 化学实验中计算机技术的应用,浅谈计算机在基础化学实验中的应用

    <浅谈计算机在基础化学实验中的应用.doc>由会员分享,可免费在线阅读全文,更多与<浅谈计算机在基础化学实验中的应用>相关文档资源请在帮帮文库(www.woc88.com)数亿 ...

  9. android 存储空间监控,浅谈 Android 内存监控(中)

    前言 在上篇 浅谈 Android 内存监控(上) 中,我们聊了 LeakCanary,微信的 Matirx 和美团的 Probe,它们各自有不同的应用场景,例如,在开发测试环境,我们会偏向用 Lea ...

最新文章

  1. .NET手记-JS获取Url参数
  2. 浅述WinForm多线程编程与Control.Invoke的应用
  3. .NET 中的 Worker Service 入门介绍
  4. BOM+DOM+JavaScript读取与操作网页对象
  5. 枚举与Lambda表达式
  6. matlab 输入矩形序列,从python调用Matlab函数:“初始值设定项必须是矩形嵌套序列”...
  7. 判断数组、集合list、string、int、double等是否为空,判断是否为值类型
  8. 《我的成功可以复制》读后感这一、两天可以静下心来,将唐骏先生写的《我...
  9. RS232 RS422 RS485 DB9公座脚定义
  10. R语言入门:R、R Studio的安装配置【多图详解、保姆级教程】
  11. 计算机组装小游戏,电脑组装店游戏
  12. 2020-10-18 硬件电路设计之三极管放大电路【B站】
  13. win10刚安装linux黑屏,win10 + Ubuntu18.04 双系统,UEFI+GPT,从win10切换到Ubuntu时黑屏问题...
  14. PS经典教程:从零开始设计一个漂亮的网页
  15. Spring事务管理-tx:advice标签
  16. python数据类型的性能
  17. 记录微信小程序获取手机号报40029错误问题
  18. RVM切换ruby版本
  19. 日服人物一览(按实装版本倒序)
  20. Android Adapter嵌套Adapter(文档类app,说明书类app)

热门文章

  1. 晚上睡之前练习打字,打打吕鑫大师教我的
  2. 运营商劫持是什么意思,如何解决运营商劫持的问题?
  3. cyq.data mysql_终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了
  4. 安装 MySql5.7 详细教程,操作简单(Windows版本)
  5. 庄子 内篇 养生主第三
  6. 华为鸿蒙邀请函,华为鸿蒙系统6月下旬发布?邀请函首次曝光,但未获官方确认...
  7. 如何用定积分求椭圆的周长_可怕的椭圆:没有周长?怎样算?
  8. 300大作战服务器维修,300大作战官方服
  9. 华为MDC300F的操作记录
  10. linux 魅族,传魅族17全系90Hz刷新率