Защита от декомпиляторов
От: cppnick  
Дата: 06.02.12 20:53
Оценка:
В этом плане что-то изменилось в свете последних лет?

Интересует Java, C#. Или, как и прежде, обфускаторы?

Чем ещё сейчас покрывают софт. Есть ли какие виртуальные машины под означенные языки? Хотя VMP тоже не панацея — выдрал её с кишками, скормил байткод и получил то, что надо. Или я что-то упускаю?

ЗЫ: если ошибся форумом, перетащите.
Re: Защита от декомпиляторов
От: мыщъх США http://nezumi-lab.org
Дата: 06.02.12 21:11
Оценка:
Здравствуйте, cppnick, Вы писали:

C>В этом плане что-то изменилось в свете последних лет?

C>Интересует Java, C#. Или, как и прежде, обфускаторы?
скажу за java, т.к. декомпилирую программы каждый день. простые трюки ослепляют существующие декомпиляторы и приводят к тому, что они или выдают дизассемблерный листнг или же теряют часть кода. например, вот:


private static String c(String paramString)
  {
    char[] arrayOfChar = paramString.toCharArray();
    int i1 = arrayOfChar.length;
    for (int i2 = 0; i2 < i1; i2++)
    {
      switch (i2 % 5)
      {
      case 0:
        break;
      case 1:
        break;
      case 2:
        break;
      case 3:
        break;
      }
      70[41] = (char)(0x2F ^ 0x3E);
    }
    return new String(arrayOfChar);
  }
}


вам не кажется, что декомпилированный код... гм... несколько нелогичный?


C> Или я что-то упускаю?

от чего вы защищаетесь? от декомпиляции с повторной компиляцией или у вас секретный алгоритм, который необходимо скрыть.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[2]: Защита от декомпиляторов
От: cppnick  
Дата: 06.02.12 21:32
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>от чего вы защищаетесь? от декомпиляции с повторной компиляцией или у вас секретный алгоритм, который необходимо скрыть.

Второе. В меньшей степени первое. Если вкрадце, то это закрытый сетевой протокол, и не хотелось бы, чтобы он стал "открытым". Сниффером его не взять, не зная алгоритма, а вот вскрыть мобильные клиенты на раз можно при желании (буквально вчера за 2 часа вскрыл алгоритм в одной обфусцированной проге), поэтому хотелось бы максимально затруднить это.

M>Простые трюки ослепляют существующие декомпиляторы

И куда копать? Гуглить "jad bugs"? Хотя достаточно просто пинка в нужном направлении для понимания, в какую сторону копать дальше.
Re[3]: Защита от декомпиляторов
От: мыщъх США http://nezumi-lab.org
Дата: 06.02.12 21:50
Оценка: 12 (3) +1
Здравствуйте, cppnick, Вы писали:

C>Здравствуйте, мыщъх, Вы писали:


М>>от чего вы защищаетесь? от декомпиляции с повторной компиляцией или у вас секретный алгоритм, который необходимо скрыть.

C>Второе. В меньшей степени первое.
тогда проблема решается путем трансляции исходного кода на java в исходный код на java, но... в машину состояний. если хватает производительности -- компилируйте в брайфак или машину тьюринга. если производительности не хватает -- компилируйте в DFA-дерево. во-первых, так даже быстрее, чем на чистой java, во-вторых, декомпилировать DFA-дерево возьмется только гений или безумец. тем более, что копиляторов для java чуть больше чем до фига.

> (буквально вчера за 2 часа вскрыл алгоритм в одной обфусцированной проге),

> поэтому хотелось бы максимально затруднить это.
большинство обфускаторов или разбавляют код мусором (который легко удалить) или шифруют строки в пуле констант (но все обсускаторы, которые видел, снимаются статической дешифровкой) или же шифруют код, а затем в процессе запуска расшифровывают его и передают управление (это вообще элементарно отлавливается). к тому же ни один известный мне обфускатор не сопротивляется динамическому анализу (виртуальную машину попросили логгировать все инструкции, а затем загнали все это на граф, свернули циклы и выкинули мусор -- для получения компилируемого кода такой метод не очень хорош, но для анализа алгоритма -- вполне).

