Сейчас на форуме: (+9 невидимых)

 eXeL@B —› Протекторы —› Декомпилятор ВМ
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 23 . 24 . >>
Посл.ответ Сообщение


Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 03 марта 2010 12:33
· Личное сообщение · #1

Вашему вниманию предлагаются наработки по декомпиляции ВМ.
Проект на сегодняшний день для меня завершен, но жаль если результат "ляжет на полку", может кому-нибудь и пригодится. Предлагаю сначала ознакомиться с обзором, и если будет интерес то могу выложить и сам плагин, или здесь или в личку заинтересованным лицам, каким образом, пока ещё не решил...
Но если кто-либо ожидает увидеть "автоматическое чудо", то сразу скажу - его нет. Для того чтобы получить результат нужна ручная предварительная работа:
- с исследуемой программы должна быть снята упаковка
- точки входа в ВМ находятся вручную
- возможно неоднократное "жамкание" клавиш в OllyDbg, а возможно и модификация кода, чтобы попасть в нужное место, в зависимости от защищенной функции
- необходимо вручную прицепить к программе требуемый секцию
- запись результатов в файл это тоже ручная работа, но уже более приятная

Не всё гладко обстоит с определением реализаций ВМ, на сегодняшний день примерно каждая третья реализация автоматом не определяется, приходится под неё модернизировать плагин, т.к. не могу сразу предусмотреть все случаи "издевательств" ВМ с кодом примитивов. Лучше дела с восстановлением "исходного" кода защищенных функций - 70% нормально восстанавливается, хотя во многом это зависит от самой структуры функции. Таким образом, если будет заинтересованность и помощь в нахождении подобных ситуаций, то проект может быть доведен до релизной стадии.

ЗЫ: Речь идет об Ореановских машинах. Нигде специально не упоминал.

9c41_03.03.2010_CRACKLAB.rU.tgz - VMSweeperLst.rar

-----
Everything is relative...




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 16 апреля 2010 12:47
· Личное сообщение · #2

Vamit пишет:
здесь для ускорения процесса может кто-нибудь поделится чистыми/значимыми телами обработчиков примитивов

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




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 16 апреля 2010 16:02
· Личное сообщение · #3

Vamit пишет:
Прога накрытая Темидой под Олькой ведет себя нормально (стоят плагины Phantom 1.54, StrongOD upk 2010). Но при потытке запустить этот пакет из под дебагера VS 2008 для отладки декомпилятора (плагин под Ольку), Темида просыпается и посылает на свой саппорт, но иногда, раза с 3-4 всё срабатывает нормально и можно дебажить, но при нажатии в VS кнопки StopDebugging всё падает вместе с Виндой.

Нашел причину падения Винды - Phantom 1.54, без него всё работает и Темида и VS...

-----
Everything is relative...




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 16 апреля 2010 17:56
· Личное сообщение · #4

Ну логично, что винда падает на уровне ядра. Тут или фантик или стронг, больше некому вроде шалить.




Ранг: 154.2 (ветеран), 66thx
Активность: 0.080
Статус: Участник
REVENGE Crew

Создано: 16 апреля 2010 18:36
· Личное сообщение · #5

Нашел причину падения Винды - Phantom 1.54, без него всё работает и Темида и VS...

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




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 21 апреля 2010 09:27 · Поправил: Vamit
· Личное сообщение · #6

