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

Сейчас на форуме: mau-rus, asamoile (+1 невидимый пользователь)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Протекторы —› VMProtect antidebug trouble
. 1 . 2 . >>
Посл.ответ Сообщение

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

Создано: 15 января 2011 13:09 · Поправил: ADACH New!
Цитата · Личное сообщение · #1

Недавно пришлось копать утилиту накрытую VMProtect.
Для обхода антиотладки был написан скрипт, с помошью которого обходится антиотладка данного прота до версии 1.8.
Собственно вопрос: Что изменилось в антиотладке VMProtect после версии 1.8? (Так как с недавних пор использую Windows 7 x64 StrongOD мне не подойдет).

P.S.: Что бы не быть голословным прикрепил скрипт.

Всем спасибо. Задача решена.
Скрипт обновлен.
Code:
  1. /*
  2. Скрипт для обхода антиотладки VMProtect под Windows 7.
  3.  
  4. Требования:
  5.          OllyDbg с патчем от int (link: <a href="http://exelab.ru/f/index.php?action=vthread&forum=13&topic=15982#27)" target="_blank">http://exelab.ru/f/index.php?action=vthread&forum=13&topic=15982#27)</a>
  6.          Плагин Stealth64 c включенной опцией x64 Compatibility mode (последняя на данный момент версия 1.3 link: <a href="http://tuts4you.com/download.php?view.2425)" target="_blank">http://tuts4you.com/download.php?view.2425)</a>
  7.          Установить в настройках (Options->Debugging options, вкладка Events) опцию "Make first pause at" в System breakpoint 
  8. Внимание: Использование Hardware Breakpoints ведет к обнаружению отладчика
  9. */
  10. function getEP()
  11. {
  12.          local base = getModuleBase(0);
  13.          local offset = base;
  14.          base += readWord(base+0x3C);
  15.          base += 10 * 4;
  16.          offset += readDword(base);
  17.          return offset;
  18. }
  19.  
  20. function removeEPBreak()
  21. {
  22.          delSBP(getEP());
  23.          printf(getEP(),"EP bp cleared");
  24. }
  25.  
  26. function getSplicedCommandsBuffSize(commandsAddr)
  27. {
  28.          local buffSize = 0;
  29.          while(buffSize < 5)
  30.          {
  31.                  buffSize += dasmCmd(D_SIZE,commandsAddr+buffSize);
  32.          }
  33.          return buffSize;
  34. }
  35.  
  36. function makeSplice(to,from)
  37. {
  38.          local splicedCommandsBuffer = malloc(1024);
  39.          local size = getSplicedCommandsBuffSize(from);
  40.          local data = readData(from,size);
  41.          writeData(splicedCommandsBuffer,size,data);
  42.          asmCmd(splicedCommandsBuffer+size,format("jmp 0%X",from+size));
  43.          asmCmd(from,format("jmp 0%X",to));
  44.          while(size > 5)
  45.          {
  46.                  size--;
  47.                  writeByte(from + size,0x90);
  48.          }
  49.          return splicedCommandsBuffer;
  50. }
  51.  
  52. function Hide_ZwQueryInformationProcess()
  53. {
  54.          local funcAddr = getProcAddr("ZwQueryInformationProcess","ntdll.dll");
  55.          local myCode = malloc(1024);
  56.          /*
  57.                  cmp dword [esp+8+4],7 ;InfoClass: debugPort
  58.                         jz @_debugPort
  59.                  cmp dword [esp+8+4],0x1E ;InfoClass: debugObjectHandle
  60.                         jnz @_end
  61.          @_debugPort:
  62.                  test eax,eax ;if not success call...
  63.                         jnz @_end
  64.                  mov edx,[esp+C+4];fixing return value
  65.                  xor eax,eax
  66.                  mov [edx],eax
  67.                  mov edx,[esp+14+4];fixing return value size
  68.                  test edx,edx
  69.                         jz @_end
  70.                  add al,4
  71.                  mov dword [edx],eax
  72.                  xor eax,eax; return NT_SUCCESS
  73.          @_end:
  74.                  ;jmp splicedCode
  75.          */
  76.          local mySplice = [0x83, 0x7C, 0x24, 0x0C, 0x07, 0x0F, 0x84, 0x0B, 0x00, 0x00, 0x00, 0x83, 0x7C, 0x24, 0x0C, 0x1E, 0x0F, 0x85, 0x22, 0x00, 0x00, 0x00, 0x85, 0xC0, 0x0F, 0x85, 0x1A, 0x00, 0x00, 0x00, 0x8B, 0x54, 0x24, 0x10, 0x33, 0xC0, 0x89, 0x02, 0x8B, 0x54, 0x24, 0x18, 0x85, 0xD2, 0x0F, 0x84, 0x06, 0x00, 0x00, 0x00, 0x04, 0x04, 0x89, 0x02, 0x33, 0xC0];
  77.          while(true)
  78.          {
  79.                  if(dasmCmd(D_TEXT,funcAddr) == "ADD ESP,4")
  80.                         break;
  81.                  funcAddr += dasmCmd(D_SIZE,funcAddr);
  82.          }
  83.          writeData(myCode,mySplice.len(),mySplice);
  84.          asmCmd(myCode+mySplice.len(), format("jmp 0%X", makeSplice(myCode, funcAddr)));
  85.          printf(funcAddr,"Hidden: ZwQueryInformationProcess");
  86. }
  87.  
  88. function Hide_IsDebuggerPresent()
  89. {
  90.          local funcAddr = getProcAddr("IsDebuggerPresent","kernelbase.dll");
  91.          asmCmd(funcAddr,"xor eax,eax");
  92.          asmCmd(funcAddr+2,"retn");
  93.          printf(funcAddr,"Hidden: IsDebuggerPresent");
  94. }
  95.  
  96. function Hide_CheckRemoteDebuggerPresent()
  97. {
  98.          local funcAddr = getProcAddr("CheckRemoteDebuggerPresent","kernel32.dll");
  99.          funcAddr += asmCmd(funcAddr,"xor eax,eax");
  100.          funcAddr += asmCmd(funcAddr,"mov [esp+8],eax");
  101.          funcAddr += asmCmd(funcAddr,"inc eax");
  102.          funcAddr += asmCmd(funcAddr,"retn 8");
  103.          printf(funcAddr,"Hidden: CheckRemoteDebuggerPresent");
  104. }
  105.  
  106. function Hide_ZwClose()
  107. {
  108.          local funcAddr = getProcAddr("ZwClose","ntdll.dll");
  109.          
  110.          /*
  111.                  mov eax,[esp+4] ;handle validating
  112.                  push eax
  113.                  push esp
  114.                  push eax
  115.                  call kernel32.GetHandleInformation
  116.                  add esp,4
  117.                  test eax,eax ;if error
  118.                         jnz @_validHandle
  119.                  call kernel32.GetLastError
  120.                  cmp eax,6 ;if error equal to ERROR_INVALID_HANDLE
  121.                         jnz @_validHandle
  122.                  mov eax,0xC0000008 ;//status invalid handle
  123.                  retn 4
  124.          @_validHandle:
  125.                  ;jmp splicedCode
  126.          */
  127.          local mySplice = [0x8B, 0x44, 0x24, 0x04, 0x50, 0x54, 0x50, 0xE8, 0x11, 0xBD, 0x46, 0x75, 0x83, 0xC4, 0x04, 0x85, 0xC0, 0x0F, 0x85, 0x16, 0x00, 0x00, 0x00, 0xE8, 0x94, 0x11, 0x44, 0x75, 0x83, 0xF8, 0x06, 0x0F, 0x85, 0x08, 0x00, 0x00, 0x00, 0xB8, 0x08, 0x00, 0x00, 0xC0, 0xC2, 0x04, 0x00];
  128.          local myCode = malloc(mySplice.len());
  129.          writeData(myCode,mySplice.len(),mySplice);
  130.          asmCmd(myCode + 0x7, "call kernel32.GetHandleInformation");
  131.          asmCmd(myCode + 0x17, "call kernel32.GetLastError");
  132.          asmCmd(myCode+mySplice.len(), format("jmp 0%X", makeSplice(myCode, funcAddr)));
  133.          printf(funcAddr,"Hidden: ZwClose");
  134. }
  135.  
  136. function Hide_clearGlobalFlag()
  137. {
  138.          local bax = r.eax;
  139.          local bdx = r.edx;
  140.          local bip = r.eip;
  141.          local myCode = malloc(1024);
  142.          r.eip = myCode;
  143.          myCode += asmCmd(myCode,"mov eax,fs:[30]");
  144.          myCode += asmCmd(myCode,"add eax,0x68");
  145.          myCode += asmCmd(myCode,"xor edx,edx");
  146.          myCode += asmCmd(myCode,"mov [eax],edx");
  147.          
  148.          for(local i = 0; i < 4; i++)
  149.                  stepInto();
  150.          r.eax = bax;
  151.          r.eip = bip;
  152.          r.edx = bdx;
  153.          print("Global flag cleared");
  154. }
  155.  
  156. function Hide_ZwGetContextThread()
  157. {
  158.          local funcAddr = getProcAddr("ZwGetContextThread","ntdll.dll");
  159.          funcAddr = findOp(funcAddr,"83C404");
  160.          /*
  161.                  test eax,eax
  162.                         jnz @_end
  163.                  push ecx
  164.                  mov ecx,6
  165.                  mov edx,[esp+0C+4]
  166.          @_label:
  167.                  mov dword [edx+ecx*4],eax
  168.                  loopd short @_label
  169.                  pop ecx
  170.          @_end:
  171.          */
  172.          local mySplice = [0x85, 0xC0, 0x0F, 0x85, 0x10, 0x00, 0x00, 0x00, 0x51, 0xB9, 0x06, 0x00, 0x00, 0x00, 0x8B, 0x54, 0x24, 0x10, 0x89, 0x04, 0x8A, 0xE2, 0xFB, 0x59];
  173.          local myCode = malloc(mySplice.len());
  174.          writeData(myCode,mySplice.len(),mySplice);
  175.          asmCmd(myCode+mySplice.len(), format("jmp 0%X", makeSplice(myCode, funcAddr)));
  176. }
  177.  
  178. removeEPBreak();
  179. Hide_ZwQueryInformationProcess();
  180. Hide_IsDebuggerPresent();
  181. Hide_CheckRemoteDebuggerPresent();
  182. Hide_ZwClose();
  183. Hide_ZwGetContextThread();
  184. Hide_clearGlobalFlag();




