Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Декомпиляция java / 19 сообщений из 19, страница 1 из 1
10.11.2011, 23:36:11
    #37520995
drewha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
После декомпиляции получается некорректный код, пробовал разными декомпиляторами.
Почему так получается?

Код: 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
10.11.2011, 23:40:13
    #37520999
drewha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
Класс взят из рабочего приложения, т.е. корректный скорее всего.
Можно ли его корректно декомпилировать?
...
Рейтинг: 0 / 0
11.11.2011, 00:09:42
    #37521024
The_ShadoW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
Код, очевидно, обфусцирован.
Пользуйтесь де-обфускатором, чтоб вернуть непересекающиеся имена методам.
...
Рейтинг: 0 / 0
11.11.2011, 00:48:24
    #37521063
drewha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
Спасибо, помогло.
Получается, это баг в декомпиляторе?
...
Рейтинг: 0 / 0
11.11.2011, 00:50:23
    #37521065
eros2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
drewhaПочему так получается?
Потому что специально так сделали (обфусцировали) чтоб не декомпилировали.)) Очевидно же.))
...
Рейтинг: 0 / 0
11.11.2011, 01:03:11
    #37521081
drewha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
eros2Потому что специально так сделали (обфусцировали) чтоб не декомпилировали.)) Очевидно же.))
То что специально, это понятно.
Просто по идее декомпилятор должен давать такой код, чтобы его можно было обратно скомпилировать.
...
Рейтинг: 0 / 0
11.11.2011, 01:26:06
    #37521104
The_ShadoW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
Только не для явы.
В частности, ни один из имеющихся декомпиляторов не способен адекватно бороться с generics, а некоторые -- и на енумах фейлят.

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

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

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

public Class A{

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

Можно ли вызвать конкретный метод? У меня получается только первый.
Т.е. Object obj = [instance of A].a() возвращает int, а мне нужно Enumeration.
...
Рейтинг: 0 / 0
09.02.2012, 14:01:45
    #37653694
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
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
09.02.2012, 14:05:36
    #37653710
drewha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
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
06.03.2012, 16:28:41
    #37693825
drewha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
В обфусцированном классе несколько полей с одинаковым именем без уровня доступа (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
06.03.2012, 16:38:01
    #37693851
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
setAcessible(true) пробовали?
...
Рейтинг: 0 / 0
06.03.2012, 16:41:23
    #37693865
drewha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
забыл никsetAcessible(true) пробовали?
Да. В этом случае ошибка
Can not set [Ljava.lang.Object; field java.util.Vector.elementData to GetFieldValueByClass
...
Рейтинг: 0 / 0
06.03.2012, 16:52:18
    #37693891
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
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
06.03.2012, 16:53:29
    #37693897
rfq
rfq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
Код: 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
06.03.2012, 16:59:50
    #37693913
drewha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Декомпиляция java
[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
Форумы / Java [игнор отключен] [закрыт для гостей] / Декомпиляция java / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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