科普:什么是编译与反编译

【编译原理】-- 第一章(翻译程序、编译程序、汇编程序、解释程序、编译过程概述) 系统学习编译原理,第一章:什么是编译程序、翻译程序、汇编程序、解释程序?编译过程的概述 阅读详情
AI摘要

本文介绍了计算机语言,包括机器语言、汇编语言和高级语言的特点。重点阐述了Java语言的编译过程,即把高级语言转换为低级语言,以及反编译,将中间代码转换为源代码。还介绍了几种Java反编译工具,并提及应对反编译的策略,如隔离、加密和代码混淆。

本文公众号来源:漫话编程 作者:漫话编程

编译和反编辑是什么意思?小白应该得知道!

某天下班后,我在家里进行电话面试,问到面试者这样一个问题:"你知道使用哪些办法可以反编译Java代码吗?"。但是面试者回答的并不好,所以我在面试评价中写到:"对编译原理相关知识理解的不透彻"。这时,女朋友看到这句话。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

计算机语言 

计算机语言(Computer Language)指用于人与计算机之间通讯的语言。计算机语言是人与计算机之间传递信息的媒介。

计算机系统最大特征是指令通过一种语言传达给机器。为了使电子计算机进行各种工作,就需要有一套用以编写计算机程序的数字、字符和语法规划,由这些字符和语法规则组成计算机各种指令(或各种语句)。这些就是计算机能接受的语言。

计算机语言包括机器语言、汇编语言和高级语言三种。

机器语言

机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。机器语言具有灵活、直接执行和速度快等特点。但是不同型号的计算机其机器语言是不相通的,按着一种计算机的机器指令编制的程序,不能在另一种计算机上执行。

因为机器语言是使用二进制表示的,所以编出的程序全是些0和1的指令代码。

640?wx_fmt=png

机器语言的优点就是可以直接被计算机识别和执行,比较高效,但是同时也有很多缺点,如:

  • 1、机器只认识0和1,程序员很难记住每个指令转成0和1的组合是什么,需要查大量的表格来确定每个数字表示什么意思

  • 2、因为它的书面形式全是"密"码,所以可读性差,不便于交流与合作。

  • 3、因为它严重地依赖于具体的计算机,所以可移植性差,重用性差。

由于机器语言有这么多的弊端,于是有了汇编语言。

汇编语言

汇编语言使用助记符(Mnemonics)来代替和表示特定低级机器语言的操作。

助记符(mnemonic)是便于人们记忆、并能描述指令功能和指令操作数的符号,助记符是表明指令功能的英语单词或其缩写。如用ADD表示加法、MOV表示传送、SUB表示减法等。

640?wx_fmt=jpeg

但是,汇编语言只是让使用者,即程序员们更加容易记住和使用,计算机并不认识汇编语言,所以,想要让计算机执行汇编代码,需要先将汇编程序将它们转换成可执行的机器语言代码。这一过程被称为汇编过程。

由于汇编更接近机器语言,能够直接对硬件进行操作,生成的程序与其他的语言相比具有更高的运行速度,占用更小的内存,因此在一些对于时效性要求很高的程序、许多大型程序的核心模块以及工业控制方面大量应用。

机器语言和汇编语言,二者是几乎很少或者完全没有做任何语法抽象的,这种语言我们通常称之为低级语言,这种更加接近硬件,而且是不可以在不同硬件间移植的。

但是随着现代软件系统越来越庞大复杂,大量经过了封装的高级语言如C/C++,Pascal/Object Pascal也应运而生。这些新的语言使得程序员在开发过程中能够更简单,更有效率,使软件开发人员得以应付快速的软件开发的要求。

高级语言

高级语言是高度封装了的编程语言,与低级语言相对。

它是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示(例如汉字、不规则英文或其他外语),从而使程序编写员编写更容易,亦有较高的可读性,以方便对电脑认知较浅的人亦可以大概明白其内容。

如流行的java,c,c++,C#,pascal,python,lisp,prolog,FoxPro,易语言,中文版的C语言习语言等等,这些语言的语法、命令格式都不相同。

