![]() |
Свой обфускатор as3 кода
Написал свой обфускатор as3 кода.
Используются 2 библиотеки: работа с тегами swf файла as3swf, работа с байтокодом as3abc. Последнюю библиотеку дополнил возможностью сохранять измененный байткод, т.к. она позволяла только получить данные о классах, методах и т.д. Обфускатор умеет обфусцировать: неймспейсы, классы, переменные, методы, геттеры/сеттеры, и константы. Для проверки на возможность переименовывания методов/переменных/констант, я написал анализатор байткода. Он ищет во всех функциях опкоды которые обрабатывают строки и запоминает эти строки, чтобы в дальнейшем не сломать их, если вдруг будет переменная с таким же именем, при её обфускации. Т.е. если в коде где-нибудь встречается строка "Update" и метод Update, то этот метод не переименуется, т.к. в таблице строк тега abc, хранится один экземпляр строки Update, который соответствует и строке и имени метода. Теперь вылез вот такой случай, например есть такой код: Код: Код AS3:
Если опкод один из этих GetProperty, SetProperty, CallProperty, CallPropVoid то добавляем в игнорлист его значение. В примере это свойство Foo обьекта obj. Так все работает, но только если обфусцировать приложения скомпилированное в Flex Sdk, если приложение скомпилированное во Flash, то получается что все, выше перечисленные опкоды, применяются когда класс обращается к своему члену, а не как обращение к динамическому методу обьекта. И получается ни один метод не переименовывается, т.к. находится в игнор листе. Посоветуйте как это лучше сделать. |
офигеть, дайте две! as3abc я так и не полез дописывать сборщик на место. Вы опубликовали или собираетесь ли опубликовать сырцы этого дополнения?
Действительно есть над чем подумать. А что вы делаете с jmp в коде? все пересчитываете на новые адреса? |
Сам обфускатор открывать не буду, а дописанную либу могу опубликовать. В репозитории последний коммит 2 года назад, не думаю что автор еще собирается поддерживать проект.
На счет jmp, я не заморачивался, автор библиотеки не дописал этот функционал, я тоже не писал. Сам то не использую метки в коде. К тому же код я не меняю, а только таблицу констант, в таком случае не приходится пересчитывать смещения для меток свича, джампов и т.д. |
Вложений: 1
Вот дополненная библиотека. Еще многое нужно тестировать, т.к. думаю багов полно будет, если изменять само байткод.
Есть еще такая библиотека AS3 Commons Bytecode но она у меня что-то плохо собирала файл обратно. |
Цитата:
В первом случае придется разбирать либо один вариант GetProperty (если там multiname) или пару getpropertystrict + getproperty (если во втором multinameL). Также придется смотреть на тип obj в динамическом вызове и проверять, есть ли у этого тип соответствующие методы или нет (на этапе анализа, исходя из типов аргументов функции, например). Ну и при выполнении всех условий заменять опкод (или два) на один "строгий" вызов. Во втором случае все примерно так же. В этом случае одна из констант переименовывается вместе с именем метода/свойства. Но в исходном подходе "маскирования" свойств есть большая проблема. Как вы обрабатываете multinameL? Пример: Код AS3:
|
Цитата:
А действительно некоторые опкоды выполняют разные задачи при компиляции flex sdk и в flash ide? Или это я где-то натупил? |
А кто их как строки то отметит? Если бы там было
Код:
trace(a==3 ? obj['a'] : obj['b']);А мой код эквивалентен Код:
const tmp : String = a== 3 ? 'a' : 'b';Код:
for (var i : int = 0; i < 10; i++)Код:
действительно некоторые опкоды выполняют разные задачи при компиляции flex sdk и в flash ide? |
Цитата:
IntStringIntIntOperation StringOperation Ну и multiname операции GetProperty SetProperty CallProperty CallPropVoid Так, то все ваши примеры будут работать нормально. Обфускатор уже тестировался на 2 зарелизиных игрушках, просто собирались они под flex sdk. Вот решил обфусцировать свою первую игру на flash и вылезли такие косяки с динамическими свойствами. |
Я бы шел по такому пути: искал бы только пользовательские классы, не динамические, и переименовывал их свойства тогда когда из кода понятно, что обращаются именно к экземпляру этого класса. То, что обращаются именно к экземпляру нужного класса всегда можно понять в самом месте вызова, так что даже далеко ходить не нужно. Остальное не трогал бы. Самое худшее, что в таком случае может произойти - пользовательский ввод интерпретируется как имя свойства - но от этого вы никак не застрахуетесь, так что прийдется смирится, т.как если какой-нибудь паблик-морозов в коде есть, то таким образом можно даже к приватным свойствам обратиться.
|
Цитата:
Update: с ключевым словом dynamic |
Цитата:
Добавлено через 1 минуту Цитата:
|
Код:
Упс, забыл добавить, что анализируются все опкоды, которые работают со строками:Код AS3:
Собственно, вопрос не в том, что обфускатор не будет работать (а всегда можно придумать ситуацию, когда он не будет работать), а какие именно ограничения он накладывает на код. Плюс я интересуюсь анализом программ (в более общем смысле), так что вдруг здесь будут какие-то интересные идеи :) Цитата:
wvxvw Цитата:
Код AS3:
Все зависит от вызывающего кода. Если в cheat может попасть Test, значит, у него someValue переименовывать нельзя. Если не может - значит, переименовывать можно. Если запрещать у класса и наследников, то это будет почти эквивалентно тому, что у ТС (любой динамический доступ к строкам), любой честный map (который через object реализуется) будет автоматически портить вообще все классы (так как они являются его наследниками). Если делать точно, то нужно делать глобальный анализ (хотя в большинстве мест анализ каждого аргумента будет затрагивать небольшое количество методов/классов). Фактически, это будет другая типизация программы (более точная, чем в AS-коде). |
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
PS "Причем" пишется раздельно в данном контексте в русском, КЗ-зависимом. |
dimarik
Я не пойму, что вы хотите доказать своими наездами? Что вы тут царь и бог? Я понимаю, что людей у которых мало сообщений на форуме, считают глупыми, но нужно знать меру! |
У вас с someValue все понятно было изначально. Это было для wvxvw по поводу "локальности проверки".
Цитата:
Код AS3:
С loader.data нужно смотреть на myMessages а не на loader. Какие поля в нем вы запрещаете переименовывать и почему? По-хорошему в myMessages вообще ничего нельзя переименовывать без дополнительной информации - мало ли что сервер пришлет и к чему будет доступ. dimarik Цитата:
|
Со мной проще согласиться, чем вступать в дискуссию, не имея багажа знаний. Вы сами начали. Так к чему относится таблица строковых констант? Вы утверждаете, что не модифицируете байткод. Продолжаем разговор.
|
Цитата:
Такие случаи автоматически выявить, практически нельзя, т.к. программа может иметь огромное количество состояний. И все их проверить, может занять много времени. |
О! Уже начали понимать разницу между compile time и run time. Продолжайте.
|
| Часовой пояс GMT +4, время: 17:30. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.