а вот DFA-деревья это попа. реконструкция логики крайне трудоемка.

M>>Простые трюки ослепляют существующие декомпиляторы

C>И куда копать? Гуглить "jad bugs"? Хотя достаточно просто пинка
C>в нужном направлении для понимания, в какую сторону копать дальше.
вот тут неплохая презентация на тему: http://www.inreverse.net/?p=1687
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[4]: Защита от декомпиляторов
От: nen777w  
Дата: 07.02.12 14:49
Оценка: 1 (1)
Заинтересовался. Что это вообще за такие DFA деревья, гуглил на англ. и рус. ничего путного не смог найти.
Re[4]: Защита от декомпиляторов
От: A13x США  
Дата: 07.02.12 18:25
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>Здравствуйте, cppnick, Вы писали:


C>>Здравствуйте, мыщъх, Вы писали:


М>а вот DFA-деревья это попа. реконструкция логики крайне трудоемка.

Есть ли свободные (или проприетарные) решения для преобразования части байткода в эквивалент в DFA? Можно, конечно, кустарное решение налабать...
Re[5]: Защита от декомпиляторов
От: мыщъх США http://nezumi-lab.org
Дата: 07.02.12 22:49
Оценка: 13 (2)
Здравствуйте, nen777w, Вы писали:

N>Заинтересовался. Что это вообще за такие DFA деревья, гуглил на англ. и рус. ничего путного не смог найти.

начинать можно отсюда: http://en.wikipedia.org/wiki/Automata_theory
а продолжить здесь: http://www.amazon.com/Introduction-Automata-Theory-Languages-Computation/dp/0321455363/ref=pd_vtp_b_24

DFA дерево это грубо говоря несколько гектар данных, описывающих логику программы, которые, кстати, не привязаны к языку и потому их можно свободно гонять между питоном, жабой и си.

даже простейшая программа для преобразование hex-строки в бинарное представление типа (str)'15 CD 5B 07' --> (int)1234456789 выливается в очень мощное дерево, уходящее конями куда-то вниз. и при его разборе приходится иметь дело с очень низкоуровневой логикой, по сравнению с которой x86 асм это как асм в сравнении с Питоном, Руби или Жабой.

модификация дерева невозможна (особенно, оптимизированного), а его перестройка нереальна в силу невозможности декопиляции с последующей компиляцией.

на DFA деревьях удается защитить даже "чистые" данные. например, есть у нас база ключевых слов (матерных, да), которые мы ищем и баним. допустим, наша база уникальна и мы хотим ее скрыть, но в то же раздать веб-мастерам, чтобы они прикрутили ее к форумам. как защитить себя от кражи интеллектуальной собственности? а очень просто -- представить это в виде DFA.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[5]: Защита от декомпиляторов
От: мыщъх США http://nezumi-lab.org
Дата: 07.02.12 22:57
Оценка: 7 (2)
Здравствуйте, A13x, Вы писали:

A>Здравствуйте, мыщъх, Вы писали:


М>>Здравствуйте, cppnick, Вы писали:


C>>>Здравствуйте, мыщъх, Вы писали:


М>>а вот DFA-деревья это попа. реконструкция логики крайне трудоемка.

A>Есть ли свободные (или проприетарные) решения для преобразования части байткода
A>в эквивалент в DFA? Можно, конечно, кустарное решение налабать...
За байт-код не скажу, но есть трансляторы с яву в dfa. исходная программа выглядит вполне обычно, правда,к ней предъявляются некоторые требования, т.к. поддерживаются далеко не все возможности языка.

огромное кол-во свободных трансляторов UML-подобных диаграмм в DFA.