VMProtect (VMP) - декомпилятором получены чистые тела всех обработчиков примитивов для двух реализаций ВМ. Приведу основные отличия обработчиков по сравнению с CodeVirtualizer (CV). Тела обработчиков VMP имеют упорядоченную структуру, поэтому для их получения и распознавания пришлось разобрать вручную около десятка обработчиков, написать пару правил, применить двухуровневую регистровую деобфускацию - и всё, со всем остальным декомпилятор справился сам. В CV же для получения примитивов требовалось сначала вручную разобрать практически каждый обработчик, затем создать шаблон(ы), и только затем декомпилятор на основе шаблона(ов) мог распознать примитив. Есть несколько основных отличий от CV:
1. Использование под контекст ВМ "отдельного стека" с которым идет работа как с памятью (через ebp). Основной стек после обработчиков не меняется. Шаблон примитива в таком случае получается обнозначным. В CV же под контекст ВМ используется основной стек - это определяет основную сложность в локализации примитивов, т.к. вариантов работы со стеком куда больше, чем с памятью. Для распознавания примитивов простой регистровой деобфускации здесь недостаточно, нужно отслеживать не только изменения вершины стека, но и его содержимое. Например, примитив xchg регистра со стеком имеет около десятка разных реализаций, пока для его распознавания у меня используется 6 шаблонов, но я думаю это не предел, т.к. (см. первый пост) "каждая третья реализация автоматом не определяется".
2. Кол-во примитивов. В CV - фиксированное кол-во и не зависит от содержимого защищаемой функции, в этом случае многие примитивы имеют только тела, но никогда не используются, что затрудняет их анализ. В VMP же набор примитивов в каждой реализации ВМ динамический (в пределах 255), в набор включены только нужные (используемые) примитивы и очень много их дублей. Это упрощает их анализ для одной реализации ВМ, но в другой ВМ могут встретиться "ещё неизвестные" примитивы, что потребует доработки декомпилятора только в части добавления шаблона, но не изменения анализа.
3. "Мусорные" (незначимые, dummy) примитивы. В VMP пока не обнаружены, но не знаю есть ли они вообще? В CV таких примитивов достаточно много и их легко спутать с другими простыми примитивами (тот же xchg).
4. Обфускация обработчиков. В VMP она гораздо "круче", но только с виду, т.к. используется большое кол-во (практически весь набор инструкций i486) раритетных команд, которые легко очищаются регистровой и стековой (т.к. его вершина постоянна) деобфускацией. Наличие "двойных" маршрутов в одном обработчике с одинаковой логикой анализ не усложняет. В ручную VMP разбирать сложнее, но не декомпилятору.
5. Получение индексов регистров ВМ. В VMP индексом регистра является сам опкод примитива, т.е. для чтения и записи в разные регистры ВМ используются разные примитивы, но с одинаковым телом. В CV же индекс регистра является дополнительным хешированным байтом в пикоде. С точки зрения обработки - сложностей в обоих случаях нет.

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

В связи с тем, что каждая реализация VMP имеет ограниченный набор примитивов, хотелось бы заранее предусмотреть некоторые моменты, которые пока не встретились, поэтому есть несколько вопросов знатокам VMP:
1. Обрабочики с хешированием констант пикода. Всегда ли одинаковые обработчики имеют одинаковый алгоритм хеширования?
2. Уже упоминал, но выделю здесь. Имеются ли "мусорные" (незначимые, dummy) примитивы?
3. Проверка переполнения стека контекста ВМ ("наезд" на регистры ВМ). Реально ли она происходит или это сделано только на непредвиденный случай, например, как защита? Спрашиваю потому, что ещё не разбирал её алгоритм и думаю, нужно ли реализовывать её в декомпиляторе.

=Дополню, ещё один вопрос забыл:=
4. Функциональный состав обработчиков. В VMP я не встретил обработчиков sub, idiv, imul, циклических сдвигов и некоторых других, хотя, обработчики add, div, mul имеются. Вопрос или они отсутствуют вообще и эти инструкции эмулируются, или они пока не встретились в разобранных реализациях ВМ? Хотя, если есть обработчик mul, то эмулировать imul бесполезно, или я ошибаюсь?

-----
Everything is relative...




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 21 апреля 2010 13:41
· Личное сообщение · #7

Vamit пишет:
В VMP я не встретил обработчиков sub, idiv, imul

SUB нету, ибо его легко заменить на ADD. IDIV и IMUL есть. Могу скинуть примеры где обработчики IDIV и IMUL есть. Но на самом деле они такие же как в случае DIV и MUL.

Vamit пишет:
в пределах 255

Это лишь логический предел. На самом деле нельзя найти программу, где бы таблица состояла из 255 разных обработчиков. Иногда попадаются случаи, когда обработчики разные, но делают одно и тоже (если это конечно не было ошибкой моего анализа). Точное число явно выше 200 (по моим оценкам), вроде сам разработчик называл цифру.

