LINUX.ORG.RU

Reverse ingenering и proprietary software


0

0

Приветствую всех.

Есть: программа под винду, сетевой клиент. Исходников нет. Протокол передачи "свой", закрытый.
Задача: узнать максимум о протоколе передачи данных между клиент-сервером и написать open-source аналог клиента пока под GNU\Linux.

Поделитесь, пожалуйста, ссылками на тему. Подозреваю, что программа использует secure socet layer(ssl). Более чем уверен, что Сообщество уже писало о обратной разработке коммерческого софта, но пока ничего толкового найти не смог.

anonymous

Ответ на: комментарий от klalafuda

>берётся wireshark (в девичестве ethereal) и вперёд и с песнею

Если действительно

>программа использует secure socet layer(ssl)

то не сильно поможет, разве что через прокси пустить.

А так, взять IDA (предыдущую версию можно задаром) и попытаться выяснить что к чему. Вот тут www.openrce.org по тему есть хорошие статьи и ссылки на хорошие книжки по теме.

Dima_Ky
()

Одно но: все усложняется тем, что программа построена на Java.. Быть может есть возможность реализовать прослойку м/у JVM и JByte Cod'ом? Есть Open-Source JVM?

anonymous
()
Ответ на: комментарий от Dima_Ky

> А так, взять IDA (предыдущую версию можно задаром) и попытаться выяснить что к чему. Вот тут www.openrce.org по тему есть хорошие статьи и ссылки на хорошие книжки по теме.

а если там бинарник на десятки мегабайт и разлапистый как клюква протокол, IDA будет более чем "уместна". как раз задачка на пару лет :-/

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от phoenix

> декомпильнуть, не? Хотя если еще заобфускачили, то это вряд ли поможет.

$ size Xorg
   text    data     bss     dec     hex filename
1738026   64788   65816 1868630  1c8356 Xorg
$ objdump -d Xorg | wc -l
389321

вперёд, пионерия! глядишь, к новому году управитесь. следующему.

ps: и это далеко не самое сложное и большое сетевое приложение.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

> Одно но: все усложняется тем, что программа построена на Java.. Быть может есть возможность реализовать прослойку м/у JVM и JByte Cod'ом?

Если программа построена на Java, то обыкновенно ее можно декомпилировать, если не применялись обфускаторы кода. Вот тут есть ссылки на разные http://www.google.com/Top/Computers/Programming/Languages/Java/Development_To....

> Есть Open-Source JVM?

JVM от сана вроде как под гпл ...

> А так, взять IDA (предыдущую версию можно задаром) и попытаться выяснить что к чему. Вот тут www.openrce.org по тему есть хорошие статьи и ссылки на хорошие книжки по теме.

> а если там бинарник на десятки мегабайт и разлапистый как клюква протокол, IDA будет более чем "уместна". как раз задачка на пару лет :-/

Зачем все рисовать так депрессивно. Я ^лично^ сомневаюсь, что на данный момент существует протокол, реализация которого занимает хотя бы десяток мегабайт бинарного кода. Даже если сам бинарник занимает десятки мегабайт, локализировать часть ответственную за обработку сетевого протакола не такая уж и сложная задача.

Dima_Ky
()
Ответ на: комментарий от klalafuda

не в ассемблерный же код. Для джавы существуют нормальные декомпиляторы (jad, например), которые могут восстановить код с точностью по имен переменных.

phoenix ★★★★
()
Ответ на: комментарий от anonymous

>Одно но: все усложняется тем, что программа построена на Java.

Усложняется??? Наоборот, это радикально упрощает дело.

Как уже говорили, берете jad и декомпилируете. Он порой хлам всякий выдает, но в целом смысл кода обычно понятен.

Если заобфускачен код — не беда. Либо всё таки пытаешься понять, что он делает (начиная от сокетов), либо доводишь до компилируемого состояния и рефакторингом в IDE понемногу приводишь переменные к нормальным именам (начиная опять же от сокетов).

Вообще, защитить Java-приложение от реверс инжиниринга практически нереально. Сколько я их разбирал — ни разу каких-то сверхсложностей не было.

WFrag ★★★★
()

[голос из зала] а жабоклиент, вероятно, можно и под linux запустить...

anonymous
()
Ответ на: комментарий от WFrag

>Вообще, защитить Java-приложение от реверс инжиниринга практически нереально. Сколько я их разбирал — ни разу каких-то сверхсложностей не было.

+1, к тому же обфускацию применяют в основном только для j2me (она нехило уменьшает размер)

generatorglukoff ★★
()
Ответ на: комментарий от Dima_Ky

> Даже если сам бинарник занимает десятки мегабайт, локализировать часть ответственную за обработку сетевого протакола не такая уж и сложная задача.

Не знаете, а Skype уже полностью расшифровали и научились блокировать?

anonymous
()
Ответ на: комментарий от anonymous

> Не знаете, а Skype уже полностью расшифровали и научились блокировать?

