有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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) 个答案

  1. # 1 楼答案

    这可以很容易地使用像Krakatau这样的反汇编器来完成(我写了这篇公开文章)

    与反编译器相比,使用反汇编器的优势在于它可以保证工作。不是所有的代码都可以反编译,但它总是可以反编译的

    例如,以这样一个类为例

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

    用喀拉喀托分解后,你会得到这样的东西

    .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

  2. # 2 楼答案

    获取反编译代码,编辑它,编译它,然后使用它

    我会认真考虑删除这个系统。gc()