Vamit пишет:
Использование под контекст ВМ "отдельного стека"

Не очень врубаюсь зачем это нужно (якобы для многопоточности). В ранних версиях вмпротекта всё "вертелось" на регистре ESP.

Vamit пишет:
В ручную VMP разбирать сложнее, но не декомпилятору.

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

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

Не всегда верно. Для чего я давал свои наработки? Разные примитивы в значении разные строчки таблицы? Я бы абстрагировался от того, где и что находится, это не важно. PUSH_R16/POP_R16, PUSH_R8/POP_R8 берут номер регистра из ленты, разумеется, он закриптован (хеширование процесс не обратимый, то, что вы называете хэшированием здесь правильно называть симметричным шифрованием). PUSH_R32_BY_AL/POP_R32_BY_AL берут индекс регистра раскриптовкой КОПа, но это только для 32-бит.

Vamit пишет:
Всегда ли одинаковые обработчики имеют одинаковый алгоритм хеширования?

Ест-но нет. Поэтому в тех наработках, что я вам дал, явно подчёркнуто это путём маркеров - "decrypt_start:"/"decrypt_end:". Вы задаёте этот вопрос, а что мешало взять две разные программы?

Vamit пишет:
2. Уже упоминал, но выделю здесь. Имеются ли "мусорные" (незначимые, dummy) примитивы?

Нет, таких нет.

На 3-ий вопрос у меня тоже нет ответа. Пока.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 21 апреля 2010 13:56 · Поправил: mak
· Личное сообщение · #8

Code:
  1.  
  2. ;========================================================;
  3. ; imul 32 ;
  4. ;========================================================;
  5.  
  6.         MOV EDX,DWORD PTR SS:[EBP]
  7.         MOV EAX,DWORD PTR SS:[EBP+4]
  8.         SUB EBP,4
  9.         IMUL EDX
  10.         MOV DWORD PTR SS:[EBP+4],EDX
  11.         MOV DWORD PTR SS:[EBP+8],EAX
  12.         PUSHFD
  13.         POP DWORD PTR SS:[EBP]
  14.         JMP @vmprotec_004B4B25
  15.  
  16. ;========================================================;
  17. ; imul 16 ;
  18. ;========================================================;
  19.  
  20.         MOV DX,WORD PTR SS:[EBP]
  21.         MOV AX,WORD PTR SS:[EBP+2]
  22.         SUB EBP,4
  23.         IMUL DX
  24.         MOV WORD PTR SS:[EBP+4],DX
  25.         MOV WORD PTR SS:[EBP+6],AX
  26.         PUSHFD
  27.         POP DWORD PTR SS:[EBP]
  28.         JMP @vmprotec_004B4B25
  29.  
  30. ;========================================================;
  31. ; imul 8 ;
  32. ;========================================================;
  33.  
  34.         MOV DL,BYTE PTR SS:[EBP]
  35.         MOV AL,BYTE PTR SS:[EBP+2]
  36.         SUB EBP,2
  37.         IMUL DL
  38.         MOV WORD PTR SS:[EBP+4],AX
  39.         PUSHFD
  40.         POP DWORD PTR SS:[EBP]
  41.         JMP @vmprotec_004B4B25
  42.  
  43. flags FLAG_O ,FLAG_S ,FLAG_Z ,FLAG_A ,FLAG_C ,FLAG_P

В данном случае эмуляция не полная может быть

