Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> disambiguate identifier 
V
    Опции темы
leniviy
Дата 18.10.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Привет! Есть один obfuscated jar, в котором классы, методы и поля переменованы так:
a.class, b.class 
public static String a;
public static Integer b;
итд. 

Код

a.java:
public class a {
 public static void a() {}
}

b.java:
public class b {
 public void a() {}
}

c.java:
public class c {
 b a;
 void foo() {
  // disambiguate pls
  a.a(); // call static method of class "a"
    //    0    0:invokestatic    #15  <Method void a.a()>
  a.a(); // call method of field "a"
    //    0    0:aload_0         
    //    1    1:getfield        #17  <Field b a>
    //    2    4:invokevirtual   #19  <Method void b.a()>
 }
}


При декомпиляции появляется двусмысленность, в лучшем случае ошибка, в худшем - всё компилируется, но не работает
И да, все классы в default package

Добавлено @ 14:31
Второй вопрос: если есть тулзина, которая может массово переименовывать идентификаторы в .class файлах, например так:
Код

public class a {
  class b {
 }
 int c;
}

->
Код

public class a {
  class b_inner {
 }
 int c_field;
}



Это сообщение отредактировал(а) leniviy - 21.10.2010, 17:32
PM MAIL   Вверх
niasilil
Дата 21.10.2010, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: нет
Всего: 9



Код

  a.a(); // call static method of class "a"
  a.a(); // call method of field "a"
если код так обфускировали, то он уже поломан и фиг ты его поправишь. Потому что обе строчки в байт коде вызывают один и тот же метод. А твой декомпилятор просто переводит байт код в читаемый вид. 
ИМО


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
leniviy
Дата 21.10.2010, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



не, там байткоды разные.
Код

        a.a();
    //    0    0:invokestatic    #15  <Method void a.a()>
        a.a();
    //    0    0:aload_0         
    //    1    1:getfield        #17  <Field b a>
    //    2    4:invokevirtual   #19  <Method void b.a()>

PM MAIL   Вверх
niasilil
Дата 21.10.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: нет
Всего: 9



а какой декомпилятор? может его сменить? 


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
leniviy
Дата 21.10.2010, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



jad. Кроме этой проблемы с:
* private inner classes
* большие switch-case
* сложные try {}

Это сообщение отредактировал(а) leniviy - 21.10.2010, 17:48
PM MAIL   Вверх
niasilil
Дата 21.10.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: нет
Всего: 9



хмм, может ключик какой при декомпиляции использовать
http://www.mobilefish.com/developer/jad/jad.html

-safe

(это я теоретизирую)


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
leniviy
Дата 23.10.2010, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



http://java.decompiler.free.fr/ в моем случае показал лучший результат по try {}  и switch-case

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

        ((a)null).a(); // a.a();
    //    0    0:invokestatic    #15  <Method void a.a()>
        <Текущий класс>.a.a(); // a.a();
    //    0    0:aload_0         
    //    1    1:getfield        #17  <Field b a>
    //    2    4:invokevirtual   #19  <Method void b.a()>



Это сообщение отредактировал(а) leniviy - 23.10.2010, 12:07
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java tools & IDE's | Следующая тема »


 




[ Время генерации скрипта: 0.0752 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.