java字节码。。将icosnt_u替换为bipush<&燃气轮机;

java字节码。。将icosnt_u替换为bipush<&燃气轮机;,java,bytecode,Java,Bytecode,我试图理解为什么当我用bipush 20(1014)替换iconst_5(08)时,它不会工作。在这种情况下,是否可以将-1以外的整数设置为5 A7 00 07 goto pos.00000170 15 0E iload local.0E 08 iconst_5 6C idiv 36 16 istore local.16 2A

我试图理解为什么当我用bipush 20(1014)替换iconst_5(08)时,它不会工作。在这种情况下,是否可以将-1以外的整数设置为5

A7 00 07     goto                pos.00000170
15 0E        iload               local.0E
08           iconst_5
6C           idiv
36 16        istore              local.16
2A           aload_0
2B           iload_1
15 16        iload               local.16
B7 00 E9     invokespecial       void hui.surf.I.V.A(java.io.PrintWriter, int)
84 0F 01     iinc                local.0F, 1
以下是反编译的代码段:

enter code here
{       
 i6 = paramBoolean1 ? i4 / 2 : i4 / 5;
    A(paramPrintWriter, i6);
  }
我需要将整数5替换为20

如果我将08替换为10 14,则编辑器会这样做:

A7 00 07    goto                pos.00000170
15 0E   iload               local.0E
10 14   bipush              20
36 16   istore              local.16
2A  aload_0
2B  aload_1
15 16   iload               local.16
B7 00 E9    invokespecial       void hui.surf.I.V.A(java.io.PrintWriter, int)
84 0F 01    iinc                local.0F, 1
A7 FE F3    goto                pos.0000006F
这就是反编译代码的样子:(JDgui反编译器)


这里的问题是指令大小不同,因此更改它将打乱所有分支偏移


如果使用Krakatau,它将用标签替换所有数字偏移,从而更容易编辑。(披露:我写的)。从评论来看,ReJ似乎也能起作用。大多数工具都会这样做,因为这是汇编程序的常见行为。

很明显,较大的指令占用更多空间,因此会打乱跨代码区域的任何分支(如顶部的goto)。是否可以在字节码上插入新行。。。我正在使用dirtyJoe。。。它不插入新行,只编辑现有行。我对“dirtyJoe”一无所知。它的独立cpp是由字节码编辑器编写的。。您可以编辑并保存。类您是否尝试将指令的十六进制值设置为
10 14
(两个字节值之间有空格)?你确定不能直接在第三列中输入“bipush 20”吗?谢谢:)我确实浏览过github,但是你有下载链接吗,是独立用户界面吗?听起来这是最新的工具了。。读一下自述。。。mmm学习曲线。。。我也许值得用它。。需要时间。。更喜欢gui:)谢谢!很抱歉喀拉喀托有一点是不友好的。
{
  i6 = paramBoolean1 ? i4 / 2 : 20;
  A(paramPrintWriter, i6);
 }