Ранг: 255.8 (наставник)
Статус: Участник
vx

Создано: 15 января 2011 13:46 New!
Цитата · Личное сообщение · #2

ADACH
Зачем патчить стока стабов. Достаточно пропатчить шлюз(KiFastSystemCall, KiIntSystemCall etc.) и динамически определять необходимый сервис проверяя его Id, или поставить брейк на функции, прежде скопировав первую инструкцию в буфер и хэндлить фолт. И возвращать из функции ничего не нужно, достаточно возвратить нужный статус(например для псинфо STATUS_PORT_NOT_SET).



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

Создано: 15 января 2011 15:13 New!
Цитата · Личное сообщение · #3


Clerk пишет:
Достаточно пропатчить шлюз(KiFastSystemCall, KiIntSystemCall etc.) и динамически определять необходимый сервис проверяя его Id

Скорее всего так и сделаю в финальной версии скрипта. Благодарю.



Ранг: 101.0 (ветеран)
Статус: Участник

Создано: 16 января 2011 16:45 New!
Цитата · Личное сообщение · #4

ADACH
Олькин баг не забудьте учесть.



Ранг: 255.8 (наставник)
Статус: Участник
vx

Создано: 16 января 2011 16:48 New!
Цитата · Личное сообщение · #5

int
Что за баг ?



