Русский / Russian English / Английский

Сейчас на форуме:
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Протекторы —› Декомпилятор ВМ
<< 1 ... 18 . 19 . 20 . 21 . 22 . 23 . 24 .
Посл.ответ Сообщение


Ранг: 331.2 (мудрец)
Статус: Участник

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

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

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

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

{ Атач доступен только для участников форума } - VMSweeperLst.rar


Ранг: 306.2 (мудрец)
Статус: Участник
Advisor

Создано: 23 сентября 2018 12:24 New!
Цитата · Личное сообщение · #2

ClockMan пишет:
под вм запихнул

интересно посмотреть как это реализовано, сиськи под виртой это круто, гипервизор в ауте.


Ранг: 563.8 (!)
Статус: Участник
оптимист

Создано: 23 сентября 2018 12:57 New!
Цитата · Личное сообщение · #3

Bronco пишет:
интересно посмотреть как это реализовано, сиськи под виртой это круто, гипервизор в ауте

--> Encore karaoke v3.22 <--


Ранг: 306.2 (мудрец)
Статус: Участник
Advisor

Создано: 23 сентября 2018 14:14 New!
Цитата · Личное сообщение · #4

ClockMan пишет:
--> Encore karaoke v3.22 <--

ща никак, на мобиле нет дебагера..


Ранг: 331.2 (мудрец)
Статус: Участник

Создано: 23 ноября 2018 10:54 · Поправил: Vamit New!
Цитата · Личное сообщение · #5

Давно ничего не писал в эту тему, вот обещанное когда-то...

Особенности структуры ВМ в VmProtect 3.1 и 3.2 (архитектура х86)
1. "Плавающие" регистры ВМ.
Три системных регистра ВМ: SVM - стек ВМ, PICODE - указатель на ленту пикода, OFFPRM - кодированное смещение обработчика примитива, могут размещаться в любом из 3х регистров ЦПУ esi, edi, ebp.
2. Примитивы ВМ:
- регистры eax, ecx, edx в примитивах разнозначны, это говорит о том что один и тот же примитив может быть реализован на разных регистрах.
- добавлены 3 NAND примитива для разных размеров инструкций (byte, word, dword).
- добавлено 5 примитивов смены вм, осуществляющих перемещение системных регистров ВМ.
3. Условные переходы.
Стековая реализация изменена на регистровую с NAND/NOR примитивами. Загружаются два возможных адреса перехода, затем анализируемые флаги преобразуются к маске 00000000/FFFFFFFF, маска применяется к переходам, результат дает адрес перехода.
4. Изменены некоторые шаблоны виртуализации инструкций.
- NAND/NOR примитивы равнозначны, каждая логическая инструкция может виртуализоваться любыми из них или их комбинацией.
5. Исполнение ВМ.
- на каждом безусловном переходе может осуществляться смена вм (изменение системных регистров, направление ленты пикода, изменение базы OFFPRM, алгоритм кодирования адреса примитива).
- так же смена вм может выполняться при каждом входе в вм после выполнения невиртуализованных вызовов функций или инструкций кода.
- Vmp 3.2 имеет уникальный алгоритм кодирования адреса каждого примитива.

Всё остальное осталось старым и было описано ранее.

| Сообщение посчитали полезным: plutos, ELF_7719116, HandMill, 4kusNick, daFix, ClockMan, v00doo, mushr00m


Ранг: 416.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 23 ноября 2018 11:39 New!
Цитата · Личное сообщение · #6

Vamit пишет:
Загружаются два возможных адреса перехода, затем анализируемые флаги преобразуются к маске 00000000/FFFFFFFF, маска применяется к переходам, результат дает адрес перехода.

здесь можно немного поподробней??


Ранг: 331.2 (мудрец)
Статус: Участник

Создано: 23 ноября 2018 12:58 · Поправил: Vamit New!
Цитата · Личное сообщение · #7

