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

 eXeL@B —› Протекторы —› VMProtect (Туторы, скрипты, плагины, ...)
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . >>
Посл.ответ Сообщение


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

Создано: 18 марта 2010 11:56 · Поправил: kioresk
· Личное сообщение · #1

Решил создать отдельную тему по VMProtect'у, чтобы собирать в одном месте информацию по этому проту и обсуждать детали.

Для начала ответ на самый распространенный вопрос.

1. Почему OllyDbg вылетает при запуске программы, защищенной VMProtect'ом?

Потому что VMProtect использует баг с переполнением буфера в старых версиях dbghelp.dll, из-за которого отладчик падает. Чтобы обойти его необходимо исправить баг в dbghelp.dll или положить в папку отладчика новую версию файла dbghelp.dll, который можно взять из комплекта Debugging Tools for Windows:

http://www.microsoft.com/whdc/devtools/debugging/default.mspx

Добавлено

Microsoft включил дистрибутив Debugging Tools в состав пакета Windows SDK (который весит достаточно прилично), поэтому вот альтернативные ссылки на:

1. Дистрибутив Debugging Tools v6.12.2.633 x86 от 26.02.2010 (18,3 Мбайт)

2. Только библиотека dbghelp.dll из дистрибутива Debugging Tools v6.12.2.633 x86 (0,5 Мбайт)



Ранг: 5.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 сентября 2016 16:01
· Личное сообщение · #2

MasterSoft, поставил, происходит ошибка, может галочки, не так поставил?
--> Link <--



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 14 сентября 2016 17:18
· Личное сообщение · #3

zolodei пишет:
поставил, происходит ошибка, может галочки, не так поставил?

ещё галку на NtSetInformationThread

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


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

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

zolodei пишет:
поставил, происходит ошибка, может галочки, не так поставил?

А какой бряк ты ставишь? Если софт, то вмпрот их палит, нужен хард, и его ставить без разницы куда.

-----
Everything is relative...




Ранг: 5.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 сентября 2016 01:04
· Личное сообщение · #5

А как поставить "Set memory breakpoint on access" на секцию кода 00401000 в "Memory map" в версий OllyDBG v2.01?
И не подскажите, как сделать, чтоб в "Memory map OllyDBG v2.01" секций отображались как в "Memory map OllyDBG v1.10"?


a8dc_20.09.2016_EXELAB.rU.tgz - VMP.jpg




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

Создано: 20 сентября 2016 21:14
· Личное сообщение · #6

///offtop///
интересно если какое либо онлайн П0
будет снабжено adware модулем по сбору инф.и отправке на сервер автора П0 в режиме демо
но при покупке в режиме фул этот модуль будет отключён,далее данную поделку накроют вм и отправят на vtotal
то работникам АВ компаний придётся изучить данный софт и выдвинуть вердикт через минут 5 мы увидим результат,я предпологаю его оставят как полезное ПО и не станут разворачивать и глядеть что в нутри потому что нет времяни на всё это прав ли я или нет?




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

Создано: 21 сентября 2016 00:44
· Личное сообщение · #7

script_kidis пишет:
прав ли я или нет?

Не прав

-----
Research For Food


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


Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 21 сентября 2016 03:40
· Личное сообщение · #8

script_kidis, на первичной проверке уйдёт, как adware downloader, т.к. подозрительная активность на лицо. Копаться в вм для этого не нужно.

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


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

Создано: 21 сентября 2016 04:22
· Личное сообщение · #9

Да и сэндбоксы они не просто так себе пишут.

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

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 28 октября 2016 07:47
· Личное сообщение · #10

модуль проги, (dll), залочен vmp (файл1), унпакер выкинул два файла (DLLLoader.exe) и (ххх.clm.module), прога и модуль работают только с S..SEL.ck, как определить кто из этих двух просит ключег? если лоадер то чем прикрутить другой лоад к модулю? лоадер есть, почему унпакер разрезал длл?

eb5c_28.10.2016_EXELAB.rU.tgz - скрин.png



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 28 октября 2016 12:29
· Личное сообщение · #11

uncown пишет:
прога и модуль работают только с S..SEL.ck, как определить кто из этих двух просит ключег?

SenseLock? Кто подгрузит hid.dll, тот виновен.



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

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

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



Ранг: 2.4 (гость), 6thx
Активность: 0=0
Статус: Участник

Создано: 14 ноября 2016 02:57 · Поправил: alexcoder1
· Личное сообщение · #13