Ранг: 101.0 (ветеран)
Статус: Участник

Создано: 16 января 2011 17:08 New!
Цитата · Личное сообщение · #6

Любое исключение+PUSHF/POPF. Олька останавливается на исключении в любом случае и обрабатывает его. Даже если исключение стоит в списке игноров, и даже если выполнение идет в режиме RUN (в смысле не STEP IN/OVER), олька ставит хард бряк, если можно, если нельзя - софт бряк.

Два варианта лечения:
1. Использовать все хард бряки, чтобы олька не смогла их использовать (решение от Бронко). Т.к. вмпрот не проверяет софт бряк, то метод прокатывает.
2. Мой патч добавляет проверку на режим RUN (нет смысла в режиме RUN делать сброс флага TF на стэке, его все равно там не будет), а ещё пополняет список проверяемых инструкций добавляя POP SS.



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

Создано: 16 января 2011 21:33 New!
Цитата · Личное сообщение · #7

Патчить IsDebuggerPresent and ect конечно хорошо, но я начал сталкиватся когда протекторы проверяют их достоверность(SecuRom например так и поступает). Неплохо бы взять на контроль GetProcAddress.




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

Создано: 16 января 2011 21:42 New!
Цитата · Личное сообщение · #8

GetProcAddress проверять идея неполезная, основная часть протов её полностью эмулит.