это сложно ломается и быстрее работает. в частности, неоптимизированная реализация функции unescape на DFA рвет сишную реализацию из SpiderMonkey в три раза (т.к. получается код без ветвлений, точнее кода там совсем нет -- только цикл выборки и потому процессор разгоняется как ферарри на прямой трассе без поворотов). правда размер кода+данных больше раз в двадцать. т.е. в какой-то момент у нас просто не хватит кэша данных и с ростом сложности функции, исполняющейся в глубоко вложенном цикле начнутся тормоза.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[3]: Защита от декомпиляторов
От: dsorokin Россия  
Дата: 08.02.12 13:07
Оценка:
Здравствуйте, cppnick, Вы писали:

C>Второе. В меньшей степени первое. Если вкрадце, то это закрытый сетевой протокол, и не хотелось бы, чтобы он стал "открытым". Сниффером его не взять, не зная алгоритма, а вот вскрыть мобильные клиенты на раз можно при желании (буквально вчера за 2 часа вскрыл алгоритм в одной обфусцированной проге), поэтому хотелось бы максимально затруднить это.


Предлагаю следующую идею. Можно написать критически важный код на продолжениях. Будет очень трудно разобрать. А чтобы облегчить себе задачу, то можно взять Scala для JVM и F# для .NET. В Scala есть встроенный плагин с поддержкой продолжений, а в F# есть монада Async. Байт-код получится довольно путанный: один кусок здесь, другой — там. Поди разбери, как все выглядит вместе. Только нужно побольше вставить flatMap и bind между основными вычислениями
Re[6]: Защита от декомпиляторов
От: Мастер Йода Россия  
Дата: 08.02.12 14:27
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>Здравствуйте, nen777w, Вы писали:


N>>Заинтересовался. Что это вообще за такие DFA деревья, гуглил на англ. и рус. ничего путного не смог найти.

М>начинать можно отсюда: http://en.wikipedia.org/wiki/Automata_theory
М>а продолжить здесь: http://www.amazon.com/Introduction-Automata-Theory-Languages-Computation/dp/0321455363/ref=pd_vtp_b_24

М>DFA дерево это грубо говоря несколько гектар данных, описывающих логику программы, которые, кстати, не привязаны к языку и потому их можно свободно гонять между питоном, жабой и си.


М>даже простейшая программа для преобразование hex-строки в бинарное представление типа (str)'15 CD 5B 07' --> (int)1234456789 выливается в очень мощное дерево, уходящее конями куда-то вниз. и при его разборе приходится иметь дело с очень низкоуровневой логикой, по сравнению с которой x86 асм это как асм в сравнении с Питоном, Руби или Жабой.


М>модификация дерева невозможна (особенно, оптимизированного), а его перестройка нереальна в силу невозможности декопиляции с последующей компиляцией.


М>на DFA деревьях удается защитить даже "чистые" данные. например, есть у нас база ключевых слов (матерных, да), которые мы ищем и баним. допустим, наша база уникальна и мы хотим ее скрыть, но в то же раздать веб-мастерам, чтобы они прикрутили ее к форумам. как защитить себя от кражи интеллектуальной собственности? а очень просто -- представить это в виде DFA.


бррррррррррр... и типа покрутив это на эмуляторе Вы не получите конечных данных и логики?
Как показывает опыт: всё, что человеком сделано, можно воспроизвести или декодировать... Тем более, если логика известна и информация воспроизводится/извлекается на конечной машине. Гектар данных не осилит один человек, но загрузив сетку компов распаралеллеными вычислениями можно переварить колосальный, почти любой, объем информации.
Объеденить несколько компов на решение задачи нынче может не только корпорация-гигант, но и при желании почти любой нищеброд.
80% людей оценивают свое мастерство выше среднего...
Re: Защита от декомпиляторов
От: Мастер Йода Россия  
Дата: 08.02.12 14:34
Оценка:
Здравствуйте, cppnick, Вы писали:

C>В этом плане что-то изменилось в свете последних лет?


C>Интересует Java, C#. Или, как и прежде, обфускаторы?


C>Чем ещё сейчас покрывают софт. Есть ли какие виртуальные машины под означенные языки? Хотя VMP тоже не панацея — выдрал её с кишками, скормил байткод и получил то, что надо. Или я что-то упускаю?


C>ЗЫ: если ошибся форумом, перетащите.


