Java 编译与反编译深度解析
Java 编译与反编译深度解析
1. 编译过程详解
(1) 完整编译流程
.java 文件 → 词法分析 → 语法分析 → 语义分析 → 字节码生成 → .class 文件│ │ │ │↓ ↓ ↓ ↓识别关键字 生成抽象语法树 类型检查 生成JVM指令
(2) 编译器核心阶段
-
前端编译(javac):
-
词法分析:将源码转换为token流
-
语法分析:构建抽象语法树(AST)
-
语义分析:类型检查、常量折叠等优化
-
-
后端编译(JIT):
-
字节码解释执行
-
热点代码编译为机器码
-
(3) 类文件结构剖析
java
ClassFile {u4 magic; // 魔数CAFE BABEu2 minor_version; // 次版本号u2 major_version; // 主版本号u2 constant_pool_count; // 常量池大小cp_info constant_pool[]; // 常量池u2 access_flags; // 访问标志u2 this_class; // 当前类索引u2 super_class; // 父类索引u2 interfaces_count; // 接口数量u2 interfaces[]; // 接口索引u2 fields_count; // 字段数量field_info fields[]; // 字段表u2 methods_count; // 方法数量method_info methods[]; // 方法表u2 attributes_count; // 属性数量attribute_info attributes[]; // 属性表
}
2. 反编译技术揭秘
(1) 反编译原理
.class 文件 → 解析字节码 → 重建AST → 生成Java代码
(2) 主流反编译工具对比
工具名称 | 准确率 | 特点 | 典型应用场景 |
---|---|---|---|
JD-GUI | 85% | 图形化界面 | 快速查看代码 |
CFR | 95% | 支持Java8+特性 | 生产级反编译 |
Procyon | 90% | 良好的lambda支持 | 研究用途 |
FernFlower | 92% | IntelliJ内置引擎 | IDE反编译 |
(3) 反编译实战示例
原始代码:
java
public class Calculator {public int add(int a, int b) {return a + b;}
}
反编译结果:
java
// JD-GUI输出
public class Calculator {public int add(int paramInt1, int paramInt2) {return paramInt1 + paramInt2;}
}// CFR输出
public class Calculator {public int add(int a, int b) {return a + b;}
}
3. 字节码深度解析
(1) 方法调用指令详解
指令 | 调用场景 | 示例字节码 |
---|---|---|
invokestatic | 静态方法 | invokestatic Math.sqrt(D)D |
invokevirtual | 实例方法 | invokevirtual StringBuilder.append(Ljava/lang/String;) |
invokespecial | 构造方法 | invokespecial Object.<init>()V |
invokedynamic | Lambda/方法引用 | invokedynamic #0:run()Ljava/lang/Runnable; |
(2) 字段访问指令
java
aload_0 // 加载this引用
getfield #5 // 访问实例字段 Field name:Ljava/lang/String;
putfield #5 // 设置实例字段
4. 代码保护方案
(1) 多层级保护策略
-
基础混淆
-
类/方法/字段重命名
-
控制流混淆
-
-
加密加固
-
字符串加密
-
类文件加密
-
-
运行时防护
-
反调试检测
-
完整性校验
-
(2) 商业保护工具
bash
# ProGuard配置示例
-injars input.jar
-outjars output.jar
-optimizationpasses 5
-keep public class com.example.Main { *; }
5. 高级调试技巧
(1) 字节码调试方法
bash
# 使用JDB调试
jdb -classpath . MyClass# 打印方法字节码
javap -c -p MyClass.class
(2) 查看JIT编译结果
bash
java -XX:+PrintCompilation -XX:+PrintAssembly MyApp
6. 实战案例分析
(1) Lambda表达式编译结果
java
// 源码
Runnable r = () -> System.out.println("Hello");// 反编译
private static void lambda$main$0() {System.out.println("Hello");
}
(2) 泛型擦除证据
java
// 源码
List<String> list = new ArrayList<>();// 字节码
NEW java/util/ArrayList
DUP
INVOKESPECIAL java/util/ArrayList.<init> ()V
7. 学习路线建议
-
初级阶段:
-
掌握javap基本用法
-
理解常见字节码指令
-
-
中级阶段:
-
尝试手动修改字节码
-
学习ASM框架
-
-
高级阶段:
-
研究JVM字节码规范
-
开发自定义编译器插件
-
记忆口诀:
"编译三步走:词法语法语义分析"
"反编两关键:解析字节码+重建AST"
"保护三要素:混淆加密运行时"
相关文章:
Java 编译与反编译深度解析
Java 编译与反编译深度解析 1. 编译过程详解 (1) 完整编译流程 .java 文件 → 词法分析 → 语法分析 → 语义分析 → 字节码生成 → .class 文件│ │ │ │↓ ↓ ↓ ↓识别关键字 生成抽象语法树 类型…...
Java集合框架中的List、Map、Set详解
在Java开发中,集合框架是处理数据时不可或缺的工具之一。今天,我们来深入了解一下Java集合框架中的List、Map和Set,并探讨它们的常见方法操作。 目录 一、List集合 1.1 List集合介绍 1.2 List集合的常见方法 添加元素 获取元素 修改元素…...
国产的 Java Solon v3.2.0 发布(央企信创的优选)
Solon 框架! Solon 是新一代,Java 企业级应用开发框架。从零开始构建(No Java-EE),有灵活的接口规范与开放生态。采用商用友好的 Apache 2.0 开源协议,是“杭州无耳科技有限公司”开源的根级项目ÿ…...
机器学习决策树
一、何为决策树 决策树(Decision Tree)是一种分类和回归方法,是基于各种情况发生的所需条件构成决策树,以实现期望最大化的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。它的运行机制非常通俗易…...
Java集合及面试题学习
知识来源沉默王二、小林coding、javaguide 1、ArrayList list.add("66") list.get(2) list.remove(1) list.set(1,"55") List<String> listnew ArrayList<>(); 底层是动态数组 添加元素流程:判断是否扩容…...
【内置函数】84个Python内置函数全整理
Python 内置函数全集(完整分类 参数详解 示例) 文章目录 Python 内置函数全集(完整分类 参数详解 示例)一、数值与数学函数abs(x)divmod(a, b)pow(x, y, modNone)round(number[, ndigits])sum(iterable, /, start0)hash(obj) …...
【LeetCode 热题 100】双指针 系列
📁283. 移动零 对于该题目,需要注意的是两个地方,一是保持非零元素的相对顺序,以及O(1)的空间复杂度。 采用双指针的思路,将数组划分成3个区间,。 [0 , left]:该区间内元素全是非零元素。 [left1 , right…...
实现批量图片文字识别(python+flask+EasyOCR)
话不多说,向上效果图 1)先说框架版本 为什么要先说框架版本呢,因为我在各种版本中尝试了两天,总算确定了如下版本适合我,至于其他的版本,各位自己去尝试 python 3.9.7 EasyOCR 1.7.2 flask 3.0.3 2)执行操作效果图 2.1)多选文件 2.2)图片预览 2.3)提取选中文件 2.4)提取所有文…...
[Swift]pod install成功后运行项目报错问题error: Sandbox: bash(84760) deny(1)
操作: platform :ios, 14.0target ZKMKAPP do# Comment the next line if you dont want to use dynamic frameworksuse_frameworks!# Pods for ZKMKAPPpod Moyaend pod install成功后运行报错 报错: error: Sandbox: bash(84760) deny(1) file-writ…...
文档内容提取以及合成
如何从10个左右的docx文档中抽取内容,生成新的文档,抽取内容包括源文档的文字内容、图片、表格、公式等,以及目标文档的样式排版、字体、格式,还有目标文档的语言风格、用词规范、文法习惯等等。这是一个相当复杂的需求࿰…...
[Windows] Wireshark 网络抓包工具 v4.4.6
[Windows] Wireshark 网络抓包工具 链接:https://pan.xunlei.com/s/VOODTZ7Lm2gsNLoFNcOIqflzA1?pwdf3ea# 软件说明Wireshark(前称Ethereal)是一款免费开源的网络嗅探抓包东西,世界上最流行的网络协议剖析器!网络封…...
在Ubuntu中安装hadoop的详细过程
在Ubuntu中安装hadoop的详细过程 请自行安装Ubuntu系统(可参考:在VMWare中安装Linux虚拟机Ubuntu) 一、创建hadoop用户 如果在安装 Ubuntu 的时候不是用的 “hadoop” 用户,这时需要增加一个名为 hadoop 的用户。 首先打开终端…...
NOIP2017提高组.列队
目录 *数据结构模板题目算法标签: 模拟, 线段树, 线段树动态开点, 树状数组, 平衡树思路*前置代码完整注释代码精简注释代码 *数据结构模板 题目 530. 列队 算法标签: 模拟, 线段树, 线段树动态开点, 树状数组, 平衡树 思路 首先考虑简单情况, 如果只有一行, 删除一个位置…...
PSN港服跳过生日找回密码(需要英语对话,需要注册的id)
登陆这个网站 https://www.playstation.com/en-hk/support/contact-us/?categoryAcc&subCategorypw 随便输入点名字 firstname 跟lastname 勾选,然后打开机器人聊天 然后按照提示输入邮箱跟id,输入正确之后会分配真人客服 真人客服会要求提供第一次…...
服务治理-服务注册
一个服务在真实项目部署的时候,如果压力较大,会做多实例部署。 在IDEA里面做多实例部署的话,只需要配置多个启动项。...
Jinja2模板引擎SSTI漏洞
1. 引入 再研究大模型相关应用的漏洞CVE-2025-25362时(参考1),看到作者给了比较详细的分析(参考2)。下面对这个漏洞做个介绍。 2. 漏洞类型 这个漏洞属于CWE-1336,它主要关注在使用模板引擎进行脚本化处…...
STM32单片机教程:从零开始打造智能天气时钟
STM32单片机教程:从零开始打造智能天气时钟 大家好!今天我想为大家详细介绍一下我们的STM32课程,以及如何从零基础逐步掌握单片机开发技能,最终实现一个完整的智能天气时钟项目。 课程面向人群 本课程主要面向那些已经通过野火…...
c++_csp-j算法 (1)
DFS搜索(深度优先搜索) 讲解 第一部分:DFS搜索算法简介 深度优先搜索(Depth-First Search,DFS)是一种常用的图搜索算法,用于遍历或搜索图或树的所有节点。DFS算法的核心思想是尽可能深地搜索图的分支,直…...
word选中所有的表格——宏
Sub 选中所有表格()Dim aTable As TableApplication.ScreenUpdating FalseActiveDocument.DeleteAllEditableRanges wdEditorEveryoneFor Each aTable In ActiveDocument.TablesaTable.Range.Editors.Add wdEditorEveryoneNextActiveDocument.SelectAllEditableRanges wdEdito…...
16、堆基础知识点和priority_queue的模拟实现
一、priority_queue的使用方法 priority_queue的使用方法看这篇文章 二、堆 1、介绍 堆(Heap)是一种特殊的完全二叉树数据结构,满足以下性质: 堆序性质(Heap Property): 大顶堆(…...
20250419将405的机芯由4LANE的LVDS OUT配置为8LANE的步骤
20250419将405的机芯由4LANE的LVDS OUT配置为8LANE的步骤 2025/4/19 15:38 查询格式YUV/RGB 81 09 04 24 60 FF 90 50 00 00 FF 查询辨率帧率 81 09 04 24 72 FF 90 50 01 03 FF 查询LVDS mode : Singel output/Dual output 81 09 04 24 74 FF 90 50 00 00 FF 配置405的机…...
【信息系统项目管理师】高分论文:论信息系统项目的采购管理(信息化办公系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划采购管理2、实施采购3、管理采购论文 随着信息化技术的发展,从企业到政府,传统的办公模式正在悄然消失,信息化办公模式正成为主流。特别是国务院印发的《关于加快推广“互联网+政务服务”工作的…...
国产GPU生态现状评估:从寒武纪到壁仞的编程适配挑战
近年来,国产GPU厂商在硬件性能上持续突破,但软件生态的构建仍面临严峻挑战。本文以寒武纪、壁仞等代表性企业为例,对比分析其与CUDA生态的兼容性差异,并探讨技术突围路径。 一、编程适配的核心挑战 编程模型差异与开发成本 …...
Linux(autoDL云服务器)mamba-ssm环境安装——一次成功!
1.创建环境选择torch2.0, cuda11.8,python3.8 2.从GitHub官网下载cp38对应的,causl_conv1d,和mamba-ssm2.2.2。下载入下图所示。 3.直接用finalshell 或者xshell连接服务器上传,到根目录下面。 直接用pip install *…...
手搓LeNet-5(基础模型)实现交通标志识别
手搓LeNet-5(基础模型)实现交通标志识别 一、环境准备1. 安装Python环境2. 安装CUDA(可选,仅需GPU加速时)3. 配置虚拟环境4. 安装PyTorch核心库5. 安装辅助库6. 验证安装7. 准备数据集8.常见问题处理 二、 数据集处理三…...
TV主板的拆解学习
下面是小米的电视机主板,电源采用PFCLLC方案,主控采用电视盒子主控采用晶晨半导体T962-H,搭配2G南亚DDR3L内存和8G三星eMMC存储器。 本文用来加深对TV主板的认识,学习于充电头网,链接在文末。 两颗蓝色插件Y电容来自S…...
PH热榜 | 2025-04-19
1. Omakase.ai Voice 标语:你的语音驱动销售助手。一个链接。 介绍:Omakase.ai Voice将您的网站转变为一个语音驱动的销售助手,它可以在客户浏览时进行对话、倾听并给出推荐。聊天机器人往往效果不佳——它们无法实现销售,而这个…...
LeetCode(Hot.2)—— 49.字符异位词分组题解
Problem: 49. 字母异位词分组 字母异位词的定义是:两个单词的字母组成一样,但顺序可以不同,比如 eat、tea 和 ate 就是一个组的。 思路 将每个字符串按字母排序,把排序后的字符串作为 key,相同 key 的放在一个 list 中…...
UE学习记录part19
231 insect: insect enemy type 创建dead动画资源 往insect head上添加socket 创建攻击root motion动画。motion warping需要与root motion合作使用 为buff_blue创建物理资产 设置simulate physic使sinsect死亡后能落到地板上而不是漂浮在空中,要将die函数设置为 -…...
不连续数据区间天数累计sql
计算不连续数据区间天数并且剔除重复天数 create table loan_data(loan_no varchar(10),cust_no varchar(10),start_date date,end_date date )INSERT INTO loan_data VALUES (LN001, CUST001, 2025-01-04, 2025-01-08); INSERT INTO loan_data VALUES (LN002, CUST001, 2025-…...
django基于爬虫的网络新闻分析系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 本网络新闻分析系统采用B/S架构,数据库是MySQL,网站的搭建与开发采用了先进的Python进行编写,使用了Django框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。前台主要功能包括:用户注册、登录、浏览…...
JAVA文件I/O
目录 一、三种路径的分类: 1、绝对路径: 2、相对路径: 3、基准目录: 二、文件的种类: 三、利用JAVA操作文件: 1、File类的构造方法: 2、File 类方法的使用: 使用例子&#…...
第七周作业
一、分别在前端和后端使用联合注入实现“库名-表名-字段名-数据”的注入过程,写清楚注入步骤 1、爆库 后端sql语句:select database(); 前端:1 order by 1#,1 order by 2#,1 order by 3# 判断显示位为两位1 union sel…...
Linux 进程信号详解
进程信号 信号是进程之间事件异步通知的一种方式,属于软中断。 kill -l //查看不同信号代表的事件 执行kill -l 可以看到共有62种信号,其中: 0-31号信号为非可靠信号(这部分信号借鉴于UNIX系统的信号);…...
MCP 应用案例-网络设备批量管理
案例背景 需求痛点 企业需管理数百台跨地域网络设备(交换机/路由器),传统方式存在: 人工SSH登录效率低脚本维护成本高(不同厂商CLI语法差异)状态监控依赖独立监控系统 解决方案 通过MCP协议构建智能网络…...
进程程序替换
fork() 之后,⽗⼦各⾃执⾏⽗进程代码的⼀部分如果⼦进程就想执⾏⼀个全新的程序呢?进程的程序 替换来完成这个功能! 程序替换是通过特定的接⼝,加载磁盘上的⼀个全新的程序(代码和数据),加载到调⽤进程的地址空间中!…...
6.7 ChatGPT自动生成定时任务脚本:Python与Cron双方案实战指南
ChatGPT自动生成定时任务脚本:Python与Cron双方案实战指南 关键词:定时任务调度, ChatGPT 代码生成, Cron 脚本开发, Python 调度器, 自动化更新系统 6.3 使用 ChatGPT 生成 Cron 调度脚本 在 GitHub Sentinel 的定期更新功能中,定时任务调度是核心模块。本节演示如何通过…...
废物九重境弱者学JS第十四天--构造函数以及常用的方法
目录 JavaScript 进阶 - 第2天 深入对象 构造函数 实例成员 静态成员 内置构造函数 Object Array 包装类型 String Number 案例 JavaScript 进阶 - 第2天 了解面向对象编程的基础概念及构造函数的作用,体会 JavaScript 一切皆对象的语言特征,…...
机器学习+深度学习
文章目录 一、机器学习(一)机器学习概念(二)机器学习基本流程(三)机器学习应用场景二、机器学习的常见工具与相关库(一)Python 机器学习库(二)数据处理库(三)可视化库三、聚类算法思想与模型搭建过程(一)K - Means 聚类算法(二)DBSCAN 聚类算法四、分类算法思想…...
docker基本使用命令
一、镜像 1、拉取镜像 docker pull busybox docker pull nginx:1.26-alpine 2、查看本地镜像 [rootRocky-1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 4e1b6bae1e48 18 hours ago 192MB busybox lates…...
相机模型--CMOS和CCD的区别
1--CMOS和CCD的工作原理 CCD(Charge Coupled Device,电荷耦合器件): 1. 图像通过光电效应在感光单元中转化为电荷; 2. 每个像素上的电荷被依次“耦合”并传输到芯片的角落,通过一个或几个模拟输出放大器输…...
触发器(详解)
一:MySQL触发器 MySQL数据库中触发器是一个特殊的存储过程。 不同的是执行存储过程要使用 CALL 语句来调用,而触发器的执行不需要使用 CALL 语句来调用,也不需要手工启动,只要一个预定义的事件发生就会被 MySQL自动调用。 引发…...
Vue 3 中将 ref 创建的响应式对象数据转换为普通(非响应式)的数据
Vue 3 中使用 ref 创建的响应式对象数据转换为普通(非响应式)的数据,有以下几种方法: 1. 访问 .value 属性: 这是最直接、最常见的方法。 由于 ref 对象的值存储在其 .value 属性中,直接访问该属性即可获得普通数据。…...
Vue基础(6)_键盘事件
普通键盘事件 键盘事件常用的有两个:keydown、keyup。 举例: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><script type"text/javascript" src"../js/vue.js"&…...
Kubernetes控制平面组件:高可用 APIServer
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
这个是我的qss按钮样式 和之前的// 应用全局样式表 QString style = R“(是会冲突吗,导致我的按钮背景颜色是黑色,我该怎么修改
/* 样式 A */ *[style-type="A"] { background-color:#cfd1d4; border: none; border-radius: 50%; /* 圆形边框 */ padding: 7px 14px; } *[style-type="A"]:hover { background-color: #45a049; }这个是我的qss按钮样式 和之前的// 应用全局样式表 QStri…...
Kubernetes控制平面组件:API Server详解(二)
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
人工智能在智慧农业中的应用:从田间到餐桌的变革
农业是人类社会的基石,随着全球人口的增长和资源的日益紧张,传统农业面临着巨大的挑战。近年来,人工智能(AI)技术的快速发展为农业带来了新的机遇。智慧农业通过将AI技术与农业生产相结合,实现了从田间种植…...
多人3D游戏完整实现方案
以下是一份完整的代码实现方案,涵盖架构设计、核心模块实现和部署流程。我们以 多人3D游戏 为例,结合之前讨论的Nano服务端框架和Unity客户端: 技术栈 模块技术选型服务端Golang + Nano框架 + MongoDB客户端Unity 2022 + C# + Mirror Networking通信协议Protobuf + WebSock…...
FFUF指南
ffuf 的核心功能: 目录/文件发现: 通过暴力破解(使用字典)探测目标网站的隐藏目录或文件,例如: ffuf -w /path/to/wordlist.txt -u http://target.com/FUZZ 子域名枚举: 通过模糊测试发现目标…...