Code:
  1.  
  2. ;========================================================;
  3. ; idiv r/m32 ;
  4. ;========================================================;
  5.  
  6.         MOV EDX,DWORD PTR SS:[EBP]
  7.         MOV EAX,DWORD PTR SS:[EBP+4]
  8.         IDIV DWORD PTR SS:[EBP+8]
  9.         MOV DWORD PTR SS:[EBP+4],EDX
  10.         MOV DWORD PTR SS:[EBP+8],EAX
  11.         PUSHFD
  12.         POP DWORD PTR SS:[EBP]
  13.         JMP @vmprotec_004B4B16
  14.  
  15. ;========================================================;
  16. ; idiv r/m16 ;
  17. ;========================================================;
  18.  
  19.         MOV DX,WORD PTR SS:[EBP]
  20.         MOV AX,WORD PTR SS:[EBP+2]
  21.         MOV CX,WORD PTR SS:[EBP+4]
  22.         SUB EBP,2
  23.         IDIV CX
  24.         MOV WORD PTR SS:[EBP+4],DX
  25.         MOV WORD PTR SS:[EBP+6],AX
  26.         PUSHFD
  27.         POP DWORD PTR SS:[EBP]
  28.         JMP @vmprotec_004B4B25
  29.  
  30. ;========================================================;
  31. ; idiv r/m8 ;
  32. ;========================================================;
  33.  
  34.         MOV AX,WORD PTR SS:[EBP]
  35.         MOV CL,BYTE PTR SS:[EBP+2]
  36.         SUB EBP,2
  37.         IDIV CL
  38.         MOV WORD PTR SS:[EBP+4],AX
  39.         PUSHFD
  40.         POP DWORD PTR SS:[EBP]
  41.         JMP @vmprotec_004B4B25
  42. flags FLAG_O ,FLAG_S ,FLAG_Z ,FLAG_A ,FLAG_C ,FLAG_P

Полная эмуляция ....

Sub эмулируется как add, not и изменение eflags, копать нужно в эту сторону

Code:
  1. ;основные логические инструкции Xor, Or, And, Not
  2.         MOV EAX,DWORD PTR SS:[EBP]
  3.         MOV EDX,DWORD PTR SS:[EBP+4]
  4.         NOT EAX
  5.         NOT EDX
  6.         AND EAX,EDX
  7.         MOV DWORD PTR SS:[EBP+4],EAX
  8.         PUSHFD
  9.         POP DWORD PTR SS:[EBP]
  10.         JMP @vmprotec_004B4B16
  11.  
  12. ;
  13.  
  14.         NOT DWORD PTR SS:[EBP]
  15.         MOV AX,WORD PTR SS:[EBP]
  16.         SUB EBP,2
  17.         AND WORD PTR SS:[EBP+4],AX
  18.         PUSHFD
  19.         POP DWORD PTR SS:[EBP]
  20.         JMP @vmprotec_004B4B25
  21.  
  22. ;
  23.  
  24.         MOV AX,WORD PTR SS:[EBP]
  25.         MOV DX,WORD PTR SS:[EBP+2]
  26.         NOT AL
  27.         NOT DL
  28.         SUB EBP,2
  29.         AND AL,DL
  30.         MOV WORD PTR SS:[EBP+4],AX
  31.         PUSHFD
  32.         POP DWORD PTR SS:[EBP]
  33.         JMP @vmprotec_004B4B25


-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 21 апреля 2010 15:07
· Личное сообщение · #9

int пишет:
Я нахожу все нужные инструкции одним глазом и тут же выделяю их подсветкой фона.

Ну, наверное у вас на ebp глаз наметан...

int пишет:
Вы задаёте этот вопрос, а что мешало взять две разные программы?

Немного не точно спросил, конечно, в разных программах, да и в одной программе, но в разных реализациях ВМ алгоритмы хеширования могут быть разные. Меня интересовали алгоритмы хеширования одних и тех же примитивов в одной реализации ВМ, но с разными опкодами (дубли). Пока, что я вижу, все дубли 100% одинаковы, вот и спросил, а не могут ли они отличаться только алгоритмом хеширования?

-----
Everything is relative...




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 21 апреля 2010 16:01
· Личное сообщение · #10

Vamit пишет:
но с разными опкодами (дубли).

Я бы не называл это дублям. Лучше алиасы. Ибо адрес обработчика всё равно один и тот же.

А вообще вот:
int пишет:
Иногда попадаются случаи, когда обработчики разные, но делают одно и тоже (если это конечно не было ошибкой моего анализа)

Дубль я видел лишь один раз для JMP_VM_ESP. Т.е. было два обработчика JMP_VM_ESP. Пруф могу дать. Т.е. это не было ошибкой анализа. Такой случай я действительно зафиксировал (только что проверил).

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




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 21 апреля 2010 17:14 · Поправил: Vamit
· Личное сообщение · #11