Часть логики выносят на сервер, а клиентскую кроют какой-нить вм типа Thinstall + обфускаторы...
80% людей оценивают свое мастерство выше среднего...
Re[7]: Защита от декомпиляторов
От: pva  
Дата: 08.02.12 16:33
Оценка:
Здравствуйте, Мастер Йода, Вы писали:

МЙ>бррррррррррр... и типа покрутив это на эмуляторе Вы не получите конечных данных и логики?

Вряд ли получите. Чтоб свернуть даже маленькую машину состояний в компактную логику прийдется помучаться. А если гбайт-другой — это будет адъ.
newbie
Re[8]: Защита от декомпиляторов
От: c3p0  
Дата: 08.02.12 19:18
Оценка:
Где-то в соседних ветках читал что фейсбук из PHP в C++ код преобразуют, потом компилят gcc-c++.
Для java есть подобное?
Если вы параноик — это еще не значит, что за вами никто не следит
Re[7]: Защита от декомпиляторов
От: мыщъх США http://nezumi-lab.org
Дата: 08.02.12 19:20
Оценка:
Здравствуйте, Мастер Йода, Вы писали:

МЙ>Здравствуйте, мыщъх, Вы писали:


МЙ>бррррррррррр... и типа покрутив это на эмуляторе Вы не получите конечных данных и логики?

на эмуляторе чего? это же машина состояний. работает она приблизительно так (очень упрощенно). у нас есть 2D массив. x — это текущее состояние. y — это очередной входной символ. читаем содержимое (x,y) и получаем индекс состояния в которое мы переходим.

т.е. крайне упрощенно получается так: for(x=0, y = 0; 0<1; y=get_next_input()) x = data[x][y];

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


МЙ>Как показывает опыт: всё, что человеком сделано, можно воспроизвести или декодировать...

можно, конечно. кто ж спорит. вопрос в трудозатратах. а так же матчасти. "хачить" dfa можно только после хорошей мат. подготовки, что сужает круг потенциальных взломщиков.

МЙ> Тем более, если логика известна

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

МЙ> и информация воспроизводится/извлекается на конечной машине.

информация не извлекается. вот тут простейший DFA:
http://www.cs.usfca.edu/~jbovet/vas/screenshots/big/dfa.jpg

скажите, пожалуйста, что он делает? эквивален на яву умешается в строку менее, чем из 80 символов, т.е. это даже не программа и даже не подпрограмма, а очень крошечная часть очень крошечной подпрограммы, которая, к тому же очевидна как бы.

МЙ> Гектар данных не осилит один человек, но загрузив сетку компов распаралеллеными

МЙ> вычислениями можно переварить колосальный, почти любой, объем информации.
а мужики-то и не знают. тут парни вынь реверсят, чтобы реакт-ось написать, да и вообще реверсинг отнимает уйму времени. а тут оказывается достаточно собрать кластер и компьютер все сделает за нас. может, компьютер и сам программу напишет?

МЙ> Объеденить несколько компов на решение задачи нынче может

МЙ> не только корпорация-гигант, но и при желании почти любой нищеброд.
DFA это не крипто, которое ломается грубой силой перебора. это просто низкоуровневая логика. трансляция из яву в dfa возможна, но это однонаправленная операция. автоматических декомпиляторов нет и не будет. более того, нет даже готовых инструментов для анализа dfa (во всяком случае нет в открытом доступе).

но тут мы уже подходим к реконструкции логических схем, поскольку, они состоят из низкоуровневой логики и понять, что делает данный девайс -- очень сложно. чипы "ломают" (т.е. реконструируют логику), но это не вопрос вычислительных мощностей. это вопрос наличия специализированного по для анализа. точнее, его отсутствия.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[8]: ОПАфиоз ЦИРКА
От: jhjhg6fjyfyju  
Дата: 08.02.12 19:47
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>трансляция из яву в dfa возможна, но это однонаправленная операция.