Не знаю.

Dima_Ky
()
Ответ на: комментарий от anonymous

>Не знаете, а Skype уже полностью расшифровали и научились блокировать?

AFAIK, научились блокировать и даже использовать клиентов в корыстных целях (например, пинговать машины за NAT-ом).

Но что-то не могу ссылку найти, не помню где я её видел.

WFrag ★★★★
()

С помошью снифера удалось прослушать трафик. Программа сливает при каждом запуске .class файлы. Слил и я их(более 100). Ни один дизассемблер не хочет их дизассемблировать(пробовал jad, DJ Java.., должно сказать, что тестил пока только Windows дизассемблеры). IDA так же, не берет.

Сама софтина реализована в виде exe, в котором создается отдельный поток и запускается JVM. Разбирать весь бинарник для меня пока затруднительно(но, чувствую придется много читать =). Какие есть еще идеи?

На текущий момент есть: снифаный протокол, не используется ssl. На крайняк, поделитесь, пожалуйста, идеями по дизассемблированию exe-шника(маны, подсказки..).

Strace под виндой ничего не дал, под ним она даже не стартанула второй(?) поток с JVM

anonymous
()
Ответ на: комментарий от anonymous

>С помошью снифера удалось прослушать трафик. Программа сливает при каждом запуске .class файлы. Слил и я их(более 100). Ни один дизассемблер не хочет их дизассемблировать(пробовал jad, DJ Java.., должно сказать, что тестил пока только Windows дизассемблеры). IDA так же, не берет.

Это какие-то неправильные файлы. Можешь куда-нибудь выложить 1 штучку для примера?

WFrag ★★★★
()

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

Действия:
$ cat /tmp/test.java
import java.io.*; 
class MyFirstProgram {
  /** Print a hello message */ 
  public static void main(String[] args) { 
    BufferedReader in = 
        new BufferedReader(new InputStreamReader(System.in)); 
    String name = "Instructor"; 
    System.out.print("Give your name: "); 
    try {name = in.readLine();}
        catch(Exception e) {
           System.out.println("Caught an exception!"); 
        }
    System.out.println("Hello " + name + "!"); 
  }
}

$ gcj /tmp/test.java --main=MyFirstProgram -ggdb
$ ./jrevpro a.out

вывыливается с 

Exception in thread "main" java.lang.NoClassDefFoundError: jreversepro.JCmdMain
   at gnu.java.lang.MainThread.run(libgcj.so.90)
Caused by: java.lang.ClassNotFoundException: jreversepro.JCmdMain not found in gnu.gcj.runtime.SystemClassLoader{urls=[], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}
   at java.net.URLClassLoader.findClass(libgcj.so.90)
   at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.90)
   at java.lang.ClassLoader.loadClass(libgcj.so.90)
   at java.lang.ClassLoader.loadClass(libgcj.so.90)
   at gnu.java.lang.MainThread.run(libgcj.so.90)

Что делаю не так? 

anonymous
()
Ответ на: комментарий от WFrag

н-дя.. спасибо за попытку.. придется копать exe. P.S.: Один вопрос: почему мой тестовый пример не декомпилируется?

anonymous
()
Ответ на: комментарий от anonymous

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

WFrag ★★★★
()
Ответ на: комментарий от anonymous

>>почему мой тестовый пример не декомпилируется?

потому что gcj. У тебя даже дизассемблер не запускается.

А файл, действительно, не дизассемблируется. И вообще на .class не похож. Видать, и впрямь, зашифрован. Или .class'ом обозван для отвода глаз :) Или еще чего-нибудь. Короче, удачи тебе :)

anonymous
()
Ответ на: комментарий от anonymous

> С помошью снифера удалось прослушать трафик. Программа сливает при каждом запуске .class файлы. Слил и я их(более 100). Ни один дизассемблер не хочет их дизассемблировать(пробовал jad, DJ Java.., должно сказать, что тестил пока только Windows дизассемблеры). IDA так же, не берет.

Файл на рапидшаре, точно не байткод, энтропия почти одинаковая на протяжении всего файла, даже ничего похожего на зоголовок нет. Выглядид как кусок из сжатого, зашифрованого файла.

>Сама софтина реализована в виде exe, в котором создается отдельный поток и запускается JVM. Разбирать весь бинарник для меня пока затруднительно(но, чувствую придется много читать =). Какие есть еще идеи?

Найти где создается виртуальная машина, посмотреть как приложение это делает (какие аргументы передает). К этому моменту байткод уже должен быть расшифрован (распакован) и готов к употреблению. Запуск вирт машины документирован, найти это место довольно просто.

Dima_Ky
()
Ответ на: комментарий от Dima_Ky

>Файл на рапидшаре, точно не байткод, энтропия почти одинаковая на протяжении всего файла, даже ничего похожего на зоголовок нет. Выглядид как кусок из сжатого, зашифрованого файла.

О, а чем энтропию смотреть?

WFrag ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.