同汇编语言一样,高级语言离机器语言更加远了,计算机无法直接诶识别高级语言。所以,想要让计算机执行高级语言,就需要将其转化为机器语言。

640?wx_fmt=jpeg
 程序设计语言从机器语言到高级语言的抽象,带来的主要好处主要有以下几个方面:
  • 1、高级语言接近算法语言,易学、易掌握,一般工程技术人员只要几周时间的培训就可以胜任程序员的工作;

  • 2、高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;

  • 3、高级语言远离机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好,重用率高;

  • 4、由于把繁杂琐碎的事务交给了编译程序去做,所以自动化程度高,开发周期短,且程序员得到解脱,可以集中时间和精力去从事对于他们来说更为重要的创造性劳动,以提高程序的质量。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

编译 

上面提到语言有两种,一种低级语言,一种高级语言。可以这样简单的理解:低级语言是计算机认识的语言、高级语言是程序员认识的语言。

那么,怎么把程序员写出来的高级语言转换成计算机认识的低级语言然后让计算机执行呢?

这个过程其实就是编译!

640?wx_fmt=jpeg

编译的主要的目的是将便于人编写、阅读、维护的高级语言所写作的源代码程序,翻译为计算机能解读、运行的低级语言的程序,也就是可执行文件。

Java语言的编译

Java语言作为一种高级语言,想要被执行,就需要通过编译的手段将其转换为机器语言。

Java语言的源文件是一个java文件,要将一个java文件,转换为二进制文件一共要经过两个步骤。

640?wx_fmt=jpeg
 首先经过前端编译器,将java文件编译成中间代码,这种中间代码就是class文件,即字节码文件。

然后,在经过后端编译器,将class字节码文件,编译成机器语言。

Java的前端编译器主要是javac, Eclipse JDT 中的增量式编译器 ECJ 等。

Java的后端编译器主要是各大虚拟机实现的,如HotSpot中的JIT编译器。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

反编译

前面讲过,我们可以通过编译器,把高级语言的源代码编译成低级语言,那么反之,我们亦可以通过低级语言进行反向工程,获取其源代码。这个过程,就叫做反编译。

我们虽然很难将机器语言反编译成源代码,但是,我们还是可以把中间代码进行反编译的。就像我们虽然不能把经过虚拟机编译后的机器语言进行反编译,但是我们把javac编译得到的class进行反编译还是可行的。

所以,我们说Java的反编译,一般是将class文件转换成java文件。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

反编译的作用

首先,反编译对于学习Java来说是一个很好的手段。

因为Java作为一种编程语言,提供了很多语法糖,如泛型、自动装箱与拆箱等,而这些语法糖Java虚拟机是不认识的,所以在javac编译的时候,就会进行解糖,而得到的class文件中就是解糖后的代码,这时候我们把这种解糖后的class文件进行反编译,就可以得到一份java文件,从这份java文件中,我们就可以学习到这些语法糖到底是如何实现的。

其次,有了反编译的工具,我们就可以把别人的代码进行反编译,然后学习别人的代码是怎么实现的。或者可以通过源代码查找bug,制作外挂等。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

反编译的工具

Java中有很多反编译工具,这里简单介绍几种

javap

javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。javap生成的文件并不是java文件,而是程序员可以看得懂的class字节码文件。

jad

jad是一个比较不错的反编译工具,只要下载一个执行工具,就可以实现对class文件的反编译了。

jad是可以把class文件反编译成java文件的。

但是,jad已经很久不更新了,在对Java7生成的字节码进行反编译时,偶尔会出现不支持的问题,在对Java 8的lambda表达式反编译时就彻底失败。

地址:http://www.javadecompilers.com/jad

CFR

jad很好用,但是很久没更新了,所以只能用一款新的工具替代他,CFR是一个不错的选择,相比jad来说,他的语法可能会稍微复杂一些,但是好在他可以work。

地址:http://www.benf.org/other/cfr/index.html

JD-GUI

JD-GUI是一个独立的图形实用程序,显示“.class”文件的Java源代码。您可以使用JD-GUI浏览重建的源代码,以便立即访问方法和字段。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

如何防止反编译