int пишет:
Лучше алиасы. Ибо адрес обработчика всё равно один и тот же.

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

-----
Everything is relative...




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 21 апреля 2010 20:16
· Личное сообщение · #12

Vamit
Я же давал скрипты для IDA, которые восстанавливают таблицу. Это в очередной раз упрёк, что с моим материалом вы ознакомились невнимательно. А тем временем уже есть новая версия, исправленная и дополненная.




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 21 апреля 2010 22:12
· Личное сообщение · #13

int пишет:
Я же давал скрипты для IDA, которые восстанавливают таблицу. Это в очередной раз упрёк, что с моим материалом вы ознакомились невнимательно.

Здесь вы что-то путаете, может быть только предлагали или упоминали о них, а получил я только doc файл с описанием примитивов. Да, внимательно его ещё не смотрел, т.к. сначала нужно было получить тела декомпилятором, что я и сделал, а затем сверить с вашими и написать для них шаблоны, что ещё предстоит сделать. А декомпилятор на счет дублей адресов я уже доработал, нечего ему впустую несколько раз ездить по одному примитиву...
int пишет:
А тем временем уже есть новая версия

Новая версия чего, не понял?

-----
Everything is relative...




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 21 апреля 2010 22:47
· Личное сообщение · #14

Vamit
В DOC-файле не только описания примитивов. Там были и скрипты для различных файлов для IDA, а также обзор служебных частей виртуальной машины. Новая версия - DOC-файл ест-но, исходные коды я не распространяю.




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 26 апреля 2010 08:33
· Личное сообщение · #15

С примитивами (обработчиками) VMProtect работа завершена, в логах есть вся инфа. Можно приступать к созданию промежуточного кода.

aaec_25.04.2010_CRACKLAB.rU.tgz - VmpPrimitive.rar

-----
Everything is relative...





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 30 апреля 2010 15:39
· Личное сообщение · #16

В принципе промежуточный код построен, есть ещё кое-какие нюансы, но до ума довести не сложно...
Столкнулся с такой проблемкой - промежуточный выход из ВМ (не знаю как правильно назвать).
Стек от ВМ полностью не чистится, нативные регистры в свое исходное состояние не восстанавливаются (кодируются) и осуществляется выход из ВМ в "мусорный" код, где регистры декодируются и выполняется кое-какой нужный код, например, вызов АПИ функции или какая-либо не эмулируемая инструкция или целый их пакет, затем идет вход обратно в ВМ и продолжение работы. Всё это делается естественно в сегменте кода ВМ, а не программы. Вопрос - как правильно поступать с какими вставками? Завершить создание промежуточного кода в такой точке и начать его декомпиляцию нельзя, т.к. "действие" ВМ не завершено. Напрашиваются два варианта:
1. Вставку как есть переносить в промежуточный код (модифицируя, конечно, eip для него).
2. Вставку анализировать (деобфусцировать) и чистый код вставки перенести в промежуточный код.
Затем продолжить анализ ВМ...
Может есть ещё какие варианты?

-----
Everything is relative...




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 30 апреля 2010 16:06
· Личное сообщение · #17

вариант 3: вставку деобфускировать и поместить в список, в промежуточный код просто вставить специальную мнимую инструкцию run_x86_block. Это разумно, ибо промежуточный код нельзя сворачивать в соседних блоках, это может привести к тому, что часть кода не свернётся.




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 30 апреля 2010 21:21
· Личное сообщение · #18

int
Вариант интересный, но не совсем правильный. Вставку на данном этапе посностью деобфускировать нельзя, т.к. нативные регистры кодируются внутри ВМ, а декодируются во вставке, поэтому код нужно рассматривать единым потоком. Далее, промежуточный код у меня строится полностью рабочим, т.е. в итоге ВМ на промежуточном этапе полностью заменяется этим кодом и он работоспособен, затем он единым потоком "декомпилируется" в окончательный рабочий код, который записывается на нужное место. Совместную свертку промежуточного кода, принадлежащего разным блокам ВМ, можно предотвратить простой маркировкой вставок. Кстати, при декомпиляции CodeVirtualizer я делаю именно так, но там всё намного проще - регистры не кодируются, выход из ВМ полный, вставка без обфускации. Поэтому я за вариант 2, хотя он на этом этапе и не самый простой...