Ранг: 101.0 (ветеран)
Статус: Участник

Создано: 16 января 2011 23:08 New!
Цитата · Личное сообщение · #9

Archer пишет:
основная часть протов её полностью эмулит

Вмпрот использует GPA от Мс-Рема, только с обфускацией (но без ВМ). Фиг знает, откуда у дерматолога сорсы этой реализации, но факт остается фактом.




Ранг: 533.6 (!)
Статус: Uploader
retired

Создано: 16 января 2011 23:22 New!
Цитата · Личное сообщение · #10

ADACH ваш плагин не обновлялся?



Ранг: 255.8 (наставник)
Статус: Участник
vx

Создано: 16 января 2011 23:54 New!
Цитата · Личное сообщение · #11

Archer
> основная часть протов её полностью эмулит.
Да не ужеле ?
Загрузчик занимает большую часть нтдлл. Физически это проэмулировать не возможно, не используя оригинал. Эта функция не только экспорт разбирает. Полнейший бред.



Ранг: 101.0 (ветеран)
Статус: Участник

Создано: 17 января 2011 00:22 New!
Цитата · Личное сообщение · #12

Вы это разработчикам протов скажите)



Ранг: 255.8 (наставник)
Статус: Участник
vx

Создано: 17 января 2011 00:41 New!
Цитата · Личное сообщение · #13

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



Ранг: 101.0 (ветеран)
Статус: Участник

Создано: 17 января 2011 00:57 New!
Цитата · Личное сообщение · #14

А это и не требуется - работает и так...



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

Создано: 17 января 2011 06:03 New!
Цитата · Личное сообщение · #15

ADACH
Глянь в сорцы ida stealth, дебугил с ним недавно 2.06




Ранг: 116.6 (ветеран)
Статус: Участник

Создано: 17 января 2011 06:26 New!
Цитата · Личное сообщение · #16

int пишет:
Вмпрот использует GPA от Мс-Рема, только с обфускацией (но без ВМ).

Не болтайте ерундой.



Ранг: 101.0 (ветеран)
Статус: Участник

Создано: 17 января 2011 08:49 New!
Цитата · Личное сообщение · #17

dermatolog
Что именно неверно?




Ранг: 116.6 (ветеран)
Статус: Участник

Создано: 17 января 2011 10:42 New!
Цитата · Личное сообщение · #18

int пишет:
Что именно неверно?

К счастью у меня хватает собственных знаний РЕ формата чтобы не использовать сторонние разработки.

P.S. В любом случае я пока ниразу не встречал на паблике исходники GPA, которые бы использовали для оптимизации бинарный поиск в отсортированном массиве имен (про х64 вообще молчу).




Ранг: 673.3 (! !)
Статус: Участник
CyberMonk

Создано: 17 января 2011 15:59 New!
Цитата · Личное сообщение · #19

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



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

Создано: 17 января 2011 17:13 New!
Цитата · Личное сообщение · #20

int пишет:
ADACH
Олькин баг не забудьте учесть.

Да в этом и была загвоздка. Спасибо.

Обновил шапку.

[offtop]
BoRoV пишет:
ADACH ваш плагин не обновлялся?

В течении месяца должен закончить новую версию.
[/offtop]

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


