Java字节码分析(一)

关于对Java字节码的一次分析 1.文件头 ux 代表 x 个字节 magic => CafeBaby (魔数) minor 次要版本 major 主要版本 52_0 => java 1.8(查表得到) 2.常量池 共有63个 从1-62(这里是010 的模板错误,之后索引自行减一) 0被保留,下面是深入理解Java虚拟机给出的解释 设计者将第0项空出来是有特殊考虑的,这样做的目的在于满足后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项”的含义 对于每一个常量,它的信息需要查找下面的表来确 阅读详情

今天练习的内容,见如下类定义:

import java.lang.reflect.Field;

public class ClassDemo {

   public static void main(String[] args) {

     try {            
        ClassDemo c = new ClassDemo();
        Class cls = c.getClass();

        // field long l
        Field lVal  = cls.getDeclaredField("l");
        System.out.println("Field = " + lVal.toString());
     }
     catch(Exception e) {
        System.out.println(e.toString());
     }
   }
}

一行一行分析:

第一行:

ClassDemo c = new ClassDemo();
这是要new一个ClassDemo对象,字节码如下:
    NEW ClassDemo
    DUP
    INVOKESPECIAL ClassDemo.<init>()V
    ASTORE 1

分析上面的字节码,NEW生成一个对象并压栈,即站上有一个ClassDemo对象,但是此对象是未初始化的对象,

需要调用缺省构造函数进行初始化,所以调用DUP指令,这样栈顶就有两个ClassDemo对象的引用,然后通过

INVOKESPECIAL调用构造函数,即弹出栈顶一个对象引用,初始化完毕,通过ASTOR将栈顶的对象引用赋给

本地变量1。