-----
Everything is relative...




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 30 апреля 2010 21:47
· Личное сообщение · #19

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




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 06 мая 2010 16:42 · Поправил: Vamit
· Личное сообщение · #20

Промежуточный рабочий код для VmProtect получен. В аттаче правда не сам код, а лог его создания, но суть понятна. Можно приступать к его декомпиляции.
В процессе создания выявился один нюанс, вызов из ВМ АПИ фунции со съеденным в ИАТ адресом, т.к. на данном этапе восстановить ИАТ невозможно, то в промежуточный код вместо call [IatApi], записываю просто call addrApi; nop; работоспособность сохраняется, но что делать с этим дальше пока не знаю.

43d3_06.05.2010_CRACKLAB.rU.tgz - 44FCA8.rar

-----
Everything is relative...




Ранг: 22.3 (новичок)
Активность: 0.010
Статус: Участник

Создано: 06 мая 2010 19:22
· Личное сообщение · #21

Vamit
можно заюзать universal import fixer с опцией fix directly imports затем дампим и восст. импорт импреком как обычно




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 07 мая 2010 09:46
· Личное сообщение · #22

Некоторые теоретические соображения по декомпиляции промежуточного кода не зависимые от ВМ.
В принципе линейный (последовательный) асм код может выполнять одновременно две разные задачи, если он подготовлен для этого специальным образом.
Попробую показать это: Асм инструкции оперируют большей частью регистрами и константами (immediate). Одиночные константы в инструкциях практически не встречаются (не учитываем все команды передачи управления), а используются в совокупности с регистрами, поэтому их мы в расчет не берем. Остаются регисты и если иметь два набора регистров и "размешать" асм инструкции одного набора инструкциями другого набора, то такой код сможет выполнять одновременно две разные задачи.
Практическая реализация такого кода возможна в ВМ. Описывать как это делается я не буду, кто знаком с ВМ, тот поймет. Добавлю только, что в такой код можно добавить ещё и "мусор" (обфускировать), который никакой полезной работы не делает.
CodeVitrualizer - полезная работа кода одна (выполнение контекста защищенной функции) + "мусор"
VMProtect - полезных работ две (выполнение контекста защищенной функции + реализация защитных механизмов) + "мусор".
Наша конечная задача восстановить код контекста защищенной функции, всё остальное для этой задачи "мусор" и подлежит удалению. Это можно сделать двумя способами:
1. Академический - первоначально восстанавливаются оба рабочих кода (контекст + защита), затем защита удаляется. Плюс - можно отследить методы защиты. Минус - более полный разбор кода.
2. Практический - сразу выделяется только код контекста, остальное удаляется. Плюсы, минусы - противоположные от первого.
Далее, весь этот код может быть виртуализован (CV нет, VMP да), девиртуализацию необходимо делать при любом способе, иначе:
а). может быть потерян смысл восстановленного контекста
б). контекст может не поместиться в отведенное ему место
Хотелось бы услышать советы, как правильно поступить. И может быть у кого-нибудь имеются логические схемы виртуализации асм интрукций для VMP, общеизвестный метериал inside_VMProtect_Logic не предлагать.

-----
Everything is relative...





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 07 мая 2010 14:55 · Поправил: Vamit
· Личное сообщение · #23

Блин, блин, блин и ещё раз блин...
Только сейчас дошло, что промежуточный код VMP на стадии создания нужно было модифицировать следующим образом: убрать "стековый стакан", поместив регистры ВМ в статическую память промежуточного кода, "дерганья" ebp заменить простыми push, pop на вершине реального стека, например, примитив ShlLong, сейчас:
Code:
  1.          // mov    eax, dword ptr [ebp]
  2.          // mov    cl, byte ptr [ebp + 4]
  3.          // sub    ebp, 2
  4.          // shl    eax, cl
  5.          // mov    dword ptr [ebp + 4], eax
  6.          // pushfd
  7.          // pop    dword ptr [ebp]
  8.          // ->check SVM