由于我们有工具可以对Class文件进行反编译,所以,对开发人员来说,如何保护Java程序就变成了一个非常重要的挑战。

但是,魔高一尺、道高一丈。当然有对应的技术可以应对反编译。

但是,这里还是要说明一点,和网络安全的防护一样,无论做出多少努力,其实都只是提高攻击者的成本而已。无法彻底防治。

典型的应对策略有以下几种:

  • 隔离Java程序,让用户接触不到你的Class文件

  • 对Class文件进行加密,提到破解难度

  • 代码混淆,将代码转换成功能上等价,但是难于阅读和理解的形式

如阿里巴巴开源的分布式事务中间件的jar包就通过混淆技术进行了加密,反编译后内容如下:

640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


推荐阅读:


640喜欢我可以给我设为星标哦640

640?wx_fmt=jpeg
dnSpy 6.1.3 + net472 逆向实战:从反编译到修改保存的完整指南 在 .NET 逆向工程中,反编译工具是分析程序集的基础。dnSpy 作为一款集反编译、编辑与调试于一体的工具,其核心原理是通过 Roslyn 将 IL 还原为 C# 并支持重新编译回写。掌握这一技术能显著提升代码审计与漏洞分析的效率,尤其适用于无源码场景下的逻辑修改与加密算法验证。dnSpy 6.1.3 配合 net472 运行时,在 Windows 上开箱即用,但需注意强名称签名、元数据顺序等陷阱。本文聚焦实际工程问题,涵盖环境部署、方法定位、C# 与 IL 编辑取舍、保存回写及调试验证,并总结改完即崩的 阅读详情

相关推荐

安卓恶意软件检测毕设实战:从APK反编译到SVM分类的完整工程链路

APK静态分析是安卓安全领域的基础技术,其核心在于通过反编译提取Dalvik字节码中的操作码序列与敏感API调用,将非结构化的应用文件转化为机器学习可处理的特征向量。该过程依赖特征工程与分类算法的协同:敏感API与权限特征提供可解释的基线,而OpCode N-gram则通过指令序列的统计模式捕捉混淆后的恶意行为,配合SVM等算法实现高效分类。这一技术路线在恶意软件检测、应用市场审核及安全教学场景中具有广泛价值。本文围绕一个包含698个正常样本与756个恶意样本的毕设项目,详解从批量反编译、特征提取到模型训练

weixin_42706667的博客 312

Java基础--------Java反编译

