问题标签 [bytecode-manipulation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
167 浏览

java - 在执行特定指令之前记住 JVM 状态

我正在使用变异技术进行测试项目。我的项目需要操作 Java 类文件并多次重新执行类文件以进行测试。我的实现需要在一次操作后再次重新执行整个系统,这效率不高。我想知道是否可以在类文件中执行所需指令之前保存 JVM 状态,以便在每次操作后从该状态开始。

谢谢你。

0 投票
2 回答
2779 浏览

java - 控制行号时使用什么字节码库?

我需要从现有类生成新类(通过生成 java 字节码)。我将分析一个类的方法的主体(表达式)。表达式将决定我将生成什么代码。

对我来说,重要的是为新类设置源文件(与基本 java 文件相同)以及控制行号(当抛出异常时,堆栈跟踪应包含基本 java 文件的行号)。

示例:我有文件BaseClass.java。编译器由此生成一个BaseClass.class。我想分析这个类文件并为GeneratedClass.class 生成字节码。当在c处引发异常时,堆栈跟踪应包含“BaseClass.java line 3”。

我的问题:是否有支持此要求的库?Javassist、ASM 还是 BCEL?为此目的使用什么?提示如何做到这一点或示例代码将特别有帮助。

编辑: 提示不要使用什么库,因为无法满足要求也会有帮助:)。

0 投票
1 回答
838 浏览

java - 是否可以修改字节码并使用 javassist 保存?

我在网上找到的所有参考资料都说字节码可以在运行时修改,但我似乎没有发现修改后的字节码是否可以替换原始字节码。

这样,原始字节码可以被替换一次,其余时间使用增强后的字节码。

0 投票
3 回答
2997 浏览

java - 优化布尔逻辑树评估

我有很多真/假结果保存为long[]数组中的位。我确实有大量的这些(数以百万计的多头)。

例如,假设我只有五个结果,我会有:

我也确实有一些树代表如下语句:

树很简单,但很长。它们基本上看起来像这样(下面是过度简化,只是为了展示我所拥有的):

基本上,要么节点是叶子,然后有一个条件编号(匹配 long[] 数组中的一位),要么节点不是叶子,因此引用了几个子节点。

它们很简单,但允许表达复杂的布尔表达式。它工作得很好。

到目前为止一切顺利,一切正常。但是我确实有一个问题:我需要评估很多表达式,确定它们是真还是假。基本上我需要对一个没有比暴力破解更好的解决方案的问题进行一些暴力计算。

所以我需要走树并true根据false树的内容和long[].

我需要优化的方法是这样的:

在第一次调用时node是根节点,然后显然是子节点(递归,该solve方法调用自身)。

知道我只会有几棵树(可能多达一百个左右)但要检查数百万棵树long[],我可以采取哪些步骤来优化它?

显而易见的递归解决方案传递参数((子)树和long [],我可以通过不将其作为参数传递来摆脱long[]它)并且所有递归调用等都非常慢。我需要检查哪个运算符是使用(AND 或 OR 或 NOT 等),并且涉及到相当多的 if/else 或 switch 语句。

我不是在寻找另一种算法(没有),所以我不是在寻找从 O(x) 到 O(y),其中 y 小于 x。

我正在寻找的是“x 倍”加速:如果我可以编写执行速度提高 5 倍的代码,那么我将获得 5 倍的加速,仅此而已,我会很高兴的。

到目前为止,我看到的唯一增强——我认为与我现在相比,这将是一个巨大的“x 倍”加速——将为每棵树生成字节码,并将每棵树的逻辑硬编码到一个类中. 它应该工作得很好,因为我只会有一百多棵树(但树不是固定的:我无法提前知道树的外观,否则简单地手动对每棵树进行硬编码将是微不足道的)。

除了为每棵树生成字节码之外还有什么想法吗?

现在如果我想尝试字节码生成路线,我应该怎么做?

0 投票
2 回答
571 浏览

java - Asm 字节码查询

大家好,我正在尝试使用 ASM 字节码 Tree Api 对类进行静态分析。我想我有一个非常基本的问题。在一个说 foobar() 的方法中,我在 foobar 中有一个指令列表(InsnList 有一个列表)。现在我想检查是否在第 10 条指令处,是否调用了函数“barfoo(String args)”。