мог бы быть
Code:
  1.          // pop    eax
  2.          // pop    cx
  3.          // shl    eax, cl
  4.          // push   eax
  5.          // pushfd

Плюсы:
- код намного проще и короче
- регистры ВМ имеют константную базу
- не нужна проверка наезда стека на регистры и их смещение
- и самое главное - промежуточный код становится идентичен коду CodeVirtualizer, для примера тот же ShlLong из него
Code:
  1.          // pop    cx
  2.          // shl    dword ptr [esp], cl
  3.          // pushfd

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

Всех с двойным праздником, Днем связи и Победы!!!

-----
Everything is relative...





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 13 мая 2010 22:02
· Личное сообщение · #24

Промежуточный код переделал, размер сократился с 246Кб до 95Кб...
Интерес к теме потерян, за 4 страницы ни одного дельного вопроса или предложения, а протестировать прогу никто не удосужился, так что адью гуд бай, когда разбудите может быть что-нибудь и доделаю.

-----
Everything is relative...





Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 13 мая 2010 22:41 · Поправил: daFix
· Личное сообщение · #25

Vamit пишет:
за 4 страницы ни одного дельного вопроса или предложения, а протестировать прогу никто не удосужился

Дело в том что многим просто нечего сказать по теме. На форуме не так уж и много людей, которые разбираются в
подобных вопросах, и большенство из них тут уже отписались.
Я как-то пытался тестить, об этом отписывал в аську.
Для многих ваша работа очень важна! ИМХО

-----
Research For Food




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 13 мая 2010 22:50
· Личное сообщение · #26

offtop
begin
Vamit пишет:
ни одного дельного вопроса или предложения


типичная для этого форума картина (человек начинает что-то выкладывать или спрашивать, а ему долго не отвечают), вот что могу сказать:
1) хороших реверсеров мало, катастрофически мало;
2) все умеют ценить своё время, но время других людей часто не ценят;
3) у всех разные интересы, а в реверс-инженерии направлений для деятельности - вагон (деление по платформам - x86/ARM/Sparc/etc., деление по разрядности - 16/32/64, деление по использованию разных ОС - Win/UNIX/MAC, деление по задачам - получение полных исходных кодов/взлом любым методом/распаковка/деобфускация и декомпиляция ВМ);
4) для многих реверс-инженерия это только хобби, а как говорится делу время, потехе - час, иными словами сегодня все заняты, а завтра прибежит 10 человек.

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

Далее, под дельными предложениями вы рассматриваете только те, которые сами считаете дельными. Практически все мои советы и предложения ушли в мусорный ящик, и ещё мне неинтересно помогать проекту, который, как я понял, коммерческий. Если нет, то помочь готов, но я больше люблю писать код, а не кидаться словами и рассуждать о вечном.

end.




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 13 мая 2010 23:46
· Личное сообщение · #27

Vamit пишет:
Интерес к теме потерян

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

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: 128.8 (ветеран), 21thx
Активность: 0.060.05
Статус: Участник

Создано: 14 мая 2010 06:32
· Личное сообщение · #28

Vamit

Интерес как раз и не потерян и я согласен с daFix пишет:
Дело в том что многим просто нечего сказать по теме

Не обращай внимания на хамские высказывания типа этого Bronco пишет:
но если потерян, закрывай топ и не еби мозги, ни себе ни людям..





Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 14 мая 2010 06:40
· Личное сообщение · #29

Интерес к теме есть. daFix +1. С одним сабжем неинтересно. Енд оффтоп




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 14 мая 2010 09:32
· Личное сообщение · #30

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

