eXeL@B —› Программирование —› АнтиОбфускатор |
<< . 1 . 2 . 3 . 4 . >> |
Посл.ответ | Сообщение |
|
Создано: 04 декабря 2008 18:02 · Поправил: Модератор · Личное сообщение · #1 Какие есть методы по борьбе с обфускацией ? Цель написать анализатор заменяющий 10 обфусцированных команд в одну настоящую. Для этого наверное нужно делить по блокам , а потом уже в них искать смысл и изменения. Бывает что между командами лежит просто мусор , который даже не используется =) Поэтому пока что эту часть я хочу просто опустить .. и отследить одну команду выполненую 10 или более команд без изменения смысла той самой одной. У кого нить есть информация с РАН фаха Кибернетики ? Там професора пишут ух какие тексты. ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 04 января 2009 02:52 · Личное сообщение · #2 Yotun - я тоже сообразил что так-то оно лучше, и пока на подводные камни попал. Использую DevCpp v3.2 (MinGW). Вот тут: www.archivum.info/qemu-devel@nongnu.org/2005-11/msg00010.html Сказано следующее: This P-code is then turned into working machine code by filling in the corresponding snippets (the compiled code of the op_* functions) and the arguments are put into the correct place. А тут тоже некоторые выкладки насчет работы QEmu: Portable dynamic translation - detailed explanation: libvncserver.sourceforge.net/qemu/qemu-porting.html Из чего очень похоже, что результаты выполнения инструкции мы там в полном виде не увидим. Скорее всего придется генерировать самим таблицы и функции из например файла i386.md (для каждого процессора свой файл .md). Функции на каждую инструкцию уже есть в QEmu, за исключением такой архи-важной мелочи как изменение состояние регистра флагов и ещё чего-нибудь, без чего эта затея никак не сможет работать. Там довольно замысловатое описание процессора (в файле i386.md). Из него для сборки GCC генерируется несколько файлов (размером даже до 2 мб) утилитами (с именами начинающимися с Genxxxxx.c -> Genxxxxx.exe) которые собираются также во время сборки компилятора. Вот такая там ерунда. Я искал вобщем-то файлы opc.h и gen-op.h, а наткнулся - что изложил выше. А GCC компилятор успешно прошёл все инклюды (кроме тех что я пока не нашел) и застрял в теле исходника. |
|
Создано: 04 января 2009 03:57 · Личное сообщение · #3 QEmu сорцы целиком: bellard.org/qemu/qemu-0.9.1.tar.gz opc.h и gen-op.h получатся при сборке утилиты из dyngen.c -> .exe с main() внутри. Еще есть мысль, генерировать информацию о состояния процессора после выполнения инструкции . Можно попробовать на реально работающем процессоре, который дебажится, потом записывать в отдельный файл в удобном для парсинга формате. И так проходясь по файлу со списком инструкций можно создать готовую таблицу которую потом можно использовать для генерации уже готового кода. Или как минимум такого кода, который останется только немного дописать. Сами тела функций которые переносятся в память для исполнения можно брать из этого же QEmu. Как я понимаю, взяв их адреса. Впрочем - посмотрим, это незрелые мысли пока. |
|
Создано: 04 января 2009 04:18 · Личное сообщение · #4 |
|
Создано: 17 января 2009 04:48 · Личное сообщение · #5 Еще раз убедился что этот винегрет - QEmu, как основа не подходит. Об этом сказано на: bellard.org/qemu/qemu-tech.html#TOC7 Не следует он точно инструкциям, а эмулирует только работу наиболее быстрыми способами. Транслирует функции в исполняемый код импровизируя на ходу, можно так выразиться. Но нашел я другой эмулятор, называется Bochs: bochs.sourceforge.net/ там сказано буквально следующее: The 'typical' use of bochs is to provide complete x86 PC emulation, including the x86 processor, hardware devices, and memory. Полную эмуляцию. Посмотрим, насколько полную. |
|
Создано: 29 июня 2009 14:48 · Личное сообщение · #6 Вообщем дела обстоят так , никаких сторонних компилеров си использовать не хочу. Остановился на создании базы опкодов с парметрами , там же в этой базе будет несколько подбаз , где описаны некоторые оптимальные варианты по скорости и по размеру , это как два разных компонента. Построение кода будет на графах , сначала хотелось облегчить задачу и поэтому начальная идея бинарной трансляции была отложена из за ее масивности. Сегодня по мере составления таблицы опкодов , думаю стоит зарезервировать место под бинарную траснляцию. Проблемой было то что с таким подходом было реализовано 2 виртуальные машины , одна из них выполняет код на своем процессоре , вторая же следит за виртуальным процессором и создает карту , каждая команда переводится на понятный язык второй виртуальной машины , далее имея базу команд , правил грамматик , начинается поэтапное прокручивание кода на ВМ ... каждый этап выполняет свои функции например убирание мертвого кода и так далее ....в конечном этапе весь код переводится назад в машинный язык , с участием опять же описанных оптимизирующих правил. Смысл в том что можно было обойтись без второй ВМ , а просто строить графы по выполнению первой ВМ машины а также анализировать состояние регистров , при таком подходе нужно всеголишь описать правила чистки , например как это делалось с помощью питона в выше описанных в этом топе статьях. Но судя по примерным прикидам , каждый из методов имеет какие то минусы. Вторая ВМ это что то типо перевода на си , и потом оптимизация оптимизирующим компиллером , но код скорее не сишный будет , а правила вм более упрощенные. Первая вм это анализ выполнения и работа с самим асм кодом , тоесть получается реализованы 2 метода. Оставить 2 или же использовать один я пока не знаю , в любом случае оба направлления очень интересны в плане реализации. По мере дальнейшей сборки можно сделать систему плагинов , для того же анализа других ВМ машин. В обоих случаях ВМ интепритации антиобфускатора должны использоваться скриптовой двигатель , ядро которое само по себе не имеет особого интереса , но вот код или правила для выполнения этих скриптов будет базой. В итоге бинарная трансляция будет в обоих вм , просто разные реализации , поэтому для упрощения задачи было решено сделать одно ядро для обоих антиобфускационных ВМ машин. Сейчас насобирал много классных книжек по Графам и Компиляторным технологиям , но проблема с метаморфами пока остается. Единственное решение которое пока есть , это этот же вм ный трасер , который будет собирать карту не по общему дизассемблерному листингу а по мере выполнения и собирания кода в строчку удаляя морфирующие блоки с помощью анализатора. У кого есть какие мысли по поводу морфленного кода ? ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 01 октября 2009 15:28 · Личное сообщение · #7 |
|
Создано: 01 октября 2009 15:41 · Личное сообщение · #8 |
|
Создано: 02 октября 2009 14:20 · Личное сообщение · #9 |
|
Создано: 02 октября 2009 14:58 · Поправил: Модератор · Личное сообщение · #10 mak А почему флуд? Мы же вроде про деобфускатор говорим? Но это не ответ. Ты сам умеешь снимать аспр или скрипты используешь? Можно в личку. Просто я видел как ты в запросах выкладывал файл в котором вроде не было обфусцированного кода, на сколько я помню (и если ничего не путаю) он там в оригинале был, а значит ты как-то деобфусцировал. Сложностей нет никаких, просто любопытно довёл ли ты свою разработку до поддержки аспра. mak пишет: Деобфускатор там не использовался , пока что. А как тогда? Добавлено: Кстати могу привести тебе много примеров обфускатора в аспре. Он там слабый, вручную всё за 5 минут можно разгрести, но я пока не видел 100% работающих автоматических средств. |
|
Создано: 06 октября 2009 16:56 · Личное сообщение · #11 progopis пишет: вручную всё за 5 минут можно разгрести, но я пока не видел 100% работающих автоматических средств. Проблемма наверное только в заинтересованности!?!? т.к. если программист понимает принцип (как это делается вручную) то преград не видно, а у тебя написано Статус: Кодер ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 06 октября 2009 18:11 · Поправил: Модератор · Личное сообщение · #12 |
|
Создано: 06 октября 2009 19:16 · Личное сообщение · #13 |
|
Создано: 06 октября 2009 19:26 · Личное сообщение · #14 |
|
Создано: 02 декабря 2009 16:57 · Личное сообщение · #15 |
|
Создано: 02 декабря 2009 18:22 · Личное сообщение · #16 progopis пишет: много примеров обфускатора в аспре. Хз..кто как хочет так и называет, хотя мне как-то ближе и понятней в отношении аспра - это деморф. По шаблону или ручками, но это как-то решаемо под Олькой. А вот как свернуть цикличный код, т.е привести его в боллее менее читабельно_последовательный код. Силами олька_скрипт из-за шибко цикличных тыренных процедур приложения, это как-то сложновато. ----- Чтобы юзер в нэте не делал,его всё равно жалко.. |
|
Создано: 03 декабря 2009 02:15 · Личное сообщение · #17 |
|
Создано: 06 декабря 2009 00:16 · Личное сообщение · #18 Bronco пишет: progopis пишет: много примеров обфускатора в аспре. Хз..кто как хочет так и называет, хотя мне как-то ближе и понятней в отношении аспра - это деморф. По шаблону или ручками, но это как-то решаемо под Олькой. А вот как свернуть цикличный код, т.е привести его в боллее менее читабельно_последовательный код. Силами олька_скрипт из-за шибко цикличных тыренных процедур приложения, это как-то сложновато. Хотел спросить , что ты называешь - цикличный код ... и что обозначается как - цикличных тыренных процедур приложения ... просто рассматривая эту тематику есть достаточно много вариантов что можно назвать цикличным ... а отсюда уже и методы разные .. поясни пжлст ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 06 декабря 2009 21:16 · Личное сообщение · #19 |
|
Создано: 10 декабря 2009 17:38 · Поправил: mak · Личное сообщение · #20 Техники есть разные , все сводится опять же к простым действиям, если цикличность не оптимизирована замусорена , можно построить простой узконаправленный на цель эмулятор , именно заточенный под конкретную цель , так как писать километры кода для свертывания универсального в данном случае не очень хорошо, как бы не было известные мне коды, используют такого типа эмуляторы для снятия аспротект. нужно поделить циклы на блоки определить главный управляющий блок по возможности оптимизировать блок - соотвественно можно делать оптимизацию и до и после различных манипуляций Построить таблицы джампов , определить возможно ли совместить или же удалить блоки вообще Просканить таблицу на наличие дубликатов Если у нас произошло слитие блоков , нужно пересчитать таблицы прыжков Проверить мертвые джампы в таблице , так как после слития блоков это возможно Функции хэширофания или поиска некоторых условий цыклов , почти теже сигнатуры проверка наличия мертвых переходов для превращения их в безусловные умное совмещение блоков , где совмещение уже будет не по признакам а насильно обьединяя главный интератор блок со всеми другими Циклическая ВМ - это вм которая исполняет сама себя , это базовый термин , все остальное это уже какие то вариации на тему. Ветвление в циклических машинах весьма интересно Есть разные подходы к оптимизации циклических интерпретаторов customization type analysis and splitting type feedback dynamic recompilation polymorphic inline caches Но область всеравно еще весьма неизвестная , например Вмные проты где команда асм , выполняется как 3 - 4 вмных интерпретатора выполняющих отдельные асм интструкции , отчасти это тоже цыкличный вм код. Со спертым кодом какой то бардак , спертый код тот что перемещен на другое место , и либо защищен покриптован , проморфлен или прополиморфен , обфусцирован , но если же это уже интерпретатор спертого кода , то это уже ВМ , следовательно и методы уже должны быть другие ибо свертывание цикличного кода будет скорее не достаточно. В любом случае можно столкнуться с проблемами которые описываются в оптимизационных техниках самоисполняющихся вм , где мы не всегда точно можем определить , явлется ли код мусором. ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 11 декабря 2009 02:50 · Личное сообщение · #21 mak известные мне коды, используют такого типа эмуляторы плезир, тыкни пальцем на что глянуть, или закидай сорцами. нужно поделить циклы на блоки Поясни ещё раз, что ты делишь на блоки. Потому, что из описания ниже цитаты, сложилось впечатление, что само тело цикла ещё не собрано. Циклическая ВМ - это вм которая исполняет сама себя Рекурсия - как один из методов такой цикличности, или как основной ? ----- Чтобы юзер в нэте не делал,его всё равно жалко.. |
|
Создано: 13 января 2010 21:08 · Личное сообщение · #22 |
|
Создано: 13 января 2010 22:16 · Личное сообщение · #23 |
|
Создано: 13 января 2010 23:05 · Личное сообщение · #24 |
|
Создано: 15 марта 2010 13:31 · Личное сообщение · #25 Archer пришет: Трассер хрень, вообще говоря, он не даёт полного покрытия, половину алгоритма посеять можешь. Да и Крис графоман. Он много, что писал. Да вот мало, что дельного выкладывал. Мне попался такой код, пришлось трассировать, поскольку ни в Олли ни в Ида невозможно увидеть нормальный код: код в Олли Code:
результат трассировки: Code:
здесь больше половины кода составляют джампы, процентов тридцать от оставшегося - мусор, и как в таком случае делать деобфускацию, дамп делать нет смысла поскольку код ходит по одному куску несколько раз прыгая в середину инструкций, обфусцированы небольшие фрагменты кода, и в них нет условных переходов, кроме двух циклов. Запихивать в оптимизирующий компилятор смысла не вижу, быстрее оттрассировать и результат трассировки вручную обработать. Подскажите что в таком случае делать без трассировки ? А вот насчет того что Крис свои статьи сильно обфусцирует - это согласен. ----- Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше |
|
Создано: 15 марта 2010 15:04 · Личное сообщение · #26 gena-m пишет: Подскажите что в таком случае делать без трассировки ? Без трассировки ничего не сделать, но трассировка трассировке рознь, вы делали динамическую трассировку, а можно в этом случае делать статическую, которая уберет не только все jmp'ы, но и все условные переходы без ветвления. Но для этого надо писать обработчик, алгоритм простой: 1. читаем команду, дизассемблируем 2. если не переход и не call, то на 1 по следующему смещению 3. если jmp или саll, то переход по адресу, далее на 1 в результате имеем тот же список... ----- Everything is relative... |
|
Создано: 15 марта 2010 17:17 · Личное сообщение · #27 gena-m пишет: здесь больше половины кода составляют джампы, процентов тридцать от оставшегося - мусор, и как в таком случае делать деобфускацию, дамп делать нет смысла поскольку код ходит по одному куску несколько раз прыгая в середину инструкций, обфусцированы небольшие фрагменты кода, и в них нет условных переходов, кроме двух циклов. Запихивать в оптимизирующий компилятор смысла не вижу, быстрее оттрассировать и результат трассировки вручную обработать. Подскажите что в таком случае делать без трассировки ? Судя по коду ты все импорт обсида ковыряешь . Принципиально там ни чего не менялось со старых версий читай манулы |
|
Создано: 15 марта 2010 17:25 · Личное сообщение · #28 |
|
Создано: 15 марта 2010 21:24 · Личное сообщение · #29 progopis: а на реальном хорошем примере трассировка слетит нафиг Это именно реальная трассировка обсида, задача побыстрее снять обсид не стоит,просто тренируюсь работать в связке Олли-Ида, и ничего плохого не вижу что бы исследовать алгоритм вызова API, котрый сделан довольно запутанно, и кстати, а как по другому импорт найти? Из мануалов по обсиду вообще ничего не нашел путного, поэтому ковыряю сам потихоньку. Насчет "не шарит" согласен, только учусь (нужно же на чем то учиться). ----- Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше |
|
Создано: 06 апреля 2010 19:13 · Личное сообщение · #30 |
|
Создано: 13 мая 2011 15:48 · Поправил: antipod · Личное сообщение · #31 |
<< . 1 . 2 . 3 . 4 . >> |
eXeL@B —› Программирование —› АнтиОбфускатор |