интересная тема. хотелось бе ссылки увидеть на эти трансляторы. по возможности вообще на С. можно и примеры какие нибудь. гуглю про ДФА вне контекста о регулярных выражений. ничего не нахожу.
забанен на 2,5 недели за слово "Раша". адекватненько.
Re[9]: ОПАфиоз ЦИРКА
От: jhjhg6fjyfyju  
Дата: 08.02.12 19:49
Оценка:
Здравствуйте, c3p0, Вы писали:

C>Где-то в соседних ветках читал что фейсбук из PHP в C++ код преобразуют, потом компилят gcc-c++.

C>Для java есть подобное?

а разве есть смысл? по скорости работает почти как С, а ломать так же легко как Яву.
забанен на 2,5 недели за слово "Раша". адекватненько.
Re[9]: ОПАфиоз ЦИРКА
От: мыщъх США http://nezumi-lab.org
Дата: 08.02.12 21:06
Оценка:
Здравствуйте, jhjhg6fjyfyju, Вы писали:

J>Здравствуйте, мыщъх, Вы писали:


М>>трансляция из яву в dfa возможна, но это однонаправленная операция.

J>интересная тема. хотелось бе ссылки увидеть на эти трансляторы.
automata tools dfa в гугле выдает много ссылок

> по возможности вообще на С. можно и примеры какие нибудь.

произвольную программу на си транслировать в dfa невозможно, т.к. dfa находится в самой низшей "касте":
http://en.wikipedia.org/wiki/File:Theoretical_computer_science.svg

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

какие конкретно порекомендовать -- не знаю, т.к. их слишком много и мои закладки в браузере уже оказались дохлыми. но вообще-то вам необязательно брать именно dfa. можно брать nfa, lba... да много чего еще...

библиотеки на java по запросу automata tools гугляться сразу. они позволяют генерировать dfa для таких подзадач как, например, деление по модулю, что и есть основная трудность, собственно. а "кодогенератор" для dfa пишется с пол-пинка.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[2]: Защита от декомпиляторов
От: cppnick  
Дата: 09.02.12 08:55
Оценка:
Здравствуйте, Мастер Йода, Вы писали:

МЙ>Часть логики выносят на сервер, а клиентскую кроют какой-нить вм типа Thinstall + обфускаторы...

Речь о мобильном клиенте. Логику по сетевому протоколу выносить на сервер? Проще уж тогда полностью захостить клиента на сервере, а мобильным раздавать трафик в каком-то из стандартных протоколов
Re[8]: Защита от декомпиляторов
От: Мастер Йода Россия  
Дата: 09.02.12 09:41
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>Здравствуйте, Мастер Йода, Вы писали:


МЙ>>Здравствуйте, мыщъх, Вы писали:


МЙ>>бррррррррррр... и типа покрутив это на эмуляторе Вы не получите конечных данных и логики?

М>на эмуляторе чего? это же машина состояний. работает она приблизительно так (очень упрощенно). у нас есть 2D массив. x — это текущее состояние. y — это очередной входной символ. читаем содержимое (x,y) и получаем индекс состояния в которое мы переходим.
М>т.е. крайне упрощенно получается так: for(x=0, y = 0; 0<1; y=get_next_input()) x = data[x][y];
М>тут у нас нет потока вывода и наша машина состояний никогда не останавливается, но это не суть важно, т.к. это легко прикрутить, но сути это не изменит. а суть в том, что мы скачем по таблице. легко показать, что в эту таблицу легко засунуть и циклы, и условия, но вот выполнить обратную операцию...

Какая разница? Как бы там оно внутри не называлось — это же не сферический конь в вакууме. Сие счастье все равно выполняется в некоей конечной среде. Любая конечная среда выполняет "разворачивание" кода/данных... Вопрос в том только, как это воспроизвести в "удобном" виде и самому.
Тут много тонкостей, т.к. не всегда нам интересен прямо весь исходный код "как есть" — зачастую достаточно знать, что он делает — это задача гораздо проще.

МЙ>>Как показывает опыт: всё, что человеком сделано, можно воспроизвести или декодировать...

М>можно, конечно. кто ж спорит. вопрос в трудозатратах. а так же матчасти. "хачить" dfa можно только после хорошей мат. подготовки, что сужает круг потенциальных взломщиков.

