Как вы редактируете скомпилированный байт-код Java? - PullRequest
0 голосов
/ 21 января 2012

Я использовал декомпилятор для поиска следующей функции в скомпилированном коде:

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 голос
/ 14 апреля 2013

Это легко сделать, используя дизассемблер, например Кракатау (раскрытие, я написал).

Преимущество использования дизассемблера перед декомпилятором заключается в том, что он гарантированно работает.Не весь код может быть декомпилирован, но он всегда может быть разобран.

Например, возьмите такой класс.

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

После разборки его с помощью Кракатау вы получите что-то вродеthis.

.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.

0 голосов
/ 21 января 2012

Возьмите декомпилированный код, отредактируйте его, скомпилируйте и используйте вместо этого.

Я бы серьезно подумал об удалении System.gc ();

...