powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Декомпиляция java
19 сообщений из 19, страница 1 из 1
Декомпиляция java
    #37520995
drewha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
После декомпиляции получается некорректный код, пробовал разными декомпиляторами.
Почему так получается?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
 public   final   class  z
{

     public  z(String s,  char  ac[],  boolean  flag)
    {
        a_java_lang_String_fld = s;
        a_char_array1d_fld = ( char [])( char [])ac.clone();
        a_boolean_fld = flag;
    }

     public  String a()
    {
         return  a_java_lang_String_fld;
    }

     public   char [] a()
    {
         return  a_char_array1d_fld;
    }

     public   boolean  a()
    {
         return  a_boolean_fld;
    }

     private  String a_java_lang_String_fld;
     private   char  a_char_array1d_fld[];
     private   boolean  a_boolean_fld;
}

...
Рейтинг: 0 / 0
Декомпиляция java
    #37520999
drewha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Класс взят из рабочего приложения, т.е. корректный скорее всего.
Можно ли его корректно декомпилировать?
...
Рейтинг: 0 / 0
Декомпиляция java
    #37521024
The_ShadoW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код, очевидно, обфусцирован.
Пользуйтесь де-обфускатором, чтоб вернуть непересекающиеся имена методам.
...
Рейтинг: 0 / 0
Декомпиляция java
    #37521063
drewha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, помогло.
Получается, это баг в декомпиляторе?
...
Рейтинг: 0 / 0
Декомпиляция java
    #37521065
eros2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
drewhaПочему так получается?
Потому что специально так сделали (обфусцировали) чтоб не декомпилировали.)) Очевидно же.))
...
Рейтинг: 0 / 0
Декомпиляция java
    #37521081
drewha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eros2Потому что специально так сделали (обфусцировали) чтоб не декомпилировали.)) Очевидно же.))
То что специально, это понятно.
Просто по идее декомпилятор должен давать такой код, чтобы его можно было обратно скомпилировать.
...
Рейтинг: 0 / 0
Декомпиляция java
    #37521104
The_ShadoW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только не для явы.
В частности, ни один из имеющихся декомпиляторов не способен адекватно бороться с generics, а некоторые -- и на енумах фейлят.

Код, написанный с активным использованием generics сложно декомпилировать до рабочего состояния даже если он не обфусцирован.

ЗЫ: Ну и commercial-grade обфускация тоже превратит его в кусок не пойми чего, что надо будет допиливать ручками просто для того, чтоб оно компилировалось обратно. То, с чем Вы имеете дело -- это примитивненько.
...
Рейтинг: 0 / 0
Декомпиляция java
    #37521112
The_ShadoW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЗЫ: Сделать эквивалентные обратные преобразования не всегда возможно, потому что определенные проверки-ограничения налагаются на код только при компиляции. Т.е. вполне существует исходный код, байт-код которого будет корректно исполняться JVM, но который не пройдёт компиляцию стандартным компилятором. Например, JVM не налагает никаких ограничений на идентификаторы классов, полей и методов (а компилятор -- налагает). Поэтому, например, обфускатором можно легко переименовать всё в зарезервированные слова. И при декомпиляции потом будет --
Код: plaintext
1.
2.
3.
4.
5.
6.
 public   class   class  {
   private   boolean   boolean ;
  
   class  ( boolean   boolean ) {
     this . boolean  =  boolean ;
  }
}
И т.д.
...
Рейтинг: 0 / 0
Декомпиляция java
    #37521164
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_ShadoWЗЗЫ: Сделать эквивалентные обратные преобразования не всегда возможно, потому что определенные проверки-ограничения налагаются на код только при компиляции. Т.е. вполне существует исходный код, байт-код которого будет корректно исполняться JVM, но который не пройдёт компиляцию стандартным компилятором. Например, JVM не налагает никаких ограничений на идентификаторы классов, полей и методов (а компилятор -- налагает). Поэтому, например, обфускатором можно легко переименовать всё в зарезервированные слова. И при декомпиляции потом будет --
Код: plaintext
1.
2.
3.
4.
5.
6.
 public   class   class  {
   private   boolean   boolean ;
  
   class  ( boolean   boolean ) {
     this . boolean  =  boolean ;
  }
}
И т.д.Круто!!!
...
Рейтинг: 0 / 0
Декомпиляция java
    #37522370
drewha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_ShadoW,

Спасибо. Теперь все стало понятно.
...
Рейтинг: 0 / 0
Декомпиляция java
    #37653563
drewha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В обфусцированном классе несколько методов с одинаковым именем и набором параметров.

public Class A{

public int a(){..}
...
public Enumeration a(){..}
...
}

Можно ли вызвать конкретный метод? У меня получается только первый.
Т.е. Object obj = [instance of A].a() возвращает int, а мне нужно Enumeration.
...
Рейтинг: 0 / 0
Декомпиляция java
    #37653694
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drewha,
Не проверял.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Method ma=null;
for(Method m:A.class.getDeclaredMethods()){
   if("a".equals(m.getName()) && Enumeration.class==m.getReturnType()){
      ma=m;
      break;
   }
}
Enumeration enum=ma.invoke([instance of A], null); 
...
Рейтинг: 0 / 0
Декомпиляция java
    #37653710