另外,我需要验证特定指令是否是条件指令。

谢谢和问候, SJ

注意:我已经可以阅读一个类并找到我感兴趣的特定方法并遍历该方法的每个指令。

解决(见:格雷格的评论):

0 投票
1 回答
1633 浏览

java - 变量定义和赋值检测asm字节码

我正在尝试使用 ASM 字节码树 API 对 Java 代码进行静态分析。我有一个 ClassNode cn、MethodNode m 和该方法中的指令列表说 InsnList 列表。

假设对于给定的指令(即 AbstractInsnNode)s,我需要在上述指令列表中找到变量 at 的所有定义/赋值。为了更清楚起见,假设在第 2 行定义并初始化了一个变量 var,然后在第 8 行分配了一些其他值,然后在第 12 行使用。在这种情况下,第 12 行是 my s。另外,假设中间的行中有很多条件代码。

这可能与ASM有关吗?如何??

谢谢和问候, SJ

为了清楚起见,

在这里,假设条件是 JumpInsnNode (当前指令),我需要查找是否(以及在哪里)条件中的任何变量(在这种情况下为 v.rank 和 numIter)在上述代码中的任何位置被修改或分配。保持简单,只是成员变量(没有静态函数或委托给另一个类的函数)。

0 投票
2 回答
301 浏览

java - 是否可以将 JVM 的汇编语言集成到标准的高级 Java 代码中?

我正在尝试将 Java 汇编代码(使用 Jasmin(Java 中的汇编器接口))与标准 Java 代码合并。像这样

这可能吗?

0 投票
7 回答
1617 浏览

java - 在没有源的已编译 1.6 Java 类中更改整数字段的最佳方法

使用 java 1.6 设置编译的类文件有两个字段,我需要将它们设置为更高的值。

不幸的是,我无法再访问正确版本的代码,只能拥有类文件。

这是我已经尝试过的:我一直在玩弄 BCEL、asm 和 javassist,但这似乎一点也不简单。我也找不到合适的字节码编辑器(jbe 看起来真的很混乱,类编辑器不显示 Integer 对象的值)。Eclipse 字节码类文件查看器在尝试保存时崩溃。使用十六进制编辑器来操作这些值是不可能的,因为它们将比现在有更多的数字。我还研究了 javap 并用 jasmin 重新编译它——这似乎是不可能的。

所以最终 - 拜托,哦,拜托 - 有没有人有一个很好的例子,如何以任何可以想象的方式做到这一点?

0 投票
3 回答
5749 浏览

c# - 在二进制文件中间插入字节

我想在图像元数据块的中间添加一些字符串。在一些特定的标记下。由于 .NET 不支持自定义元数据字段,因此我必须在字节级别上执行此操作。

该块的构建方式类似于1C 02 XX YY YY ZZ ZZ ZZ ...XX 是我需要附加的字段的 ID,YY YY 是它的大小,ZZ = data.

我想应该或多或少地读取所有图像数据直到这个标记(1C 02 XX)然后增加大小字节(YY YY),在 ZZ 的末尾添加数据,然后添加原始文件的其余部分? 它是否正确?

我应该如何继续下去?它需要尽可能快地处理 4-5 MB JPEG 文件。

0 投票
1 回答
3203 浏览

metadata - JPEG 文件大小标记、插入字节、IPTC 元数据

我有兴趣在字节级别手动将 IPTC 字段注入 JPG 文件。JPEG 文件具有多个带有可观大小标记的元数据段。IPTC 的分段容器是:

App13 - 以FF ED XX XX ..

8BIM IPTC 文本元数据 - 以38 42 49 4D 04 04 00 00 00 00 XX XX ..

IPTC字段以1C 02 50 XX XX ..(0x50 = 80, IPTC field #80) 开头。

(XX XX = 2 个字节的长度字描述所提到的段数据的大小)。

JPEG 文件和元数据中是否还有其他尺寸标记需要注意?在使用自定义 IPTC 字段附加元数据段时,我是否必须增加它们的大小?

如何添加适用于所有已包含 IPTC 段的 JPEG 图像的自定义元数据字段(例如 #225)?

在 C# 中工作,但这是一个关于字节操作的问题,所以我猜语言并不重要。