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

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

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

Создано: 15 января 2011 13:09 · Поправил: ADACH
· Личное сообщение · #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/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 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

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

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



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

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


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

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



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

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

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



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

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

int
Что за баг ?



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

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

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

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



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

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

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




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

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

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



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

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

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

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




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

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

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

-----
Лучше быть одиноким, но свободным © $me




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

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

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



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

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

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



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

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

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



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

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

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



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

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

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




Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

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

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

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



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

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

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




Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

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

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

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

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




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

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

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

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




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

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

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

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

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

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

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

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

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

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

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




Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

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

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

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



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

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

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




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

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

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

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

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




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

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

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

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

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





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

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

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



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

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


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

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

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

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

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

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



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

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

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




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

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

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

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

-----
Лучше быть одиноким, но свободным © $me




Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

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

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

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

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels



. 1 . 2 . >>
 eXeL@B —› Протекторы —› VMProtect antidebug trouble
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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