Собственно, вот тут Вы сами ответили на все вопросы!
Реверсингом и взломом программ занимается не такой большой круг лиц, как нам преподносят: типа "каждый школьник"...
Если алгоритм/программа представляет интерес или спрос, оправдывающий трудозатраты, то ничто не остановит.
Тем более, когда рабочие данные/код полностью оказываются в распоряжении конечника, то вопрос сложности "распаковки" на 50% решен.

МЙ>> Тем более, если логика известна

М>если логика известна, то зачем реверсить программу, когда ее можно написать самому (логика известна).

Я имел ввиду, логика "упаковки" кода/данных, а не сами код/данные. Любые известные решения в большенстве случаев изучены в обоих направлениях...

МЙ>> и информация воспроизводится/извлекается на конечной машине.

М>информация не извлекается. вот тут простейший DFA:
М>http://www.cs.usfca.edu/~jbovet/vas/screenshots/big/dfa.jpg

М>скажите, пожалуйста, что он делает? эквивален на яву умешается в строку менее, чем из 80 символов, т.е. это даже не программа и даже не подпрограмма, а очень крошечная часть очень крошечной подпрограммы, которая, к тому же очевидна как бы.


Пример неадекватен.
Я щаз с эмуля случайный кусок асма дам, который 1 строчка на Си, переведу в битовую диаграмму и Вы по картинке будете долго думать, что там происходит.

МЙ>> Гектар данных не осилит один человек, но загрузив сетку компов распаралеллеными

МЙ>> вычислениями можно переварить колосальный, почти любой, объем информации.
М>а мужики-то и не знают. тут парни вынь реверсят, чтобы реакт-ось написать, да и вообще реверсинг отнимает уйму времени. а тут оказывается достаточно собрать кластер и компьютер все сделает за нас. может, компьютер и сам программу напишет?

Не надо тучи сгущать.
Когда я впервые запустил, например, ту же IDA, то тоже подумал "нифига себе!" А через несколько лет я уже в этом не видел ничего особенного.

МЙ>> Объеденить несколько компов на решение задачи нынче может

МЙ>> не только корпорация-гигант, но и при желании почти любой нищеброд.
М>DFA это не крипто, которое ломается грубой силой перебора. это просто низкоуровневая логика. трансляция из яву в dfa возможна, но это однонаправленная операция. автоматических декомпиляторов нет и не будет. более того, нет даже готовых инструментов для анализа dfa (во всяком случае нет в открытом доступе).
М>но тут мы уже подходим к реконструкции логических схем, поскольку, они состоят из низкоуровневой логики и понять, что делает данный девайс -- очень сложно. чипы "ломают" (т.е. реконструируют логику), но это не вопрос вычислительных мощностей. это вопрос наличия специализированного по для анализа. точнее, его отсутствия.

Опять же дело в спросе. Если завтра все будут кодировать в DFA, то инструменты сразу появятся.
Возможно что-то уже есть, просты мы не знаем...
80% людей оценивают свое мастерство выше среднего...
Re[9]: Защита от декомпиляторов
От: мыщъх США http://nezumi-lab.org
Дата: 09.02.12 20:58
Оценка:
Здравствуйте, Мастер Йода, Вы писали:

МЙ>Здравствуйте, мыщъх, Вы писали:


М>>Здравствуйте, Мастер Йода, Вы писали:


МЙ> Как бы там оно внутри не называлось — это же не сферический конь в вакууме.

МЙ> Сие счастье все равно выполняется в некоей конечной среде. Любая конечная
МЙ> среда выполняет "разворачивание" кода/данных... Вопрос в том только, как
давайте проведем перпендикуляр. одна строчка языка высокого уровня зачаствую выражает законченную мысль {например, sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))}, которая при трансляции в x86 asm (с инлайном функции сортировки) разворачивается в тысячи или даже десятки тысяч инструкций (транслятор питона в си весьма говорлив и многословен прямо как лев толстой). IDA Pro позволит выделить циклы, ветвления и даже декомпилировать в компилируемый си код на тысячу строк. с учетом особенностей конкретного транслятора питона и кода библиотечных функций мы можем ужать программу до сотен строк (маловероятно, но все-таки возможно), однако, это будет фундаментальный предел, фундаментальность которого обуславливается однонаправленностью процесса компиляции и неизбежной потерей данных.

