2012-01-21 8 views
0

Я использовал декомпилятор, чтобы найти следующую функцию в скомпилированный код:Как редактировать скомпилированный байт-код 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".

Какие инструменты и/или методы могут быть использованы для внесения этого изменения?

+1

использование, dcomplier Java. – Lucifer

+1

Проверка http://stackoverflow.com/questions/2395574/java-bytecode-editor –

ответ

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', собрать его, и теперь он будет печатать ложь вместо истины.

-1

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

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

+0

-1 Повторная компиляция декомпилированного кода не работает, за исключением простейших случаев, поскольку декомпиляция не является точной и обе эти шаги являются потерями. – Antimony

+0

@ Anthony Немного сильны, чтобы сказать, что это не работает, когда это происходит в большинстве случаев. Это не так сложно, как вы предполагаете. –

+0

Я полагаю, это зависит от того, с каким типом приложения вы имеете дело. По моему опыту, он редко работает. – Antimony