一. 反编译的概念 反编译,一般指反向编译。 计算机软件反向工程(Reverse engineering)也称为计算机软件还原工程,是指通过对他人软件的目标程序(比如可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构...

詹煜彪9527 2万+

FFDec 18.5.0反编译SWF实战:从资源提取到脚本修改的完整指南

在Flash技术早已停止维护的今天,大量存量SWF文件仍活跃于老游戏、课件和工业界面中,如何高效解析与编辑这些二进制资源成为许多开发者和汉化组绕不开的课题。反编译工具作为逆向工程的基础设施,能够将SWF中的ActionScript脚本、图像、声音等资源还原为可读形式,而FFDec正是其中功能最为全面的开源方案之一。它基于Java运行,支持跨平台使用,既能通过图形界面交互操作,也提供命令行模式用于批量处理。实际应用中,从提取美术资源到修改AS3逻辑,再到替换文本完成汉化,FFDec都能扮演关键角色。本文将围绕

weixin_29207149的博客 291

反编译系列教程

x00 简介 《编译原理》课程在大学本科阶段就难道了很多计算机专业的同学。而反编译技术更需要从事者具有深厚的编译技术基础,因此一直是很多业内人士希望能够深入了解和掌握的一门技术。 从现在开始,我们讨论反向编译的一些内容。顾名思义,反编译可以认为是编译的逆过程,这一点从编译和反编译(Compile and De-compile,英文中也有用De-compilation来表示反编译的)的中英文描述都可看出。但这看似只有一字之差的名称,在实际应用中并不是简单的“逆流而上”。因为在多数时候“创造”远比“恢复”来得简

代码是程序员的语言,博客是思想的桥梁,连接你我,共享智慧之光。 1万+

Fas2Lisp反编译.zip

Fas2Lisp.exe fas反编译程序,得到lsp源码 Vlx拆分fas.exe vlx文件可以用分离工具分离得到fas

delphi exe/dcu/bpl反编译

delphi exe/dcu/bpl反编译 exe/bpl 支持到xe5 dcu支持到xe2

python so 反编译

python相关学习资料:https://edu.51cto.com/video/4645.htmlhttps://edu.51cto.com/video/1158.htmlhttps://edu.51cto.com/video/4102.htmlPython SO反编译科普 在Python编程中,有时我们会遇到一些...

weixin_36928272的博客 460

奥比中光Dabai深度相机SDK在Ubuntu22.04的兼容性安装指南

本文详细指导如何在Ubuntu22.04系统上安装奥比中光Dabai深度相机的SDK。针对新旧版本不兼容的核心问题,重点推荐使用经过验证的v1.10.18版本SDK,并提供了从系统依赖检查、SDK下载安装、Python环境配置到编译测试的完整步骤,帮助用户成功解决安装难题并实现相机驱动。

j2k3l4的博客 1000

Java反编译工具JD-GUI全场景应用指南:从入门到高级分析

作为Java开发者,你是否曾遇到需要分析第三方库实现逻辑、调试无源码项目或研究字节码优化的场景?JD-GUI作为一款轻量级Java反编译可视化工具,能够直接将CLASS文件转换为可读性强的Java代码,帮助你突破字节码壁垒。本文将通过实际问题场景,带你系统掌握这款工具的核心功能与进阶技巧,构建从基础反编译到复杂代码分析的完整能力体系。 ## 解决环境配置难题:5分钟完成工具部署 当你需要快速分

gitblog_00974的博客 263

【中英双语】Illumina测序原理详解 | 边合成边测序/Sequencing by Synthesis

很多朋友们问我视频讲解时用的笔记可不可以分享,那当然必须是可以呐!但我当时其实没有好好记录,只是打了个草稿就开讲啦!既然大家有需求,俺就重新整理了一下,希望可以帮到大家!

weixin_43843918的博客 7872

别再为授权费头疼了!手把手教你免授权搞定西门子、马扎克等12种主流数控机床的数据采集

本文提供了一套免授权采集西门子、马扎克等12种主流数控机床数据的实战指南,帮助中小型机加工车间节省80%以上的采集成本。通过TCP/UDP协议逆向工程和跨平台数据整合,实现经济、灵活且可持续的数据采集方案,涵盖设备兼容性处理、数据频率优化等关键问题。

weixin_26873711的博客 708

iOS应用IPA文件防止反编译的全面指南与策略

在iOS应用开发中,防止IPA文件反编译至关重要。本文详细讲解了反编译方式、防护策略如代码混淆、加密存储和运行时检测,并提供Swift代码示例,助力开发者保护代码和用户数据安全。

2501_91592143的博客 280

使用ChIPSeeker进行ChIP-seq, ATAC-seq,cut&tag等富集峰的基因组注释

常规的下一代高通量测序(next generation sequencing, NGS)实验通常产生大量短片段(reads),通常我们需要将这些reads比对到参考基因组/转录组上,即将它们置于生物学上有意义的基因背景下,才能获得有意义的结果。一般我们认为会产生两种类型的数据(当然两者并无严格意义上的区分)

微生信 3318

Android app反编译工具

参考: APK反编译之APKTOOL的使用

yzpbright的博客 905

高效敏感词检测API平台对比与选型指南

本文为开发者提供了高效敏感词检测API平台的选型指南。文章对比了专业API平台、头部云厂商、新兴AI服务商及开源方案,从检测能力、集成易用性、成本、稳定性及扩展性五大维度进行分析,并给出实战选型建议,帮助团队根据业务场景快速选择最合适的敏感词检测服务。

weixin_29325955的博客 347

不藏了!Wireshark 命令、捕获、过滤器大全分享给你

Wireshark,这款广受欢迎的开源网络协议分析工具,堪称网络管理员、网络安全专家和网络爱好者的“显微镜”!它可以帮助我们捕获网络中的数据包,并提供详细的解码和分析能力。本文将为您全面剖析 Wireshark 的强大功能,从基础到高级,让你快速掌握这个神器!💡Wireshark 是一款功能强大的网络协议分析器,最早由 Gerald Combs 于 1998 年开发,经过多年发展,已成为网络诊断和分析的首选工具。

网络技术联盟站 727

ILSpy技术解构:.NET反编译工具的全方位应用指南

## 一、价值定位:.NET开发者的必备工具 ### 1.1 工具核心价值解析 ILSpy作为一款开源的.NET程序集浏览器和反编译器,为开发者提供了深入分析已编译程序集的能力。它支持将.NET字节码转换为可读的C#源代码,帮助开发者在没有原始代码的情况下理解程序集结构和实现逻辑。 ### 1.2 技术参数对比 | 功能特性 | ILSpy | dnSpy | dotPeek | |------

gitblog_01091的博客 97

基于Python的船舶AIS数据爬取与分析:从数据采集到可视化实战

本文详细介绍了如何使用Python构建一个完整的船舶AIS数据爬取与分析系统。文章从AIS系统的基本原理讲起,逐步深入到数据采集、存储、清洗、分析和可视化的全流程。我们将使用最新的Python技术栈,包括aiohttp异步爬虫、MongoDB存储、Pandas数据处理以及Pydeck三维可视化等。本文提供了完整的代码实现,并探讨了在实际应用中可能遇到的问题及其解决方案。关键词:AIS数据、Python爬虫、异步IO、数据可视化、海事分析。

2201_76125261的博客 811

反编译的文章

反编译的文章 : http://blog.youkuaiyun.com/column/details/13287.html

飞翔的熊blabla 243

出现 Tomcat:HTTP状态 404 - 未找到解决方法(图文分析)

出现如下问题 HTTP状态 404 - 未找到 类型 状态报告 消息 请求的资源[/ajax_war_exploded/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/8.5.69 解决方法如下: 网上中的操作有步操作多数都误导 这个部署的环境目录上面是web.xml 下面的目录路径是web即可不用到webapp 保存重启服务器即可使用 其他配置中启动tomcat的操作具体 JRE 1.8 ...

码农研究僧的博客 13万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

转-【CTF环境搭建之】如何使用Android反编译软件

反编译大法好,偷布局动画感觉太爽! 1. 准备工作 Java环境Intellij或者Android Studio(推荐)Unix环境 2. 反编译工具 主要有3种方法 2.1. 改名大法 如果只是为了一些布局/图片资源,直接把apk修改为zip,然后解压即可。我们可以用android的调试工具monitor获取view的数字id,然后在解压后的zip中全局搜

B100dGh0st的博客 1634

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Unity C# 反编译

前言 结合前篇:[反编译U3D]Decompile Unity Resources 修正 本篇说说如何查看unity项目(apk) 的源代码,前提是这个apk的代码未经过加密。 写这篇的目地就是看看别的项目大概源码,请大家不要做坏事。 Unity源码文件 Unity的源代码文件 xxx\assets\bin\Data\Managed\Assembly-CSharp.dll 关于这两...

weixin_33725722的博客 313

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

如何免费下载jd-eclipse-site-1.0.0-RC2.zip在eclipse反编译源代码?(新手科普)

如何免费下载jd-eclipse-site-1.0.0-RC2.zip在eclipse反编译源代码?(新手科普) step1、进入链接http://java-decompiler.github.io/ step2、进入页面后选择JD-Eclipse setp3、选择Download进行下载就好了 ...

xiashenbao的博客 6360

我是如何使用Android反编译软件的?

反编译大法好,偷布局动画感觉太爽! 1. 准备工作 Java环境Intellij或者Android Studio(推荐)Unix环境 2. 反编译工具 2.1. 改名大法 如果只是为了一些图片资源,直接把apk修改为zip,然后解压即可。我们可以用android的调试工具monitor获取view的id,然后在解压后的zip中全局搜索(比如Windows/Mac自带Finder)

richie0006的博客 387
上一篇: 近况
下一篇: 【3y原创】什么是保险
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值