относительная легкость дизассемблирования x86 асма связана с тем, что в нем есть практически все концепции, используемые высокоуровневыми языками. указатели, локальные и глобальные переменные, функции -- все это есть в асме. классов, впрочем, в асме нет. а где они есть? в плюсах классов тоже нет (щас меня закидают). именно потому вполне реально реконструировать приплюснутую программу из бинарника.

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

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


МЙ>Собственно, вот тут Вы сами ответили на все вопросы!

МЙ>Реверсингом и взломом программ занимается не такой большой круг лиц, как нам преподносят: типа "каждый школьник"...
МЙ>Если алгоритм/программа представляет интерес или спрос, оправдывающий трудозатраты, то ничто не остановит.
МЙ>Тем более, когда рабочие данные/код полностью оказываются в распоряжении конечника, то вопрос сложности "распаковки" на 50% решен.
разумеется, что взломать можно все. тут где-то была ссылка (если интересно, то кину) как чувак обрабатывает чиповые карты кислотами и щелочами, растворяя все лишнее, а потом смотрих их под микроскопом. купив оборудование на лимон баксов и потратив лет десять на изучение физики, химии, электроники... я могу захачить метрошную карту за десять баксов.

ТС спросил про обфускаторы. за C# не скажу, т.к. не моя область, а вот анализом жабы занимаюсь давно и не встречал ни одного обфускатора, который препятствовал анализу. во всяком случае любой опытный java-программист, знакомый с байт-кодом, хакнет их даже без предварительной подготовки. таких людей -- сотни тысяч по миру.

мое предложение -- использовать автоматические кодогенераторы и выносить критический функционал в низкоуровневую логику. это, конечно, требует намного больших усилий по сравнению с готовым обфускатором, однако, соотношение трудоемкость_защиты/трудоемкость_взлома рвет обфускаторы как грелка тузика. людей, способных это взломать, вряд ли наберется больше пары тысяч и у них есть дела поважнее, чем ломать программу ТС. тем более, что ее и "ломать" никто не будет. ТС говорит, что "сниффером программу не взять", однако, он заблуждается. если у нас есть возможность оправлять программе разные данные и смотреть на ее рекацию, то протокол реконструируется с минимальным углублением в дизасм или даже вообще без такового. это задает верхний (разумный) порог стойкости защиты от декомпиляции. если у вас супер-надежный бронированный сейф, но деньги подвозит слабо бронированный грузовик и охрана совсем не звездный десант, то деньги перехватят еще до того как они доедут до сейфа и потому рассуждения о (не)возможности его взлома теряют смысл.

М>>информация не извлекается. вот тут простейший DFA:

М>>http://www.cs.usfca.edu/~jbovet/vas/screenshots/big/dfa.jpg
МЙ>Пример неадекватен. Я щаз с эмуля случайный кусок асма дам, который 1 строчка на Си,
пример адекватный. это пример _законченной_ и несложной машины состояний.

МЙ>Опять же дело в спросе. Если завтра все будут кодировать в DFA, то инструменты сразу появятся.

МЙ>Возможно что-то уже есть, просты мы не знаем...
инструменты, конечно, есть. логические элементы электронных цепей -- вот вам и машина состояний. у меня торшер так устроен. там триггер простой стоит. у торшера четыре лампочки, их можно зажигать в разных комбинациях нажатиями на две кнопки (ярче/темнее -- т.е. больше лампочек горит или меньше). одна лампочка коротнула и в схеме управления выгорело несколько дорожек. пока восстанавливал на проволочных соплях заодно разобрался как оно работает и слегка поменял логику работы. теперь у меня всего два состояния -- темно/ярко.

а более сложные схемы, конечно, реконстрируются не вручную
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.