ELF_7719116
Можно и подробней на конкретном примере...
Обфускация и прочая хрень тут удалены, приведен чистый код пары виртуализованных инструкций, а сколько тут удалено хрени можно увидеть по адресам инструкций - они линейны
Code:
  1. test reg, 0x100
  2. jz addr
  3.  
  4. инструкция test
  5. 02810163:  svm_3 = and rvm_04, 0x00000100
  6. её флаги
  7. 0281018F:  rvm_38 = iEFL
  8. выделение нужного флага для условного перехода
  9. 0281019C:  svm_4 = and ~rvm_38, 0x00000040
  10. 028101BB:  svm_5 = shr svm_4, 6
  11. получение маски перехода
  12. 028101C9:  rvm_10 = svm_5 + 0xFFFFFFFF
  13. 028101DC:  svm_7 = not rvm_10, rvm_10
  14. здесь уже из NAND примитивов девиртуализованы and инструкции
  15. применение полученной маски к адресам переходов по пикоду
  16. 028101FE:  svm_9 = and svm_7, 0x00EAB6CE
  17. 02810225:  svm_11 = and rvm_10, 0x00EAB760
  18. получение конкретного адреса перехода
  19. 02810257:  svm_12 = svm_11 + svm_9
  20. 028102C2:  jmp 0x02810373
  21.  
  22. итог
  23. 02810163:  test rvm_04, 0x00000100
  24. здесь уже реальный адрес перехода по девиртуализованному коду
  25. 028102C2:  jz 0x02810373


Ранг: 329.3 (мудрец)
Статус: Участник

Создано: 23 ноября 2018 18:59 · Поправил: difexacaw New!
Цитата · Личное сообщение · #8

ELF_7719116

> здесь можно немного поподробней??

Условие в условном ветвлении - его опкод xor 1(опкод обратных условий отличается на единицу). Такой смысл полагаю.


Ранг: 563.8 (!)
Статус: Участник
оптимист

Создано: 28 ноября 2018 00:20 New!
Цитата · Личное сообщение · #9

Vamit пишет:
Давно ничего не писал в эту тему, вот обещанное когда-то...

Особенности структуры ВМ в VmProtect 3.1 и 3.2 (архитектура х86)
1. "Плавающие" регистры ВМ.
Три системных регистра ВМ: SVM - стек ВМ, PICODE - указатель на ленту пикода, OFFPRM - кодированное смещение обработчика примитива, могут размещаться в любом из 3х регистров ЦПУ esi, edi, ebp.
2. Примитивы ВМ:
- регистры eax, ecx, edx в примитивах разнозначны, это говорит о том что один и тот же примитив может быть реализован на разных регистрах.
- добавлены 3 NAND примитива для разных размеров инструкций (byte, word, dword).
- добавлено 5 примитивов смены вм, осуществляющих перемещение системных регистров ВМ.
3. Условные переходы.
Стековая реализация изменена на регистровую с NAND/NOR примитивами. Загружаются два возможных адреса перехода, затем анализируемые флаги преобразуются к маске 00000000/FFFFFFFF, маска применяется к переходам, результат дает адрес перехода.
4. Изменены некоторые шаблоны виртуализации инструкций.
- NAND/NOR примитивы равнозначны, каждая логическая инструкция может виртуализоваться любыми из них или их комбинацией.
5. Исполнение ВМ.
- на каждом безусловном переходе может осуществляться смена вм (изменение системных регистров, направление ленты пикода, изменение базы OFFPRM, алгоритм кодирования адреса примитива).
- так же смена вм может выполняться при каждом входе в вм после выполнения невиртуализованных вызовов функций или инструкций кода.
- Vmp 3.2 имеет уникальный алгоритм кодирования адреса каждого примитива.

Всё остальное осталось старым и было описано ранее.

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

Ранг: 315.2 (мудрец)
Статус: Модератор
CrackLab

Создано: 17 октября 2019 02:03 New!
Цитата · Личное сообщение · #10

интересуют пруфы на разные генераторы/оптимизаторы/ир и дальнейшей компиляции например в х86, помимо ллвм, и есть ли такие есть в природе, либо что почитать на эту тему, но не теоретические талмуды с одной водой.
Code:
  1. что бы вместо такого(обфускации тут нет никакой):
  2.  int x = 0x75375375;
  3.  int y = 0x95195195;
  4.  int r = ~ (((~ x) & (~ x)) & (((~ y) & (~ y)))) & (((~ x) & (~ y)));
  5.  
  6. и идеале наблюдать такое:
  7.   int r = x^y;

конпиль студии например пишет практически "как есть", конпиль дельфи совсем не оптимизирует ничего.