drewha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0FDdrewha,
Не проверял.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Method ma=null;
for(Method m:A.class.getDeclaredMethods()){
   if("a".equals(m.getName()) && Enumeration.class==m.getReturnType()){
      ma=m;
      break;
   }
}
Enumeration enum=ma.invoke([instance of A], null); 



Спасибо. Это то, что нужно.
...
Рейтинг: 0 / 0
Декомпиляция java
    #37693825
drewha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В обфусцированном классе несколько полей с одинаковым именем без уровня доступа (packge-access или как-то так). Можно ли как-нибудь достать значение конкретного поля, добавив какой-нибудь метод (ч/з Instrumentation например)?
Такой код не работает:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class GetFieldValueByClass {

    Object obj1;
    int int1;
    int int2;
    boolean boolean1;

    public GetFieldValueByClass(Object arg1, int arg2, int arg3, boolean arg4){
        this.obj1 = arg1;
        this.int1 = arg2;
        this.int2 = arg3;
        this.boolean1 = arg4;
    }
    
    public Object getFieldValueByClass(java.lang.Class c) throws java.lang.IllegalAccessException {
        for (java.lang.reflect.Field f : c.getDeclaredFields()) {
            Object obj = f.get(this); 
            if (obj.getClass() == f.getType()) {
                return obj;
            }
        };
        return null;
    }
}



Добавленный метод - getFieldValueByClass, валится в строке Object obj = f.get(this); с
can not access a member of class java.util.Vector with modifiers "protected"
при вызове с параметром java.util.Vector.class.

P.S. После обфускации все имена полей одинаковые.
...
Рейтинг: 0 / 0
Декомпиляция java
    #37693851
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
setAcessible(true) пробовали?
...
Рейтинг: 0 / 0
Декомпиляция java
    #37693865
drewha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никsetAcessible(true) пробовали?
Да. В этом случае ошибка
Can not set [Ljava.lang.Object; field java.util.Vector.elementData to GetFieldValueByClass
...
Рейтинг: 0 / 0
Декомпиляция java
    #37693891
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drewhaВ обфусцированном классе несколько полей с одинаковым именем без уровня доступа (packge-access или как-то так). Можно ли как-нибудь достать значение конкретного поля, добавив какой-нибудь метод (ч/з Instrumentation например)?
Такой код не работает:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class GetFieldValueByClass {

    Object obj1;
    int int1;
    int int2;
    boolean boolean1;

    public GetFieldValueByClass(Object arg1, int arg2, int arg3, boolean arg4){
        this.obj1 = arg1;
        this.int1 = arg2;
        this.int2 = arg3;
        this.boolean1 = arg4;
    }
    
    public Object getFieldValueByClass(java.lang.Class c) throws java.lang.IllegalAccessException {
        for (java.lang.reflect.Field f : c.getDeclaredFields()) {
            Object obj = f.get(this); 
            if (obj.getClass() == f.getType()) {
                return obj;
            }
        };
        return null;
    }
}



Добавленный метод - getFieldValueByClass, валится в строке Object obj = f.get(this); с
can not access a member of class java.util.Vector with modifiers "protected"
при вызове с параметром java.util.Vector.class.

P.S. После обфускации все имена полей одинаковые.

Да. В этом случае ошибка
Can not set [Ljava.lang.Object; field java.util.Vector.elementData to GetFieldValueByClass



Вы взяли список полей(c.getDeclaredFields()) у класса java.util.Vector, а значения этих полей у обьекта класса GetFieldValueByClass. Херня.
...
Рейтинг: 0 / 0
Декомпиляция java
    #37693897
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public Object getFieldValueByClass(java.lang.Class c) throws java.lang.IllegalAccessException {
        for (java.lang.reflect.Field f : c.getDeclaredFields()) {
            Object obj = f.get(this); 
            if (obj.getClass() == f.getType()) {
                return obj;
            }
        };
        return null;
    }


Вы чего хотите? Считать поле из объекта? А где сам объект? Вместо него вы пытаетесь считать из текущего объекта ( f.get(this);) но как будто класс у него "c" (поданный параметром).
...
Рейтинг: 0 / 0
Декомпиляция java
    #37693913
drewha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot 0FD]drewhaВ обфусцированном классе несколько полей с одинаковым именем без уровня доступа (packge-access или
Вы взяли список полей(c.getDeclaredFields()) у класса java.util.Vector, а значения этих полей у обьекта класса GetFieldValueByClass. Херня.

Да уж, бывает..
Спасибо!
Этот вариант работает:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public Object getFieldValueByClass(java.lang.Class c) throws java.lang.IllegalAccessException {
        for (java.lang.reflect.Field f : this.getClass().getDeclaredFields()) {
            Object obj = f.get(this);
            if (obj instanceof java.util.Vector) {
                return obj;
            }
        };
        return null;
    }
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Декомпиляция java
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]