首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏JAVA相关

    Arthas jad(字节文件反编译成源代码 )

    @toc二、命令列表2.2 class/classloader相关命令2.2.1 jad(字节文件反编译成源代码 )提示:jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 [arthas@24056]$举例2:反编绎时只显示源代码(默认情况下,反编译结果里会带有ClassLoader信息)默认情况下,反编译结果里会带有ClassLoader信息,通过--source-only ClassLoader 都加载了这个类时,jad 命令会输出对应 ClassLoader 实例的 hashcode,然后你只需要重新执行 jad 命令,并使用参数 -c <hashcode> 就可以反编译指定 Arthas perfcounter(查看当前 JVM 的 Perf Counter 信息)15.Arthas vmtool(从 jvm 里查询对象,执行 forceGc)16.Arthas jad(字节文件反编译成源代码 )17.Arthas mc(Memory Compiler/内存编译器 )18.Arthas redefine(加载外部的.class文件,redefine到JVM里 )19.Arthas classloader

    40910编辑于 2025-05-08
  • 来自专栏技术小黑屋

    终端反编译字节利器 CFR

    最近在研究一下class字节的东西,尝试将class文件反编译成java文件。 尝试了很多的工具,比如JD-GUI及其插件以及各种在线反编译,始终感觉不够酷,毕竟我是一个比较依赖终端的人,所以尝试找一些能否在终端可以实现反编译的工具。 它是一个jar包 名称叫做CFR(Class File Reader) 支持反编译class文件和jar包 如下介绍两个常用的命令使用 反编译class文件 1 2 3 4 5 6 7 8 9 10 11 执行上述命令结束后,从输出目录(outputdir)下就能找到对应的java文件了。 包装成脚本 反编译某个class文件 1 2 #! /bin/bash java -jar ~/Documents/scripts/cfr-0.139.jar $1 反编译某个jar包 1 2 #!

    1.3K10发布于 2020-01-22
  • 来自专栏技术成长

    反编译Java字节,并且定位问题

    反编译 在调试Java应用程序时,可以使用以下工具来查看字节反编译的结果: javap命令:Javap是一个Java类反汇编工具,可以查看编译后的字节。 它是JDK的一部分,通过在命令行中使用以下命令来获取字节反编译结果: javap -c <ClassName> 其中<ClassName>是要查看字节的Java类的名称。 例如,假设我们有一个名为Example.class的Java类,可以使用以下命令查看其字节反编译结果: javap -c Example 输出结果将显示该类的字节指令和对应的Java代码。 JD-GUI:JD-GUI是一个可用于查看和分析Java反编译文件的图形工具。它可以将Java类的字节文件(.class)反汇编为可读的Java源代码。 使用以上工具之一查看该类的字节反编译结果。 分析反编译结果,查看其中的方法和操作指令,比较与预期的逻辑是否一致。 通过对比字节和源代码,可以确定是否存在编译器优化或其他差异导致的问题。

    54351编辑于 2023-08-17
  • 来自专栏FreeBuf

    Vdex Extractor:从Vdex文件反编译和提取Android Dex字节

    Vdex Extractor 一款命令行工具,用于从Vdex文件反编译和提取Android Dex字节的工具。 (默认:false) --no-unquicken : 禁用unquicken字节反编译器 (don't de-odex) --deps : 转储经过验证的依赖信息 --dis : 启用字节反汇编器 --ignore-crc-error : 反编译Dex 忽略CRC错误 --new-crc= : 提取Apk或Dex 验证迭代器的依赖关系 当第一次编译(优化)Dex字节文件时,dex2oat将执行验证依赖项收集器,作为方法学验证者的一部分。 以下代码段演示了示例Vdex文件的依赖项转储示例。 ? ? 集成反汇编程序 为了调试反编译器并协助Dex字节调查任务,实现了一个轻型反汇编程序。

    6K72发布于 2018-11-08
  • 来自专栏Java开发者之家

    Java 字节反编译成汇编-使用JITWatch

    Java 字节反编译成汇编 本位以windows环境为前提,JDK版本为Oracle Sun JDK8-64位 Hsdis环境准备 1.下载hsdis-amd64.dylib 下载地址如下:https https://github.com/atzhangsan/file_loaded 3.配置hsdis-amd64.dylib和hsdis-amd64.dll a.将下载好的hsdis-amd64.dll文件放置在 C:\Program Files\Java\jdk1.8.0_161\jre\bin b.将下载好的hsdis-amd64.dylib文件放置在JDK路径下的\jre\lib目录下。 e.g. [image-20210414230849483] 5.自行构建hsdis(如果你有兴趣的话) 如果你有兴趣自行编译hsdis的话,可以参考如下的几个链接,然后把编译好的文件放在jdk的jre目录下的如上所 按钮打开需要编译的java代码,点击Run按钮运行得到下图所示 [image-20210414232726380] [image-20210414234418226] 3.JITwatch简单使用 模块化查看字节和汇编码

    1.6K30发布于 2021-05-13
  • 来自专栏刘晓杰

    dex文件字节解析

    这一篇解析dex文件.还是由上一篇文章MainActivity生成的dex文件.dex文件比较大,我就不贴16进制代码了,大致讲一下具体怎么操作.由于手工解析太困难了,所以我就借助代码和两篇参考文章来解析的 Android逆向之旅---解析编译之后的Dex文件格式 Android dex文件解析 接下来开始解析. 1.头文件文件格式包含magic, checksum,file_size等信息,但是要注意他们都是小端数据 public int static_value_off; 这是最复杂的,但是有了上面几个的解析其实对应写起来也不算难,本人写过,但是快写吐了,就没贴出来,具体的方法和上面的也是一样的 可以看到,其实dex文件比 class文件要复杂得多.一方面是小端排列,另一方面需要寻址.最重要的一点是,class文件的类索引里面所有的信息都是直接排进去的,但是dex文件里面的类都是存的索引,dex文件更为紧凑.也就是意味着, 如果需要修改dex文件,那么他的成本会比修改class文件难得多

    90410发布于 2020-06-02
  • 来自专栏刘晓杰

    class文件字节解析

    本篇文章将介绍 .class 文件的结构,通过一个简单的例子认识 .class 文件。 首先写一个java文件(本人选择在Android平台,主要是接下来一篇会讲到dex文件,方便做对比) package com.example.liuxiaojie.smalietest; import 0000 1200 0200 0300 2200 2400 1900 0600 2200 2800 19 这里我全部贴出来了.可以看到都是由16进制数据组成.接下来,我们就可以根据一文让你明白Java字节来解析整个文件 类型) 0015(LocalVariableTable)0000 0016(22) 0002 (2个variable_info) 解析到这里其实已经差不多了,至少已经对class文件字节有所了解了 .可以看到,整个class文件字节都是一段一段对应好的了,每一块数据开始都是数据量,然后跟着数据,相对于dex文件而言,不用去查找偏移地址.下一篇会解析一下dex文件,解析完了就可以看到两者的区别

    66420发布于 2020-06-02
  • 来自专栏Java后端技术栈cwnait

    从java文件字节

    本文来说一下,我们开发好的.java文件是源码文件,并不能交给机器直接执行,需要将其变成字节甚至是机器文件。那么静态编译器是如何把源码转化成字节的呢? 下图为.java源码转化为字节的过程。 当语义分析完成之后,即可以生成字节字节必须通过类加载过程加载到JVM环境中后,才可以执行。 字节执行的三种模式 解释执行 JIT编译执行 JIT编译与解释混合执行(主流JVM默认模式) 何为JIT编译? JIT的作用就是将Java字节动态低编译成可以直接发送给处理器指令执行的机器。大致流程如下: ? 注意:解释执行与编译执行在线上环境微妙的辩证关系。

    1.3K20发布于 2019-09-10
  • 来自专栏韩曙亮的移动开发专栏

    【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节文件 | 准备 DEX 字节文件 )

    * 创建一个{@code-DexClassLoader}来查找解释的和本机的 * 密码解释类可以在包含的一组DEX文件中找到 * 在Jar或APK文件中。 main/java/dalvik/system/DexClassLoader.java DexClassLoader 构造函数 参数 : String dexPath : 要加载的 DEX 或 JAR 格式字节的路径 ---- 在 Android Studio 工程中 , 创建 Module , 并在其中 , 设置一个测试类 , 之后要使用 DexClassLoader 加载该 DEX 字节文件 , package com.example.dex_demo; import android.util.Log; /** * 测试 DEX 字节加载并执行 */ public class DexTest { 字节文件 ; 将该 DEX 文件拷贝到 主应用的 assets 目录下 ;

    80920编辑于 2023-03-30
  • 来自专栏各类技术文章~

    字节层面分析class类文件结构

    Java 提供了一种在所有平台上都能使用的一种中间代码--字节文件(*.class文件) 有了字节,无论哪种平台只要安装了虚拟机都可以直接运行字节 有了字节,解除了 Java 虚拟机和 Java ,使用 16 进制编辑器打开: 下面我们通过上图来一步步解析字节文件: 1、魔数 magic numebr 在 class 文件开头的四个字节是 class 文件的魔数,它是一个固定值 0XCAFEBABE 魔数是 class 文件的标志,它是判断一个文件是不是 class 格式文件的标准。 2、版本号 前两个字节 0000 代表 次版本号 minor_version。 常量池内部的表中也有表与表之间的相互引用,如下图: 16进制中的常量池大小 class 文件在常量池的前面使用 2个字节 的容量计数器,用来代表当前类中常量池的大小。 值 描述 ACC_PUBLIC 0x0001 public类型 ACC_FINAL 0x0010 被声明为final类型的类 ACC_SUPER 0x0020 是否允许使用invokespecial字节指令的新语义

    37400编辑于 2021-12-06
  • 来自专栏专注 Java 基础分享

    字节文件的内部结构之谜

    同一段 Java 程序在编译后生成的字节文件是唯一的,不会因为平台的不同而产生任何的变化。而同一段字节跑在不同实现的 JVM 上,会产生不同的机器指令。 而理解这个「字节文件结构就显得十分重要了,理解它是如何存储我们程序中的字段、方法、属性、局部变量、各种常量值等等,是学习虚拟机工作原理的基础。 那么,本文就来分析一下这个「字节文件,解开它的神秘面纱。 可以看到: [image] 这 17 个字节表述的 utf-8 字符串为:com/single/Person 我们手动的「翻译」了常量池中前两项,其实 Sun 公司为我们提供了工具帮我们计算字节文件中各个项目 总体上而言,所谓的字节文件,或者说 Class 文件就是编译器严格按照虚拟机规范生成的一串二进制,虚拟机在进行解析的时候也是严格按照虚拟机规范进行解析,这样就使得 Class 文件中所有的信息都能够被虚拟机读取解析

    1.6K90发布于 2018-03-17
  • 来自专栏Krains

    字节文件 Krains 2020-08-04

    javap -v -p MethodInnerStructTest.class 得到反编译字节文件,这些信息都会通过classloader加载到方法区当中,但在运行时方法区中还包含了加载该class 文件的classloader信息,当前只是反编译,没有经过classloader。 运行时常量池 VS 常量池 字节文件中含有常量池,里面有一些符号引用,clas文件加载到方法区之后,常量池就变成了运行时常量池。 为什么需要常量池 一个java源文件中的类、接口,编译后产生一个字节文件。 而Java中的字节需要数据支持,通常这种数据会很大以至于不能直接存到字节里,可以换另一种方式,可以存到常量池,这个字节包含了指向常量池的引用。

    34920发布于 2020-08-05
  • 来自专栏技术猫屋

    JVM字节学习笔记——class 文件结构

    0x01 前言 本系列学习笔记均来自《深入理解 JVM 字节》(作者:张亚),本笔记仅用于个人学习知识总结。 对于学习 java 安全、想了解 JVM 字节的童鞋们强烈建议购买正版书去阅读。 0x02 class 文件结构 java 是跨平台的一门语言,但是 jvm 却不是跨平台的,但是不同平台的 JVM 帮我们屏蔽了差异,通过 JVM 可以把源代码编译成和平台无关的字节,这样我们的源代码就不用根据不同平台编译成不同二进制是可执行文件了 这也是 java 字节的意义所在。 code_length和 code 用来表示字节相关的信息,code_length 存储了字节指令的长度,占用 4 个字节,虽然长度是4个字节(表面也就是说字节指令的长度可以达到2^32-1),但实际上 在code属性中存储了Java方法体经过编译后Java的字节指令,具体的字节指令可以不用强记,在使用的时候根据字节去查表就可以,具体可以参考:https://www.cnblogs.com/longjee

    69920编辑于 2023-01-03
  • 来自专栏CodeWwang

    修改混淆过的JAVA字节文件

    刚开始想直接将需要的class文件进行修改,发现这样一个问题,使用工具类将需要的位置字节参数修改完之后,将修改后的文件压缩回原来的JAR,JAR不能用了。 IDEA插件:jclasslib Bytecode viewer jclasslib bytecode viewer 是一个可以可视化已编译Java类文件和所包含的字节的工具。 另外,它还提供一个库,可以让开发人员读写Java类文件字节。 修改class文件  使用工具类修改class文件的的某个参数,或者某个字符串。这里有一点其实在java文件中定义的各种参数,编译成字节文件的时候,都变成了字符串,只是逻辑位置不同,处于不同的域中。 字节文件不能编辑,总不能修改16进制文件吧,那么答案只有一个,硬写进去,工具类如下: 大功告成,具体效果显而易见,自己可以在任何地方新建这样的java类,不过需要注意的是,这里有个工具jar包, jclasslib.jar

    1.5K20编辑于 2022-08-24
  • 来自专栏陈树义

    从 HelloWorld 看 Java 字节文件结构

    准确地说,Java 虚拟机与字节文件(Class文件)绑定。 Java类文件结构 Java 虚拟机规范中定义了许多规范,其中有一部分定义了字节的结构和规范。 「Hello World」的字节文件为例子,一步步分析这七部分内容。 这里 Demo 类的字节文件中,因为并没有实现任何接口,所以紧跟着父类索引后的两个字节是0x0000,这表示该类没有实现任何接口。因此后面的接口索引表为空。 因为我们并没有声明任何的类成员变量或类变量,所以在 Demo 的字节文件中,字段计数器为 00 00,表示没有属性字段。 Demo 类的字节文件中,方法计数器的值为 00 02,表示一共有 2 个方法。 第 1 个方法。

    1.8K70发布于 2018-04-13
  • 来自专栏对线JAVA面试

    JVM底层—Java Class字节文件解析

    前言 最近在研究Java的反射和动态代理,发现使用这两个Java神器需要了解.class文件字节。于是翻阅了相关资料,在这篇博客中进行一番整理,也作为自己学习的记录。 如何阅读class文件 Java的可移植性是基于.java文件编译后形成的唯一的字节文件.class文件可以在不同操作系统上的jvm运行的机制。. class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在.class文件中,中间没有任何分隔符。 常量池 魔数(magic number) & 版本号 每个.class文件的头四个字节被称为“魔数”,其作用是确定该.class文件是否为一个能被HOTSPOT虚拟机接收的.class文件 魔数后面的四个字节是版本号 Code属性 Java程序方法体内的代码经过javac编译处理之后,最终编程字节指令存储在Code属性内。这之后就涉及到了字节执行引擎的问题,之后会在其他的博客中进行讲解,敬请期待。

    62920编辑于 2022-10-27
  • 来自专栏做不甩锅的后端

    java类的class文件字节解析

    2.1 如何生成字节如何生成字节? 我们可以查看上述字节的二进制文件用16进制查看: ? 如果一个 class 文件的魔术不是 0xCAFEBABE,那么虚拟机将拒绝运行这个文件 次版本号(minor version):.class 文件的第 5 - 6 个字节,即编译生成该 .class 主版本号(major version):.class 文件的第 7 - 8个字节,即编译生成该 .class 文件的 JDK 主版本号。 字节的二进制文件对应表示为: CA FE BA BE 00 00 00 34 那么前面的cafebabe就是魔数,而0000 和0034则分别是主版本号和次版本号。

    1.2K20发布于 2021-08-06
  • 来自专栏IT当时语_青山师_JAVA技术栈

    字节文件魔数0xCAFEBABE

    字节文件魔数0xCAFEBABE 每一个java字节文件(.class)都是以相同的4字节内容开始的——十六进制的CAFEBABE。 咖啡宝贝…因缺思厅。。。 ; } } 这个魔数用来在类装载阶段时检查该文件是不是标准的java字节文件(当然这仅仅是第一关)。 我在重写一些文件格式代码,需要几个神奇的数字:一个用于持久对象文件,一个用于类。 我使用CAFEDEAD作为目标文件格式,并在“CAFE”(这似乎是一个很好的主题)之后添加了4个字符的十六进制单词,我找到了BABE并决定使用它。 因此CAFEBABE成为了类文件格式,CAFEDEAD成为了持久对象格式。但是持久对象工具消失了,随之而来的是CAFEDEAD的使用——它最终被RMI所取代。

    41210编辑于 2023-05-05
  • 来自专栏高级开发进阶

    JVM篇【Java源文件和Class字节文件对比】

    ,源文件名称就是我们Class文件属性表中的SourceFile属性。 (这个需要结合Class字节文件结构来看) image.png 字节结构有:魔数,副版本号,主版本号,常量池容量计数器,访问标志,类索引,父类索引,接口索引集合,字段表,方法表,属性表等。 拿魔数来说,它是用来区分文件类型的一种标志,会占用开头的4个字节,之所以需要魔数来区分文件类型,是因为文件名后缀容易被修改,所以为了保证文件的安全性,将文件类型写在文件内部可以保证不被篡改。 常量池后面就是访问标志,用两个字节来表示,其标识了类或者接口的访问信息,比如:这个.Class文件是类还是接口,是不是被定义成public,是不是abstract,如果是类,是不是被声明成final等。 在Java语言中字段是无法重载的,两个字段的数据类型,修饰符不管是否相同,都必须要有不一样的名称,但是对于字节文件来说,如果两个字段的描述符不一致,那这二个字段重名就是合法的。

    46730编辑于 2022-04-07
  • 来自专栏高级开发进阶

    JVM篇【Java源文件和Class字节文件对比】

    ,源文件名称就是我们Class文件属性表中的SourceFile属性。 (这个需要结合Class字节文件结构来看) 字节结构有:魔数,副版本号,主版本号,常量池容量计数器,访问标志,类索引,父类索引,接口索引集合,字段表,方法表,属性表等。 拿魔数来说,它是用来区分文件类型的一种标志,会占用开头的4个字节,之所以需要魔数来区分文件类型,是因为文件名后缀容易被修改,所以为了保证文件的安全性,将文件类型写在文件内部可以保证不被篡改。 常量池后面就是访问标志,用两个字节来表示,其标识了类或者接口的访问信息,比如:这个.Class文件是类还是接口,是不是被定义成public,是不是abstract,如果是类,是不是被声明成final等。 在Java语言中字段是无法重载的,两个字段的数据类型,修饰符不管是否相同,都必须要有不一样的名称,但是对于字节文件来说,如果两个字段的描述符不一致,那这二个字段重名就是合法的。

    48210编辑于 2022-09-29
领券