Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Свой обфускатор as3 кода (http://www.flasher.ru/forum/showthread.php?t=181653)

dimarik 29.06.2012 00:17

Цитата:

Сообщение от vizgl (Сообщение 1086477)
Написал свой обфускатор as3 кода.

Советую ознакомиться с понятием AST. Все встанет на свои места.

Добавлено через 1 минуту
Цитата:

Сообщение от vizgl (Сообщение 1086507)
Любой "пользовательский" класс может иметь динамические свойства.

Минус тут вам в карму.

maxkar 29.06.2012 00:23

Код:

Упс, забыл добавить, что анализируются все опкоды, которые работают со строками:
Хм... Ваш обфускатор вычислит, что поля "field1", "field2", ... "field10" нигде менять нельзя? Это при том, что ни строки "field2"-"field10", ни даже числа 2-10 в операциях не участвуют? Мне действительно интересно, как вы вычисляете множество допустимых строк. Вас же не только "входные" аргументы опкодов интересуют, но и результат выполнения опкодов. Ну и
Код AS3:

trace(myMessages[loader.data])

никто не отменял.

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

Цитата:

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

wvxvw
Цитата:

То, что обращаются именно к экземпляру нужного класса всегда можно понять в самом месте вызова, так что даже далеко ходить не нужно.
Нет, нельзя.
Код AS3:

public class Test {
  public var someValue : int = 15;
}
 
public static function cheat(arg : Object) {
  arg['someValue'] = 10;
}

Вопрос: к экземпляру какого класса идет обращение? Можно ли переименовать someValue?

Все зависит от вызывающего кода. Если в cheat может попасть Test, значит, у него someValue переименовывать нельзя. Если не может - значит, переименовывать можно. Если запрещать у класса и наследников, то это будет почти эквивалентно тому, что у ТС (любой динамический доступ к строкам), любой честный map (который через object реализуется) будет автоматически портить вообще все классы (так как они являются его наследниками). Если делать точно, то нужно делать глобальный анализ (хотя в большинстве мест анализ каждого аргумента будет затрагивать небольшое количество методов/классов). Фактически, это будет другая типизация программы (более точная, чем в AS-коде).

dimarik 29.06.2012 00:35

Цитата:

Сообщение от maxkar (Сообщение 1086518)
Хм... Ваш обфускатор вычислит, что поля "field1", "field2", ... "field10" нигде менять нельзя? Это при том, что ни строки "field2"-"field10", ни даже числа 2-10 в операциях не участвуют? Мне действительно интересно, как вы вычисляете множество допустимых строк. Вас же не только "входные" аргументы опкодов интересуют, но и результат выполнения опкодов.

Я сильно намекаю, что байткод относится к контекстно-зависимым грамматикам, хотя бы поэтому следует устраивать ему семантический анализ, с построением дерева AST. Иначе — это поделка из журнала "Юный техник".

vizgl 29.06.2012 00:44

Цитата:

Сообщение от maxkar (Сообщение 1086518)
Нет, нельзя.
Код AS3:

public class Test {
  public var someValue : int = 15;
}
 
public static function cheat(arg : Object) {
  arg['someValue'] = 10;
}

Вопрос: к экземпляру какого класса идет обращение? Можно ли переименовать someValue?

Все зависит от вызывающего кода. Если в cheat может попасть Test, значит, у него someValue переименовывать нельзя. Если не может - значит, переименовывать можно.

Программа просмотрит все методы всех классов и составит список строк, которые где-либо встречаются. В таблице констант, все строки хранятся в единственном экземпляре в целях оптимизации. Так вот поле someValue и строка 'someValue' будут завязаны на одну ячейку в таблице строк. В таком случае, такая строка не будет переименована.

Цитата:

Сообщение от maxkar (Сообщение 1086518)
Хм... Ваш обфускатор вычислит, что поля "field1", "field2", ... "field10" нигде менять нельзя? Это при том, что ни строки "field2"-"field10", ни даже числа 2-10 в операциях не участвуют? Мне действительно интересно, как вы вычисляете множество допустимых строк. Вас же не только "входные" аргументы опкодов интересуют, но и результат выполнения опкодов.

А кто Вам сказал, что в таблице строк хранятся "field1", "field2", ... "field10"? Там хранится только 'field'. Программа найдет эту строку, и пропустит её, а точнее занесет в список игнорируемых. Теперь если встретится метод или поле field, то они тоже останутся неизменными.

Цитата:

Сообщение от maxkar (Сообщение 1086518)
Ну и
Код AS3:

trace(myMessages[loader.data])

никто не отменял.

Это я не понял, тут все нормально. В дополнение ко всему у меня есть список ключевых слов, которые нельзя переименовывать. data туда тоже входит. Список состоит из 1777 слов, где взял уже не помню.


Цитата:

Сообщение от dimarik (Сообщение 1086525)
Я сильно намекаю, что байткод относится к контекстно-зависимым грамматикам, хотя бы поэтому следует устраивать ему семантический анализ, с построением дерева AST. Иначе — это поделка из журнала "Юный техник".

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

dimarik 29.06.2012 00:50

Цитата:

Сообщение от vizgl (Сообщение 1086527)
Вы наверно не уловили суть. Причем тут семантический анализ, я же не изменяю байт код, я всего лишь изменяю таблицу строковых констант.

Это Вы, вероятно, не уловили суть. Напомните мне, к чему относится таблица строковых констант, если не к байткоду. И, кстати, ее модификацией обфускация в широком смысле не ограничивается.

PS "Причем" пишется раздельно в данном контексте в русском, КЗ-зависимом.

vizgl 29.06.2012 00:56

dimarik
Я не пойму, что вы хотите доказать своими наездами? Что вы тут царь и бог?
Я понимаю, что людей у которых мало сообщений на форуме, считают глупыми, но нужно знать меру!

maxkar 29.06.2012 01:00

У вас с someValue все понятно было изначально. Это было для wvxvw по поводу "локальности проверки".

Цитата:

Теперь если встретится метод или поле field, то они тоже останутся неизменными.
О, супер. Продолжаем этот пример. Цикл остался. Еще где-то в коде есть
Код AS3:

public class WithFields {
  public var field1 : int = 1;
  public var field2 : int = 2;
  ....
  public var field10 : int = 10;
}
 
//Где-то в совсем другом месте
for (var i : int = 0; i < 10; i++)
  trace(obj['field' + i]);

Вот по вашему подходу field1-field10 могут быть переименованы (их имена не встречаются, вы запрещаете только field). Но на самом деле как раз к ним может идти обращение в том цикле.

С loader.data нужно смотреть на myMessages а не на loader. Какие поля в нем вы запрещаете переименовывать и почему? По-хорошему в myMessages вообще ничего нельзя переименовывать без дополнительной информации - мало ли что сервер пришлет и к чему будет доступ.

dimarik
Цитата:

Я сильно намекаю, что байткод относится к контекстно-зависимым грамматикам, хотя бы поэтому следует устраивать ему семантический анализ, с построением дерева AST.
А зачем AST-то? Любой более-менее интересный анализ работает не с AST а с соответствующими графами. Data flow, control flow и т.п. Да, они строятся по AST. Но нужные графы можно строить и без AST. Для анализа байт-кода AST в чистом виде не нужен, в процессе чтения можно сразу слинковать и подставить в нужные места константы из пула, а не ссылки на пул. Уже такая подстановка испортит "АСТ" и будет строить модель данных. Для типичных языков программирования построение моделей из AST действительно удобно (плюс там решается еще ряд задач вроде восстановления после ошибок, которые в байткоде решать не нужно), а вот для парсинга байткода я необходимости в нем не вижу. А вот идею необходимости семантического анализа программы полностью поддерживаю.

dimarik 29.06.2012 01:00

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

vizgl 29.06.2012 01:13

Цитата:

Сообщение от maxkar (Сообщение 1086533)
У вас с someValue все понятно было изначально. Это было для wvxvw по поводу "локальности проверки".


О, супер. Продолжаем этот пример. Цикл остался. Еще где-то в коде есть
Код AS3:

public class WithFields {
  public var field1 : int = 1;
  public var field2 : int = 2;
  ....
  public var field10 : int = 10;
}
 
//Где-то в совсем другом месте
for (var i : int = 0; i < 10; i++)
  trace(obj['field' + i]);

Вот по вашему подходу field1-field10 могут быть переименованы (их имена не встречаются, вы запрещаете только field). Но на самом деле как раз к ним может идти обращение в том цикле.

А вот это уже вылет. В принципе для таких случаев в известных(secureSWF) обфускаторах и есть функция ручной настройки, что можно трогать, а чего нельзя.
Такие случаи автоматически выявить, практически нельзя, т.к. программа может иметь огромное количество состояний. И все их проверить, может занять много времени.

dimarik 29.06.2012 01:25

О! Уже начали понимать разницу между compile time и run time. Продолжайте.


Часовой пояс GMT +4, время: 18:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.