Ранг: 101.0 (ветеран)
Статус: Участник

Создано: 17 января 2011 18:01 New!
Цитата · Личное сообщение · #21

dermatolog
у меня другая информация, но оставим это...




Ранг: 116.6 (ветеран)
Статус: Участник

Создано: 17 января 2011 21:30 New!
Цитата · Личное сообщение · #22

int пишет:
у меня другая информация, но оставим это...

Детский сад - чесслово.



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

Создано: 17 января 2011 21:47 New!
Цитата · Личное сообщение · #23

вы ещё подеритесь, горячие финские парни




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

Создано: 17 января 2011 21:51 New!
Цитата · Личное сообщение · #24

ADACH пишет:
Всем спасибо. Задача решена

Запустить приложение накрытой вмпротом, под Олькой 1.10, в среде w7_x64, это даже не задача, а так небольшая забава, чтобы себя потешить....))))
Снять эту защиту по фуллу, задача не решённая, и для большинства не по уму.
Дерматологу респект!!!
//это искрене.



Ранг: 281.8 (наставник)
Статус: Участник
Destroyer of protectors

Создано: 17 января 2011 23:36 New!
Цитата · Личное сообщение · #25

Bronco пишет:
Снять эту защиту по фуллу, задача не решённая, и для большинства не по уму.

ИМХО если бы люди делились опытом и наработками по вмпроту то собрав по крупице уже давно разобрали бы всё - как все остальные проты, хоть одну статью толковую видели по нему? нуби выкладывал мувики, но они бесполезны как и его инструменты и скрипты, интересен сам процесс, а не результат)

Bronco пишет:
Дерматологу респект!!!





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

Создано: 18 января 2011 00:13 New!
Цитата · Личное сообщение · #26

MasterSoft
Статью, хех, а какой прок со статьи, крупицы они коварные, в кучу всеравно ничего не собрать толком. LCF-AT адекватно комментит свои скрипты, никто не мешает покопаться и в них даже чисто для интереса.



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

Создано: 18 января 2011 01:47 New!
Цитата · Личное сообщение · #27


Bronco пишет:
Запустить приложение накрытой вмпротом, под Олькой 1.10, в среде w7_x64, это даже не задача, а так небольшая забава, чтобы себя потешить....))))

Так я и реверсингом занимаюсь для собственного удовольствия и здоровья ради.

Bronco пишет:
Снять эту защиту по фуллу, задача не решённая, и для большинства не по уму.

Когда-то и AsProtect считался сильной защитой. Ровно до того момента, когда стал по настоящему массово популярен и обратил на себя внимание.

ElCrabe пишет:
Статью, хех, а какой прок со статьи, крупицы они коварные, в кучу всеравно ничего не собрать толком.

Тут вы ошибаетесь: ведь благодаря статьям можно в разы быстрее разобраться в теме, да и что-то да удастся собрать в одной статье.



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

Создано: 18 января 2011 12:54 New!
Цитата · Личное сообщение · #28

ADACH
Vmp тоже популярен, конечно не так как фимка, но всё же. В аспре не было такой вм, как есть сейчас. Собсно их-то никому разбирать и не охото что в одном, что в другом и это факт, проще взять и прицепить ее дамп к итоговому таргету.




Ранг: 533.6 (!)
Статус: Uploader
retired

Создано: 18 января 2011 13:00 New!
Цитата · Личное сообщение · #29

ElCrabe пишет:
Собсно их-то никому разбирать и не охото что в одном, что в другом и это факт, проще взять и прицепить ее дамп к итоговому таргету.

Да ладно, много кто занимается декомпиляцией этих вм.



Ранг: 500.5 (!)
Статус: Участник

Создано: 18 января 2011 13:03 · Поправил: Smon New!
Цитата · Личное сообщение · #30

ElCrabe пишет:
проще взять и прицепить ее дамп к итоговому таргету.

Во первых придётся долго повозиться с антидампами, во вторых - распаковка далеко не самое важное мероприятие во взломе, я бы даже сказал - необязательное


. 1 . 2 . >>
 eXeL@B —› Протекторы —› VMProtect antidebug trouble

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