Ранг: 524.8 (!)
Статус: Участник
Победитель турнира 2010

Создано: 17 октября 2019 10:24 New!
Цитата · Личное сообщение · #11

по мотивам
http://0xeb.net/2018/03/using-z3-with-ida-to-simplify-arithmetic-operations-in-functions/

попробовал засунуть в z3 и дважды упростить

Code:
  1. from z3 import *
  2.  
  3. = BitVec('x',32)
  4. = BitVec('y',32)
  5. = BitVec('r',32)
  6. n1 = simplify((((~ x) & (~ x)) & (((~ y) & (~ y)))) & (((~ x) & (~ y))))
  7. print n1
  8. n2 = simplify(n1)
  9. print n2
  10. = Solver()
  11. s.add(n1 == r)
  12. s.add(== 0x75375375)
  13. s.add(== 0x95195195)
  14. print(s.check())
  15. = s.model()
  16. print(hex(z[r].as_long()))


Чуток упростилось, но не до идеала. Второе упрощение ничего дополнительно не дает. Посчитало конечно верно.

Code:
  1. ~(~(~x | ~y) | ~(| y))
  2. ~(~(~x | ~y) | ~(| y))
  3. sat
  4. 0xe02e02e0L

| Сообщение посчитали полезным: plutos, bartolomeo, mak, SReg, ELF_7719116, HandMill


Ранг: 416.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 18 октября 2019 15:10 New!
Цитата · Личное сообщение · #12

собственно, этот тонкий момент, когда сгенерированный лучами вагон кода переносим из IDA для оптимизации и упрощения - обычно используется студия с настроенным на максимальную оптимизацию компилем а-ля intel parallel studio? или уже существуют проверенные, более прогрессивные варианты решения задачи?

Ранг: 8.0 (гость)
Статус: Участник

Создано: 18 октября 2019 17:02 · Поправил: Orlyonok New!
Цитата · Личное сообщение · #13



как-то так, символический решатель Maple

Ранг: 589.6 (!)
Статус: Модератор

Создано: 18 октября 2019 19:37 New!
Цитата · Личное сообщение · #14

Orlyonok
неправильно введено выражение. в исходнике инверсия, а не отрицание.

Ранг: 8.0 (гость)
Статус: Участник

Создано: 18 октября 2019 21:02 New!
Цитата · Личное сообщение · #15

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

По крайней мере в C выражение ~ (x & y) & (x | y) даёт тот же результат, как и исходник.


Ранг: 89.6 (постоянный)
Статус: Участник

Создано: 23 октября 2019 14:12 · Поправил: Boostyq New!
Цитата · Личное сообщение · #16

Orlyonok пишет:
символический решатель Maple

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


Ранг: 329.3 (мудрец)
Статус: Участник

Создано: 26 октября 2019 22:52 New!
Цитата · Личное сообщение · #17

Boostyq

Солвер ?
Подружка, может вы думаете что это инструмент от бога и может решить что угодно ?

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


Ранг: 324.3 (мудрец)
Статус: Участник

Создано: 27 октября 2019 17:12 New!
Цитата · Личное сообщение · #18

difexacaw
Как раз-таки, я думаю, она думает наоборот


Ранг: 89.6 (постоянный)
Статус: Участник

Создано: 28 октября 2019 15:34 · Поправил: Boostyq New!
Цитата · Личное сообщение · #19

difexacaw пишет:
Подружка

Мда, дурак и не лечится.
Настолько ярое желание докопаться до моих сообщений, что он даже не читает их, прежде чем отвечать свой бред.
difexacaw пишет:
Свернуть примитивные выражения можно

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

| Сообщение посчитали полезным: DenCoder, SReg



Ранг: 329.3 (мудрец)
Статус: Участник

Создано: 28 октября 2019 19:01 New!
Цитата · Личное сообщение · #20

Boostyq

Да не переживай так, я ведь просто пример спросил. Решать то что не решается, имхо пустая трата времени. Хотя некоторые может и тратят на это кучу времени, это их заработок.)
<< 1 ... 18 . 19 . 20 . 21 . 22 . 23 . 24 .
 eXeL@B —› Протекторы —› Декомпилятор ВМ

Видеокурс ВЗЛОМ