Привет всем! Оказывается на днях поломал VMProtect. Сделал это, конечно, через одно место, сначала сделал, а затем разбирался что же такое ломал. Заранее прошу прощения если мои методы покажутся топорными. Начну изложение.
Исследование пациента и поиск OEP. Распаковка секций программы происходит внутри виртуальной машины ее байт-кодом. В момент когда искал OEP, я этого еще не понимал, думал просто жуткая обфускация. Поэтому поступил следующим способом. В OllyDbg поставил условные аппаратные бряки на версии GetModuleHandle(Ex,A,W) (в Olly 2.01). В условии указал [esp]>=401000&&[esp]<4d0000, остановка по условию. Бряк произошел на функции GetModuleHandleW. Вышел из функции и вуаля, я где-то в начале кода программы. Задампил процесс, загрузил дамп в IDA, текущий EIP использовал пока что в качестве OEP. В IDA при помощи перекрестных ссылок нашел вызов функции, из которой вызывается GetModuleHandleW, это и оказалось начало программы с настоящей EP. Зная OEP, поставил на него аппаратный бряк при следующем запуске Olly и я на месте. Теперь еще раз сделал дамп, но уже с настоящей OEP и загрузил его в IDA. На этот раз код раскрасился как новогодняя елка – определились сигнатуры Delphi, а после применения FLIRT определилось почти все.
Передо мной не стояла задача снятия протектора, нужно было исследовать метод генерации кода. Поэтому импорт не восстанавливал и не получал рабочую версию программы, хотя с восстановлением импорта были бы проблемы. Протектор (я пока еще не знал какой) заменяет все вызовы API на ближние вызовы в свою секцию, где пропускает их через свою обфускационную матрицу, в которой заново формирует стек для вызова и уже потом вызывает функцию API. Я не придумал ничего лучше чем залогировать все вызовы API по библиотекам. Для этого определяется список статически импортируемых модулей (на момент загрузки программы). Для каждого модуля для конкретной ОС определяются импортируемые функции. То есть, если программа исследуется на 7ке, то и адреса функций нужно получать на 7ке. Я применил DependencyWalker. Открываем в нем исследуемую программу, и по очереди переходим к каждой импортируемой библиотеке. В окне экспортируемых функций библиотеки выделяем их все, нажимаем Ctrl+A, Ctrl+C, создаем текстовый файл с именем этой библиотеки обязательно в формате kernel32.dll.txt, user32.dll.txt и т.д. и в эти файлы заносим имена соответствующих функций этих библиотек. Далее все эти имена нужно преобразовать в списки точек останова для Olly Breakpoint Manager v0.1.
Все эти txt файлы должны находиться в одной папке. Я написал программу (просьба не пинать за ужасный стиль программирования, быдлокодер из меня знатный), исходник в файле kernel.cpp, обычное Win32 приложение. Она по очереди открывает все txt файлы в своей папке, построчно читает из них имена функций, ищет эту функцию в dll с именем до .txt и преобразовывает найденный адрес в точку останова для Olly Breakpoint Manager v0.1. То есть например был файл kernel32.dll.txt с содержимым:
Code:
  1. ActivateActCtx
  2. AddAtomA
  3. AddAtomW
  4. AddConsoleAliasA
  5. AddConsoleAliasW


Получили kernel32.dll.obp:
Code:
  1. kernel32:00015458:K[ESP]:ADDR:[ESP]<40000000
  2. kernel32:0002ED56:K[ESP]:ADDR:[ESP]<40000000
  3. kernel32:0002CDEC:K[ESP]:ADDR:[ESP]<40000000
  4. kernel32:000B6BEE:K[ESP]:ADDR:[ESP]<40000000
  5. kernel32:000B6B84:K[ESP]:ADDR:[ESP]<40000000


Нужно только ввести букву, которой кодируются флаги Pause program (never, on condition, always), log expression, log arguments, как они кодируются можно почитать в описании к плагину. Каждый бит отвечает за какой-то переключатель, эти биты складываются в байт и ASCII-символ этого байта и передается программе Для чего служат параметры, указанные через двоеточия, строки останова также можно также ознакомиться в описании плагина.
Условие [ESP]<40000000 необходимо поскольку без него логирутся вызовы всех функций, даже когда они вызываю друг друга из разных системных библиотек, это сильно замедляет программу и усложняет анализ. Одна беда: Olly Breakpoint Manager v0.1 по умолчанию не позволяет ставить условия на точки останова! Поэтому пришлось его модифицировать, чтобы понимал. Но сделал только на половину – на чтение из файла (такое я ленивое существо). Данный плагин идет с исходниками, нужно только заменить модифицированный файл olly_bp_man.c. Кстати, Olly Breakpoint Manager я тестировал под Olly 1.10. Итак, когда плагин скомпилирован и подключен, сформированы все obp файлы, загружаем в olly исследуемую программу, и по очереди загружаем в плагин obp-файлы (все сразу не советую, слишком замедляется программа, может сработать защита по времени исполнения). Переходим в Log, перенаправляем его в файл, я использовал kernel32.txt для функций kernel32.dll и так далее, и запускаем программу. В результате получаем примерно следующий лог:
Code:
  1. 750F4992  COND: ADDR = 00409A49
  2. 750F4992  CALL to GetSystemInfo from cm17F.00409A44
  3.             pSystemInfo = 0018FF1C
  4. 750F51EB  COND: ADDR = 004CB077
  5. 750F51EB  CALL to GetCommandLineW from cm17F.004CB072
  6. 750F0E00  COND: ADDR = 004025A6
  7. 750F0E00  CALL to GetStartupInfoA from cm17F.004025A1
  8.             pStartupinfo = 0018FEF8
  9. 750F177C  COND: ADDR = 004CB08B
  10. 750F177C  CALL to GetACP from cm17F.004CB086
  11. 750F1430  COND: ADDR = 004CB09F
  12. 750F1430  CALL to GetCurrentThreadId from cm17F.004CB09A
  13. 750F442F  COND: ADDR = 00409A59
  14. 750F1AC5  COND: ADDR = 0040BEDB
  15. 750F1AC5  CALL to GetVersionExW from cm17F.0040BED6
  16.             pVersionInformation = 0018FE2C
  17. 750F1836  COND: ADDR = 004029CF
  18. 750F1836  CALL to VirtualAlloc from cm17F.004029CA
  19.             Address = NULL
  20.             Size = 13FFF0 (1310704.)
  21.             AllocationType = MEM_COMMIT
  22.             Protect = PAGE_READWRITE
  23. 750F4918  COND: ADDR = 004080DF
  24. 750F4918  CALL to GetModuleFileNameW from cm17F.004080DA
  25.             hModule = 00400000 (cm17F)
  26.             PathBuffer = 0018DCE0
  27.             BufSize = 20A (522.)
  28. 750F4918  COND: ADDR = 00408F59
  29. 750F4918  CALL to GetModuleFileNameW from cm17F.00408F54
  30.             hModule = NULL
  31.             PathBuffer = 0018DACA
  32.             BufSize = 105 (261.)

При помощи регулярных выражений отделяем название функции и адрес ее вызова и в IDA вручную меняем их. Их, кстати, получилось не более двух сотен разных на все библиотеки. Теоретически после этого шага можно восстанавливать импорт, но я не стал.
Когда определены сигнатуры функций Delphi при помощи FLIRT и вызовы WinAPI, я начал искать вычисление кода. Flirt даже определил метод Click кнопки регистрации, я поставил бряк на метод @Controls@TControl@GetText$qqrv, определенный им же. И вот тут то меня ждал сюрпайз. После получения введенного кода управление передавалось на нечто жутко обфусцированное и непонятное. После нескольких попыток протрассировать это вручную стал думать. В результате использовал инструмент Trace into из olly 2. Трассировал с аппаратными бряками. Проверка кода заняла более 300K инструкций x86! Начал изучать эти логи. Сначала пытался удалить незначащие инструкции и разобраться с алгоритмом, обнаружил что они часто повторяются, даже писал программу, которая удаляет строки из лога с EIP незначащих команд (эта программа промежуточное звено, потом она выпадает, и становится ненужной). Это немного сократило код и позволило найти общие закономерности, в частности начало каждой виртуальной команды. Затем начал разбирать что же делают эти команды. Оказалось виртуалка – это стековая машина по типу сопроцессора. Кроме стека есть область памяти, которую я назвал блоком регистров, состоящая из 16ти 32-х битных ячеек памяти. Все это хозяйство организовано в реальном стеке программы. На вершину стека виртуалки всегда указывает EBP. ESI играет роль EIP виртуальной машины. (Нет никакой гарантии, что в другой программе назначение регистров останется таким же). Основные команды: положить в стек числа разной разрядности, извлечь, косвенно положить (по адресу из вершины), косвенно извлечь (адрес в памяти и извлекаемое значение на вершине стека). Основными математико-логическими операциями являются NAND (Not-And) и ADD. Есть еще умножение, деление. Математические и логические операции могут производиться над 32-х битными целыми и 16-ти битными (я их назвал half). После каждой математической или логической операции кроме результата в стек записываются и флаги процессора. Практически всегда они извлекаются из стека в блок регистров и затем затираются, но при проверке условия как раз при помощи флагов и формируется адрес перехода. Условных переходов нет, есть только безусловный переход на адрес из вершины стека, а этот адрес уже формируется по флагам операций. Таким образом мне удалось вычислить для каждой виртуальной команды адреса eip ее реальных команд. В среднем на одну виртуальную команду приходится 60-100 реальных. Поэтому написал программу, которая заменяет блоки реальных команд на виртуальные, она находится в файле module1.vb, и которая для всех команд вытаскивает из текста их реальные операнды и результаты работы команд. Также кроме непосредственной замены сделал небольшую оптимизацию: после всех математических команд удалял извлечение флагов и помечал куда извлекается в комментарии математической/логической команды и явно пустые команды помечал в начале знаком #(на всякий случай не удалял). В результате получился подобный листинг:
Code:
  1. 0053440C: PUSHM (008DBA98)
  2. 0053440A: PUSH ST0                                          ;008DBA98
  3. 00534408: NOTAND                                            ;Before: st0 = 008DBA98, st1 = 008DBA98. After: st0=FLAGS, st1 = FF724567 FLAGS-->0000003C(00200282)
  4. 00534405: PUSHM 00000018(F007549B)
  5. 00534403: PUSH ST0                                          ;F007549B
  6. 00534401: NOTAND                                            ;Before: st0 = F007549B, st1 = F007549B. After: st0=FLAGS, st1 = 0FF8AB64 FLAGS-->0000002C(00200202)
  7. 005343FE: NOTAND                                            ;Before: st0 = 0FF8AB64, st1 = FF724567. After: st0=FLAGS, st1 = 00051098 FLAGS-->00000028(00200202)
  8. 005343FB: PUSHM (008DBA98)
  9. 005343F9: PUSHM 00000018(F007549B)
  10. 005343F7: NOTAND                                            ;Before: st0 = F007549B, st1 = 008DBA98. After: st0=FLAGS, st1 = 0F700164 FLAGS-->0000002C(00200202)




Ранг: 2.4 (гость), 6thx
Активность: 0=0
Статус: Участник

Создано: 14 ноября 2016 02:59 · Поправил: alexcoder1
· Личное сообщение · #14

Code:
  1. 005343F4: NOTAND                                            ;Before: st0 = 0F700164, st1 = 00051098. After: st0=FLAGS, st1 = F08AEE03 FLAGS-->0000002C(00200286)
  2. 005343F1: POPM 0000002C(F08AEE03)
  3. 005343EF: PUSHI E4462EAD
  4. 005343EA: ADDT                                              ;Before: st0 = E4462EAD, st1 = 1C0A1FC1. After: st0=FLAGS, st1 = 00504E6E FLAGS-->00000028(00200203)
  5. 005343E7: PUSHM 00000034(00000000)
  6. 005343E5: ADDT                                              ;Before: st0 = 00000000, st1 = 00504E6E. After: st0=FLAGS, st1 = 00504E6E FLAGS-->00000018(00200202)
  7. 005343E2: PUSHHALFINDIRECT FROM 00504E6E VAL 00004FA6
  8. 005343E1: ADDHALF                                           ;Before: op1 = 00004FA6, op2 = 0000B062. After: st0=FLAGS, st1' = 0008 FLAGS-->00000018(00200203)
  9. 005343DE: PUSHM 0000002C(F08AEE03)
  10. 005343DC: POPMHALF                                          ;adr = 0000003C, val = 0000EE03
  11. 005343DA: PUSHSTADR                                         ;st0 = 0018F520
  12. 005343D9: LOADHALF                                          ;Before: st0 = 0018F520. After st0' = F08A
  13. 005343D8: SHLT                                              ;Before: st0 = F08AF08A, st1' = 0008. After: st0=FLAGS, st1 = 8AF08A00 FLAGS-->00000014(00200286)
  14. 005343D5: PUSHIHALF 9B6A
  15. 005343D2: PUSHI 5B910DD4
  16. 005343CD: PUSHI E4C00295
  17. 005343C8: PUSHIHALF 6502
  18. 005343C5: PUSHI A4D11512


В команде указан ее адрес (ESI), удобно ставить аппаратный бряк на доступ к этой ячейки и опа – мы остановились в нужном месте.
PUSH/POP/ADD/NOTAND/SHL/SHR/DIV/MUL… понятно из названия.
Суффикс M – команда работает с локальной памятью (блок регистров) или в команде или в комментариях указан адрес регистра
Суффикс I (PUSHI) – записать в стек непосредственное значение, хранится в самой команде
Суффикс HALF – команда работает с половинным (16 бит) числом.
Суффикс T или никакого – команда работает с 32-х битным числом.
Суффикс INDIRECT – откуда загружать или куда выталкивать значение находится в вершине стека (а уже в команде или комментарии указано что, откуда и куда)
Суффикс BYTE – команда работает с байтом (но в стеке или блоке регистров он все равно будет занимать 2 байта, а использоваться только один).
Полный список команд можно посмотреть в module1.vb. Каждый регексп в начале – это команда. Но для другой программы эти данные нужно будет получать заново, поскольку адреса реальных команд будут другими, мусорные команды также будут другими.
Таким образом список из 300000+ команд превратился всего в несколько тысяч, которые уже можно исследовать.
Еще полезной функцией может оказаться логирование всех команд без операндов. Этот способ хуже поддается анализу, но он намного быстрее. Заключается в следующем. У меня, к примеру каждая команда начинается кодом, в котором производится выборка и декодирование:
Code:
  1. main  004DD456                    INC CX                                                              ECX=004DE544
  2. main  004DD459                    ADC CL,AL                                                           ECX=004DE5C4
  3. main  004DD45B                    PUSHAD                                                              ESP=0018F410
  4. main  004DD45C                    MOV AL,BYTE PTR DS:[ESI-1]              [005CE948]=86               EAX=0018F486
  5. main  004DD45F                    RCL CL,1                                                            ECX=004DE588
  6. main  004DD461                    LEA ECX,[ESI+B0842D5B]                                              ECX=B0E116A4
  7. main  004DD467                    JMP 004DD5AF
  8. main  004DD5AF                    SHL CH,3                                                            ECX=B0E1B0A4
  9. main  004DD5B2                    XOR AL,BL                                                           EAX=0018F479
  10. main  004DD5B4                    ROL CX,CL                                                           ECX=B0E10A4B
  11. main  004DD5B7                    INC CL                                                              ECX=B0E10A4C
  12. main  004DD5B9                    CMP AH,DL
  13. main  004DD5BB                    BSR CX,BX                                                           ECX=B0E1000F
  14. main  004DD5BF                    ADD AL,2F                                                           EAX=0018F4A8
  15. main  004DD5C1                    LEA ECX,[ECX+A6C37C28]                                              ECX=57A47C37
  16. main  004DD5C7                    ROR AL,7                                                            EAX=0018F451
  17. main  004DD5CA                    BTR CX,2                                                            ECX=57A47C33
  18. main  004DD5CF                    ADD AL,0F1                                                          EAX=0018F442
  19. main  004DD5D1                    NOT CX                                                              ECX=57A483CC
  20. main  004DD5D4                    XOR BL,AL                                                           EBX=C99F89BD
  21. main  004DD5D6                    PUSHFD                                  [0018F40C]=0018F480         ESP=0018F40C
  22. main  004DD5D7                    NOT CX                                                              ECX=57A47C33
  23. main  004DD5DA                    PUSH E09323E7                           [0018F408]=cm17F.004DE543   ESP=0018F408
  24. main  004DD5DF                    PUSHFD                                  [0018F404]=0                ESP=0018F404
  25. main  004DD5E0                    MOVZX EAX,AL                                                        EAX=00000042
  26. main  004DD5E3                    NOT CH                                                              ECX=57A48333
  27. main  004DD5E5                    BSWAP CX                                                            ECX=57A40000
  28. main  004DD5E8                    MOV ECX,DWORD PTR DS:[EAX*4+4E0F10]     [004E1018]=AA151327         ECX=AA151327
  29. main  004DD5EF                    CALL 004C4EEF                                                       ESP=0018F400
  30. main  004C4EEF                    DEC ESI                                                             ESI=005CE948
  31. main  004C4EF0                    JMP 004DDBE0
  32. main  004DDBE0                    PUSHFD                                  [0018F3FC]=0018F410         ESP=0018F3FC
  33. main  004DDBE1                    SUB ECX,A9C73BB7                                                    ECX=004DD770
  34. main  004DDBE7                    PUSH DWORD PTR SS:[ESP+4]               [0018F400]=cm17F.004DD5F4   ESP=0018F3F8
  35. main  004DDBEB                    CLC
  36. main  004DDBEC                    CMP DI,0A0FC
  37. main  004DDBF1                    PUSH DWORD PTR SS:[ESP+4]               [0018F3FC]=00200206, UNICODE "d MMM yyyy";ESP=0018F3F4
  38. main  004DDBF5                    ADD ECX,0
  39. main  004DDBFB                    PUSH DWORD PTR SS:[ESP]                 [0018F3F4]=00200206, UNICODE "d MMM yyyy";ESP=0018F3F0
  40. main  004DDBFE                    MOV DWORD PTR SS:[ESP+3C],ECX           [0018F42C]=0018F480
  41. main  004DDC02                    MOV BYTE PTR SS:[ESP+14],4D             [0018F404]=86
  42. main  004DDC07                    PUSH EBP                                [0018F3EC]=8141E72E         ESP=0018F3EC
  43. main  004DDC08                    PUSH DWORD PTR SS:[ESP+40]              [0018F42C]=cm17F.004DD770   ESP=0018F3E8
  44. main  004DDC0C                    RETN 44                                 [0018F3E8]=cm17F.004DD770   ESP=0018F430

Далее за retn 44 выполняется сама команда. Эта команда имеет всегда один адрес. На него во втором Olly можно поставить аппаратный бряк с экспрешном типа: _CMD=[ESP], _ESI=ESI,_EBP=EBP,S1=[EBP],S2=[EBP+4],S3=[EBP+8],S4=[EBP+0C]
Получается лог:
Code:
  1. 004DDC0C  HARD: _CMD = 4DCEBB (5099195.)
  2.                 _ESI = 53AEA3 (5484195.)
  3.                 _EBP = 18DE60 (1629792.)
  4.                 S1 = 0
  5.                 S2 = C9D95B74 (3386465140.)
  6.                 S3 = 18DE6C (1629804.)
  7.                 S4 = 2371370 (37163888.)
  8. 004DDC0C  HARD: _CMD = 4DE543 (5104963.)
  9.                 _ESI = 53AEA1 (5484193.)
  10.                 _EBP = 18DE64 (1629796.)
  11.                 S1 = C9D95B74 (3386465140.)
  12.                 S2 = 18DE6C (1629804.)
  13.                 S3 = 2371370 (37163888.)
  14.                 S4 = 0
  15. 004DDC0C  HARD: _CMD = 4DD770 (5101424.)
  16.                 _ESI = 53AE9C (5484188.)
  17.                 _EBP = 18DE60 (1629792.)
  18.                 S1 = 36BD5F24 (918380324.)
  19.                 S2 = C9D95B74 (3386465140.)
  20.                 S3 = 18DE6C (1629804.)
  21.                 S4 = 2371370 (37163888.)
  22. 004DDC0C  HARD: _CMD = 4DCEBB (5099195.)
  23.                 _ESI = 53AE9B (5484187.)
  24.                 _EBP = 18DE60 (1629792.)
  25.                 S1 = 203 (515.)
  26.                 S2 = 96BA98 (9878168.)
  27.                 S3 = 18DE6C (1629804.)
  28.                 S4 = 2371370 (37163888.)

А затем при помощи fnames.vb
получается лог вида
Code:
  1. 0053AEA3: POPM                STACK: 00000000    745BD9C96CDE180070133702
  2. 0053AEA1: PUSHI               STACK:     745BD9C96CDE18007013370200000000
  3. 0053AE9C: ADDT                STACK: 245FBD36 745BD9C9   6CDE180070133702
  4. 0053AE9B: POPM                STACK: 03020000    98BA96006CDE180070133702
  5. 0053AE99: POPM                STACK: 98BA9600    6CDE18007013370200000000
  6. 0053AD08: JUMP                STACK: 381F6100    00000000745BD9C900000000
  7. 004FAA40: CALLOUT             STACK: 98BA9600    17020000354E4E0070133702

Числа в стеке в перевернутом виде как они находятся в памяти.
Такой метод у меня позволил одним махом вычислить в каких участках программы используется виртуализация.
Вспомогательные программы писались на vb.net и Си.
Приношу свои извинения за сумбурность изложения и быдлокод.

Добавлено спустя 1 минуту
Что-то не вижу аттача с файлами, еще раз прикрепляю

9347_14.11.2016_EXELAB.rU.tgz - attach.rar

| Сообщение посчитали полезным: mak, v00doo, oldman, AlisaDarkCoder


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

Создано: 14 ноября 2016 10:35
· Личное сообщение · #15

alexcoder1
Это только верхушка айсберга, почитайте эту тему - https://exelab.ru/f/action=vthread&forum=13&topic=15906 здесь вмпрот разобран практически полностью.

-----
Everything is relative...


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

Ранг: 4.6 (гость), 1thx
Активность: 0=0
Статус: Участник

Создано: 24 ноября 2016 02:47 · Поправил: djdram
· Личное сообщение · #16

наткнулся на 64 разрядное приложение накрыто VMP
помниться игрался с olly и скриптом от LCF-AT а тут кинулся а olly та уже не та ) 64 разрядные не хочет...
судя по всему стоит проверка на отладчик, приложение консольное на C++
Detect-It-Easy
https://yadi.sk/i/mV2qr4cQzLTat
Отладчик
https://yadi.sk/i/mMQBMQGVzLTmj
Само приложение
https://yadi.sk/d/P8Tyza-NzLUmW
есть возможность у кого нибудь глянуть может по горячим следам кто что вспомнит как снять, или уходить в чтиво из поста выше по 64 разрядным я так понимаю пока не много инфы..



Ранг: 30.2 (посетитель), 31thx
Активность: 0.060
Статус: Участник

Создано: 24 ноября 2016 08:16
· Личное сообщение · #17

djdram пишет:
Само приложение


29/56 детектов на вирустотале. Zcash miner накрыли вмпротом? o_O

djdram пишет:
64 разрядным я так понимаю пока не много инфы..


в паблике вроде нету по декомпиляции 64 битного вмпрота, а самому что-то такое пилить - лень до
неприличия. Приходится работать напрямую, без снятия, как в игрушках с денувой.
С денувой в качестве антидебага для х64дбг помогает scylla hide, и titanhide (+ тулза для отключения
патчгварда).

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

Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 15 декабря 2016 19:42
· Личное сообщение · #18

Приведенный Djeck'ом на стр. 5 в пакете VMProtect_Inline пример
запакованного анпакми Unpackme_vmp.exe ловит у меня в системе WinXP
отладчик уровня ядра и требует его выгрузить. Вопрос: а что это такое
и как это сделать?
Когда я отключил в примере обнаружение отладчика, анпакми распаковался автоматически
скриптом от LCF-AT и в WinXP, где распаковывался, запускается без разговоров,
а на Win7 выдаёт строчку с access violation, но дальше работает: идёт видео и музыка!




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

Создано: 15 декабря 2016 19:53
· Личное сообщение · #19

ksol пишет:
скриптом от LCF-AT и в WinXP, где распаковывался, запускается без разговоров,
а на Win7 выдаёт строчку с access violation

скрирь LCF-AT многого не учитывает

-----
IZ.RU


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

Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 15 декабря 2016 20:15
· Личное сообщение · #20

DenCoder пишет:
скрирь LCF-AT многого не учитывает

Похоже, но другого у меня нет.




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

Создано: 16 декабря 2016 00:43
· Личное сообщение · #21

IMAGE FILE EXECUTION OPTIONS, либо драйвер и делайте с вашим файлом что хотите

-----
IZ.RU




Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 16 декабря 2016 19:36
· Личное сообщение · #22

Попытался поправить IAT, но всё не просто!
Скрипт находит ОЕР=46D008, а в конце своей работы перенастраивает программу
на новую ОЕР=ЕЕ13А0 в созданную им секцию. В туторе Djeck загоняет в Scylla 1-ю ОЕР.
Изменение в заголовке PE header адрес ЕР хотя и останавливает в OllyDbg на нужном
адресе, но ведёт к АВОСТу.
--------------------------------------
DenCoder пишет:
делайте с вашим файлом что хотите

Ваше сообщение требует ещё распаковки!



Ранг: 26.9 (посетитель), 1thx
Активность: 0.050.01
Статус: Участник

Создано: 21 декабря 2016 14:46 · Поправил: Chris
· Личное сообщение · #23

ksol пишет:
скриптом от LCF-AT и в WinXP, где распаковывался, запускается без разговоров,
а на Win7 выдаёт строчку с access violation

Это одна из распространённых проблем работы скрипта.
Сама LCF-AT на такой же вопрос отвечает так:

"so unpacked VMP files can make trouble to run them on other OS.Problems for this can be any wrong found & fixed APIs (can happen if random 4 byte opcode are same as a API does use).Lets say the XP opcode of GetModuleHandle API was found somewhere then this location gets fixed by script and filled by reading and settings imports which are same on your Unpack OS if dll was also loaded with same base.If you now run it on other OS then the location gets also filled with actually system address of GetModuleHandle API which is a other address = other opcodes but if this location is really no API location and VMP does access this location then you get a problem.But this just happens rarly but could be one reason which you can keep in your mind.
If you the script does ask you about the OEP rebuild then do this at the OEP address or at the end of the resource section (if used) before it does jump to OEP.Remember that you have to find the right OEP address if the script didn't find it (check videos again).So you also don't need to dump or fix your target so the script does this already.
The last part about CPUID etc you need to check by yourself if you do test your dump on other OS / Systemconfiguration.If such checks are used then you need to find the right check locations and patch them with the datas you got at same address on your unpack OS."




Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 23 декабря 2016 18:10
· Личное сообщение · #24