Вы же умный человек и сами понимаете, чтобы получить то, что хочешь, требуется перелопатить кучу материала и выбрать те крупицы, которые тебе подходят, поэтому каждое предложение назвать дельным язык как-то не поворачивается.
Практически все мои советы и предложения ушли в мусорный ящик
Ваша неправда, мне очень помог материал по обработчикам примитивов (съэкономил кучу времени, если на написание распознавателя CV ушел почти месяц, то для VMP это же было сделано менее чем за неделю).
мне неинтересно помогать проекту, который, как я понял, коммерческий.
Кто вам это сказал? Коммерческим был не сам проект, а серия прог под которые он делался и эта серия была успешно им обработана. С этим я и пришел на форум, а дальнейшее развитие пошло на полном энтузиазме, т.к. по VMP и Фиме у меня никаких практических целей кроме интереса нет.
то помочь готов, но я больше люблю писать код, а не кидаться словами и рассуждать о вечном.
+100, я тоже, но иногда и поговорить не мешает, светлые мысли бывает появляются просто "ниоткуда".
Есть такое дельное предложение, я готов сделать этот проект открытым для ограниченного круга заинтересованных людей, которые способны, могут и готовы помогать и вижу это в создании приватного SVN, но нужен ресурс и организатор. Сам проект для понимания непростой, начав его год назад (декомпиляция ВМ, а фактически ядро декомпилятора писалось с 2007 года), я уже сейчас во многом путаюсь, т.к. не любитель писать комменты, а некоторые моменты (кто пишет проги - тот знает) делаются эвристически и на конкретную цель, а уж потом, если потребуется, оформляются в законченное решение.
Одно могу сказать точно, используемые методы в большинстве своем подходят для любых декомпиляторов, но есть и недостатки, они мне хорошо известны и требуют устранения, причем не эвристически и на конкретную цель, а капитально, т.к. объем исходного кода подходит уже к 1.5Мб, и часто затронув одно боишься, как бы не сломать другое, хотя на сегодняшний день я все задачи декомпиляции распараллелил как между разными типами ВМ, так и по стадиям обработки.
Bronco пишет:
но если потерян, закрывай топ и не *** мозги, ни себе ни людям..

Каждый волен поступать так, как ему позволяет совесть и образование.... дальше без комментариев...
а тестировать на одном сабже
Nightshade пишет:
С одним сабжем неинтересно

Одним, понимать как тип ВМ (CV)? Да я могу понять что специально найти сабж, покрытый этой ВМ, проблематично. Но - с этим я пришел на форум, а в версию 1.2 был добавлен универсальный анализатор входов в любые ВМ и восстановитель импорта, проверок - 0, только Киореску кое-что не понравилось в формах ввода...
Короче, могу сказать так, что на одном энтузиазме, без должной поддержки сложно вести одновременно 3 проекта, среди которых есть и приносящие дополнительный постоянный доход...
А ВМ на сегодня - это просто хобби...

-----
Everything is relative...





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 14 мая 2010 12:42 · Поправил: mak
· Личное сообщение · #31

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

Или вот например ...

Vamit пишет:
Остаются регисты и если иметь два набора регистров и "размешать" асм инструкции одного набора инструкциями другого набора, то такой код сможет выполнять одновременно две разные задачи.Практическая реализация такого кода возможна в ВМ. Описывать как это делается я не буду, кто знаком с ВМ, тот поймет. Добавлю только, что в такой код можно добавить ещё и "мусор" (обфускировать), который никакой полезной работы не делает.CodeVitrualizer - полезная работа кода одна (выполнение контекста защищенной функции) + "мусор"VMProtect - полезных работ две (выполнение контекста защищенной функции + реализация защитных механизмов) + "мусор".


Это очень важный вывод .... тем более что он уже существует в более расширенном и сложном варианте.
Так что очень интересно =)

Bronco иммел ввиду что никто чьей то волей не управляет , и нечего жаловаться что нет овтетов , хотя может это месть за молчание)))

Также int заметил интересно , что некоторые вещи просто проигнорированы , причем это сказано в нескольких постах. Я так понял это не только от одного человека. Это ясно когда чел увлечен своим делом.

А еще если учитывать что кто то пишет свое , то тогда все ясно почему так.

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


Если в ответ будет какая то реакция хотябы иногда =) , то администрация краклаб предоставит организацию твоему проекту ...

И еще вопрос такой , почему бы не вывести функции деобфускации, для асма в отдельные возможности плагина ??? Это возможно ?

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube



<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 23 . 24 . >>
 eXeL@B —› Протекторы —› Декомпилятор ВМ
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати