你如何编辑编译的Java字节码?

时间:2012-01-21 04:50:18

标签: java bytecode

我使用反编译器在编译代码中找到以下函数:

public static void sub_e5b()
    {
        var_972 = null;
        System.gc();
        vservConfigHashTable = new Hashtable();
        vservConfigHashTable.put("appId_end", "498");
        vservConfigHashTable.put("showAt", "both");
        vservConfigHashTable.put("categoryId", "22");
        vservConfigHashTable.put("viewMandatory_end", "true");
        (new VSERV_BCI_CLASS_000(var_93a, vservConfigHashTable)).showAtEnd();
    }

现在我想将"true"值更改为"false"

可以使用哪些工具和/或技术进行此更改?

2 个答案:

答案 0 :(得分:1)

这可以使用像Krakatau这样的反汇编程序轻松完成(披露,我写了)。

在反编译器上使用反汇编程序的优点是它可以保证工作。并非所有代码都可以反编译,但它总是可以反汇编。

例如,参加这样的课程。

public class A{
    public static void main(String[] args)
    {
        System.out.println("true");
    }
}

与Krakatau拆解后,你会得到类似的东西。

.version 51 0
.class super public A
.super java/lang/Object


.method public <init> : ()V
    .limit stack 1
    .limit locals 1
    aload_0
    invokespecial java/lang/Object <init> ()V
    return
.end method

.method static public main : ([Ljava/lang/String;)V
    .limit stack 2
    .limit locals 1
    getstatic java/lang/System out Ljava/io/PrintStream;
    ldc 'true'
    invokevirtual java/io/PrintStream println (Ljava/lang/String;)V
    return
.end method

将行ldc 'true'更改为ldc 'false',重新组合,现在将打印为false而不是true。

答案 1 :(得分:-1)

获取反编译代码,编辑代码,编译代码并使用它。

我会认真考虑删除System.gc();