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

 eXeL@B —› Протекторы —› Декомпилятор ВМ
<< 1 ... 18 . 19 . 20 . 21 . 22 . 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...





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

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

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

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

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





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

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

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

--> Encore karaoke v3.22 <--

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





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

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

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

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

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





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

Создано: 23 ноября 2018 10:54 · Поправил: Vamit
· Личное сообщение · #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 имеет уникальный алгоритм кодирования адреса каждого примитива.

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

-----
Everything is relative...


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

Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

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

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

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




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

Создано: 23 ноября 2018 12:58 · Поправил: Vamit
· Личное сообщение · #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


-----
Everything is relative...





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

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

ELF_7719116

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

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

-----
vx





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 28 ноября 2018 00:20
· Личное сообщение · #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.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 17 октября 2019 02:03
· Личное сообщение · #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;

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




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 17 октября 2019 10:24
· Личное сообщение · #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


-----
127.0.0.1, sweet 127.0.0.1


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

Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

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

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



Ранг: 8.0 (гость), 5thx
Активность: 0.010.02
Статус: Участник

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



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



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

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

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

-----
старый пень




Ранг: 8.0 (гость), 5thx
Активность: 0.010.02
Статус: Участник

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

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

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




Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

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

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

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

-----
В облачке многоточия





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

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

Boostyq

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

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

-----
vx





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

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

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

-----
IZ.RU





Ранг: 90.1 (постоянный), 89thx
Активность: 0.290.56
Статус: Участник

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

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

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

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

-----
В облачке многоточия


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


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

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

Boostyq

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

-----
vx



<< 1 ... 18 . 19 . 20 . 21 . 22 . 23 . 24 .
 eXeL@B —› Протекторы —› Декомпилятор ВМ
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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