(注:INVOKESPECIAL主要出发三类方法的调用:1、构造函数(<init>);2、私有成员方法(private method);

3、父类方法(super),比如new StringBuffer对应的字节码如下:

new java/lang/StringBuffer         ; create a new StringBuffer
dup                                ; make an extra reference to the new instance
                                   ; now call an instance initialization method
invokespecial java/lang/StringBuffer/<init>()V
                                   ; stack now contains an initialized StringBuffer.

第二行:

Class cls = c.getClass();
这行代码,是调用上面生成的对象,返回其class对象,字节码如下:

    ALOAD 1
    INVOKEVIRTUAL java/lang/Object.getClass()Ljava/lang/Class;
    ASTORE 2
将变量1的对象引用(注意是对象引用)压栈,调用其getClass方法,将该class对象赋给本地变量2。(不详细解释了,参考上面)

Field lVal  = cls.getDeclaredField("l");
这行代码是返回cls对象的l字段,这就很简单了,字节码如下:

    ALOAD 2
    LDC "l"
    INVOKEVIRTUAL java/lang/Class.getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;
    ASTORE 3
首先将对象引用压栈,接着将参数压栈,然后调用getDeclaredField方法,齐活!



Keil5与ARM编译器V5安装指南:从下载到配置全流程解析 本文提供Keil5与ARM Compiler V5的完整安装与配置指南。针对新版Keil5默认不包含V5编译器导致老工程编译失败的问题,详细解析了从软件下载、授权管理到获取并正确安装ARM Compiler V5(AC5)的全流程,确保开发者能顺利搭建兼容老项目的稳定开发环境。 阅读详情

相关推荐

【Docker】Docker安装Hadoop分布式集群

hadoop目录安装在:/usr/local/hadoop-2.7.0/etc/hadoop。访问Hadoop102:9870,查看是否能够看到hdfs界面。访问hadoop103:8088,查看能够看到yarn界面。在yarn上可以看到执行情况。

weixin_46429290的博客 3460

Plume 调用指南:Java字节码分析实战

Plume 通过 ​标准化JVM字节码到CPG的转换,成为Joern生态中Java安全分析的核心引擎。其 ​工业级扩展性 与 ​多数据库支持 使其既能处理小型库文件,也能应对企业级代码仓库。对于安全研究人员,Plume+Joern的组合提供了从 ​闭源审计 到 ​自动化漏洞修复 的完整技术栈,是Java生态安全分析不可或缺的利器。

编程小栈 1110

不止是回退SDK:深入解读UE5.2编译时那个烦人的C4756警告与INFINITY宏的变迁

本文深入解析了UE5.2源码编译时出现的C4756警告及其背后的技术原因,探讨了Windows SDK中INFINITY宏的变迁对Unreal Engine的影响。文章详细介绍了微软修改INFINITY定义的技术考量,并提供了UE5.2应对此类问题的灵活解决方案,包括通过BuildConfiguration.xml文件精确控制工具链版本,确保构建系统的可重复性和可配置性。

weixin_27180827的博客 311

Java字节码分析快速入门/字节码执行分析(一)

我们知道,计算机直接使用的程序语言语句是机器指令码,又称机器码/代码。但在Java开发过程中,Java源码先被编译成了字节码,然后才解释称机器码运行。这是为什么呢? 字节码是什么呢?

软件工程探索之旅 1753

Windows下快速搭建MSYS2开发环境(含GCC与MinGW配置)

本文详细介绍了在Windows系统下快速搭建MSYS2开发环境的完整流程。通过使用pacman包管理器,可以便捷地安装GCC编译器与MinGW-w64工具链,并配置系统环境变量。文章还涵盖了从基础安装、系统更新到编译开源项目的实战指南,帮助开发者高效构建原生Windows程序,显著提升C/C++开发效率。

weixin_29213827的博客 539

卫星动力学仿真模型开发之AI初试

以下是通过AI生成的一个简单的C语言仿真模型,用于模拟卫星的姿态、轨道动力学和运动学。该模型基于基本的物理公式,假设卫星在近地轨道上运行,并忽略了一些复杂的扰动因素(如大气阻力、太阳辐射压等)。姿态动力学描述了卫星绕其质心的旋转运动。轨道动力学描述了卫星在引力作用下的运动。姿态运动学描述了卫星姿态随时间的变化。

xspace的博客 569

深入剖析java字节码

根据b站宋红康老师的课程笔记总结。

ty66696的博客 1053

MIPI CPHY学习笔记02:TX物理层一致性测试项解析(HS信令模式)第一部分

在手机、平板等移动设备中,MIPI C-PHY是连接相机、显示屏等高速外设的“数据高速公路”。高速(HS)信令模式就是这条公路的“快车道”,专门用于传输高清图像、视频等大容量数据,既要保证传输速率,又要维持信号稳定。物理层一致性测试是对这条“快车道”的全面质检,确保高速传输下数据不卡顿、不失真。今天我们聚焦MIPI C-PHY TX(发射端)的Group 2 HS信令测试,用通俗语言拆解22个核心测试项(含2个过时项),看懂高速信号的合格标准。

一只豌豆象的博客 290

详解JAVA字节码

一文详解JAVA字节码

BugMan的博客 3380

Freeswitch DTMF 按键无法接收问题修复

freeswitch 在接收到 update后,会更新成新的 payload type,但是给的200响应,仍然是旧的,这时候就会导致手机侧认识需要发送旧的payload,所以发到 fs 后就会导致直接丢包,不去处理RTP包了。呼叫时需要设置通道变量 rtp_manual_rtp_bugs=ACCEPT_ANY_PAYLOAD ,这时候FS 就不会对包的payload进行判断,直接判定通过。应该修复 freeswitch 给响应时,应该根据收到的 payload 发送给手机,但是一直未找到正确的路径。

2301_81507069的博客 373

PyTorch实战(25)——使用PyTorch构建DQN模型

深度Q网络 (Deep Q-learning Network, DQN) 在强化学习领域取得了巨大的成功和广泛的应用,PyTorch 结合 gymnasium 库为我们提供了强大的工具,支持在各种强化学习环境中测试不同类型的深度强化学习模型。在本节中,我们使用 PyTorch 框架构建使用卷积神经网络架构的 DQN 模型,模型通过自主学习掌握 Atari 经典游戏《Pong》的操作策略,最终实现击败电脑对手的竞技目标。

盼小辉丶的博客 3469

Java字节码解读

学习视频:《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!ore | 将栈顶 int 型数值存入指定本地变量 || 0x37 | lstore | 将栈顶 long 型数值存入指定本地变量 || 0x38 | fstore | 将栈顶 float 型数值存入指定本地变量 |自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

2401_84046545的博客 1198

Microsemi Libero系列教程(四)——PLL的使用

文章目录PLL是什么Libero中PLL的使用官方文档 系列教程:Microsemi Libero系列教程 PLL是什么 PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时钟信号,使高频器件正常工作,如内存的存取资料等。PLL用于振荡器中的反馈技术。 许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。一般的晶振由于工艺与成本原因,做不到很高的频率...

whik1194的博客 7212

JAVA字节码分析

以下是Java字节码(.classJava字节码是基于的二进制流,按顺序紧凑排列,无分隔符。

Android资深专家,chromium 内核开发者 1242

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java 字节码分析工具

② 使用jclasslib分析类加载机制。[jclasslib界面分区图示]建议按照以下路径循序渐进: ① 从。③ 结合ASM进行动态字节码修改。确保已安装JDK 8及以上版本。④ 最终实现自定义的编译时处理。开始观察简单方法的字节码。

m0_75107803的博客 897

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java字节码,编译Java代码并查看字节码文件,分析字节码文件

本文主要介绍了介绍了Java中的一些基础知识点以及Java中的字节码。重点讲述了如何编译Java代码并查看字节码文件,并实际分析了一段字节码文件,便于更好的理解Java的字节码。

ZhaoSimonone的博客 5044

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

如何高效进行Java字节码逆向分析:Recaf让复杂代码变得简单

Java字节码逆向分析常常让开发者望而却步,复杂的指令集和晦涩的常量池结构成为入门的主要障碍。而Recaf作为一款现代Java字节码编辑器,通过直观的可视化界面和智能化功能,让代码逆向分析变得简单高效。无论是新手开发者还是资深逆向工程师,都能借助Recaf轻松编辑、调试和理解Java字节码文件。 ## Recaf:现代Java字节码编辑的终极解决方案 Recaf的核心优势在于它将复杂的字节码操

gitblog_01126的博客 1247

java new字节码原理分析

例如:c++中是实例化一个对象分为二步,第一步开辟内存、第二步 调用构造函数init对象的属性信息.那么java new一个对象 都做哪些操作.这篇文档从字节码层面和jvm层面这二个角度来分析。

weixin_41253524的博客 854

java中类的字节码_Java 字节码与字节码分析

1.1 Java 字节码简介Java 字节码由单字节(byte)的指令组成,理论上最多支持 256 个操作码(opcode)。实际上 Java 只使用了200左右的操作码, 还有一些操作码则保留给调试操作。根据指令的性质,主要分为四个大类:1.栈操作指令,包括与局部变量交互的指令2.程序流程控制指令3.对象操作指令,包括方法调用指令4.算术运算以及类型转换指令字节码的运行时结构:JVM 基于栈的计...

weixin_33917663的博客 952

45-Java字节码整体分析与总结

Java字节码整体分析与总结 MyTest2.java自己分析一遍!~~~

qq_40574305的博客 133

Recaf终极指南:快速掌握Java字节码分析与反编译技巧

Recaf是一款功能强大的现代Java字节码编辑器和反编译器,为开发者提供了直观的界面来浏览、修改和分析编译后的Java代码。无论是调试第三方库、学习优秀代码实现,还是进行逆向工程研究,Recaf都能成为您的得力助手。 ## 快速入门:环境配置与安装 ### 系统要求与准备 在开始使用Recaf之前,请确保您的系统满足以下基本条件: - **Java环境**:JDK 8或更高版本(推荐JDK

gitblog_00129的博客 877

JAVA 字节码文件分析

​​​​ package com.jvm.bytecode; public class MyTest1 { private int a = 1; public int getA() { return a; } public void setA(int a) { this.a = a; } } 使用javap -...

lm324114的专栏 412

Bytecode Viewer:Java字节码分析的终极工具指南

Bytecode Viewer(BCV)是一款面向Java 8+和Android APK的高级逆向工程套件,集成了反编译器、编辑器和调试器等多种功能,为开发者和安全研究人员提供一站式的字节码分析解决方案。无论是解析Jar文件还是Android应用,BCV都能通过直观的界面和强大的工具链简化逆向工程流程。 ## 为什么选择Bytecode Viewer? 作为一款轻量级但功能全面的逆向工程工具,B

gitblog_00563的博客 1069

diagram-design Terminal 皮肤详解:用 CLI 窗口外壳渲染开发者向技术图的完整指南

本篇指南围绕 diagram-design 技能仓库中的终端窗口皮肤(Terminal Window / CLI-chrome variant)展开,讲解如何把任意一张架构图、流程图或循环图包裹进一个伪造的 macOS 风格终端窗口(三圆点标题栏 + `$` 提示符 + 全等宽字体),用于开发工具发布帖、CLI 产品宣传和技术社交卡片。读完本文,你将掌握该皮肤的 9 枚固定 token、页面骨架语

gitblog_00989的博客 446

java字节码的简单分析记录

对于一个写好的java程序来说。第一步就是把把java代码编译成字节码,生成一个class文件,并将这个这个Class文件交个JVM去解析,然后调用本机的机器吗执行。接下来通过一个简单的列子分析一下编译的class文件 第一步先编写一个简单的java文件 package com.example.demo; public class ByteCode { public static voi...

qq_39401252的博客 191

java idea编译字节码_Intellj IDEA Java字节码分析工具

字节码含义- 也可以安装 Browse repositories 插件栈和局部变量操作将常量压入栈的指令aconst_null 将null对象引用压入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类型常量0压入栈iconst_1 将int类型常量1压入栈iconst_2 将int类型常量2压...

weixin_29338423的博客 506
上一篇: XMPP开发记录
下一篇: 梆梆加固破解
jiang_lostcode
博客等级 码龄18年 45粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值