Новая точка ОЕР, созданная скриптом, оказывается, вполне подходит для анализа
таблицы IAT. Скрипт LCF-AT перегоняет IAT в созданную для этого секцию IAT_SEC_ и
там же устанавливает свою ОЕР.
Утилита ImpREC принимает эту ОЕР и раскрывает таблицу IAT.



Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 11 января 2017 18:29
· Личное сообщение · #25

===== Найти украденные байты ====
LCF-AT в туторе VMProtect Ultra Unpacker рассматривает анпакми VMProtect 1.70.4 .
Запустив свой скрипт, анпакми выходит на инструкцию вблизи ОЕР. Скрипт сообщает,
что байты вблизи ОЕР украдены. Автор по стеку, и ещё по чему-то, о чём он не говорит,
ухитряется найти их, но как он это сделал - не показывает, лишь приводит результат.
Видно, он как-то восстановил их ассемблерный код - это самый главный момент!
А дальше более или менее понятно: компилирование, вставил в свободное место и
передал им управление.
Может кто знает и скажет какая здесь стратегия поиска?!



Ранг: 10.1 (новичок), 1thx
Активность: 0=0
Статус: Участник

Создано: 29 января 2017 00:51
· Личное сообщение · #26

Нужна помощь !
Попалась на днях прога, накрытая VMпротом. Нормально сдампилась, OEP неукраден, IAT виртуализирован, но ручками прекрасно восстановился. Остались кое-какие функции виртуализированными. Попробовал натравить на это дело VMSweeper 1.5, но декомпилятор вылетает на простых инструкциях типа CMOVx, CWD, SCAS, AAD, XLAT и других
Может кто подскажет другой декомпилятор под этот прот и желательно под 2-ю ольку(она более удобна в работе, по-моему)



Ранг: 134.1 (ветеран), 246thx
Активность: 0.220.1
Статус: Участник
realist

Создано: 29 января 2017 01:22
· Личное сообщение · #27

LazyCat
в паблике другого декомпилятора вм не существует

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

Ранг: 10.1 (новичок), 1thx
Активность: 0=0
Статус: Участник

Создано: 29 января 2017 01:36
· Личное сообщение · #28

Спасибо за оперативный ответ. Жаль, конечно, что Vamit больше не развивает свой продукт, да и LCF-AT отказался далее работать с этим протом. Ну а с прогой придется завязать, т.к. ради одной паршивой проги нет желания тратить кучу времени на написание своего декомпилятора




Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 29 января 2017 05:56
· Личное сообщение · #29

LazyCat пишет:
Vamit больше не развивает свой продукт


в топе по VMSweeper было указано, что:

Vamit пишет:
WMSweeper доведен до релиза 2.0, успех полной декомпиляции вмпрота с созданием исходного кода составляет более 90%.
*скип*
Новой версии Свипера в свободном доступе по определенным причинам не будет но если кому-то что-то потребуется декомпильнуть - обращайтесь.


Vamit пишет:
Так, по просьбам на декомпиляцию, чтобы не тратить ни мое ни ваше время:
1. выкладываем только нужный файл и либы для него, если такие имееются, ссылки на полный софт мне не нужны и инсталлировать его я всё равно не буду
2. сообщаем ОЕП и адреса декомпилируемых фунок, искать всё это в проге я тоже не буду
3. оказываю помощь только в декомпиляции фунок и предоставляю их исходный код, всё остальное дело ваших рук и головы
4. будьте готовы на скромное вознаграждение
5. если не предоставлена нужная информация, то реагировать на такие запросы так же не буду


Vamit пишет:
Наконец-то появилось время и реальная необходимость заняться новыми версиями вмпротекта. Начиная с версии 3.0 вмпрот имеет новую безцикловую вм. Изменения настолько серьезны что нужно писать новый анализатор вм до промкода.


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


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

Создано: 04 февраля 2017 15:57 · Поправил: Haoose-GP
· Личное сообщение · #30

[ По просьбам трудящихся удалено... =( ]

Vamit
Зачем протектор распространять в форуме протекторов? Хм...

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


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

Создано: 04 февраля 2017 17:03
· Личное сообщение · #31

Haoose-GP
И зачем же здесь протекторы распространять

-----
Everything is relative...


| Сообщение посчитали полезным: SReg
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . >>
 eXeL@B —› Протекторы —› VMProtect (Туторы, скрипты, плагины, ...)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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