Сейчас на форуме: (+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();





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

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

MasterSoft пишет:
уже давно разобрали бы всё - как все остальные проты, хоть одну статью толковую видели по нему?

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

-----
Everything is relative...




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

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

dermatolog пишет:
Детский сад - чесслово.

Я не знаю, что там вы дописывали, но антиотладка и некоторые идеи уж точно не ваши. Баг с int 3/popfd вы наверно даже объяснить не сможете. С этим тоже будете спорить? А про GetProcAddress я сказал, т.к. реализация этой функции не была публичной насколько я знаю. Если вам очень интересно закончить этот спор, могу выложить реализацию Мс-Рема и вашу в двух вариантах - с обфускацией и без обфускации. И да, в этом коде нет ничего гениального, знание формата PE вполне достаточно.




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

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

int пишет:
Я не знаю, что там вы дописывали, но антиотладка и некоторые идеи уж точно не ваши. Баг с int 3/popfd вы наверно даже объяснить не сможете.

Мне уже порядком надоело ваше словоблудие. Предлагаю такой вариант - я объясняю вам этот баг до мелочей + любую другую идею, которая использована в VMProtect (на ваш выбор). Если я смогу это все объяснить - вы публично приносите мне свои извинения и навсегда покидаете этот форум. Согласны?




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

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

dermatolog прекращаем мерянье незнамо чем. бага с int 3/popfd была продана/подарена вам одним из обитателем этого форума на счёт GPA не в курсе. да и какая нахрен разница? надоели уже разборки.

-----
[nice coder and reverser]




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

Создано: 18 января 2011 19:34 · Поправил: Clerk
· Личное сообщение · #6

> бага с int 3/popfd была продана/подарена вам одним из обитателем этого форума
Вы наверно шутите. Подобных кривых мест более чем не желательно. Здесь не прав ни автор тулзы, так как большая часть её реверсится автоматически при желании, ни те, кто с этим не согласен, так как автор тоже приложил некоторые силы для реализации. Совсем другое что это очередное УГ и нет смысла это пиарить.



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

Создано: 17 октября 2012 13:47
· Личное сообщение · #7

Скрипт который здесь представлен, под какой он плагин для оли? или вообще не для оли?
На самом деле вопрос шире - как пофиксить антиотладку для оли и вмпротекта?
что не пробую под win7 x64 все вмпротект ругается на отладчик.
если пускать под win xp x32 под виртуалкой - то ругается на виртуалку.
заколдованный круг какойто
отдельно поставить win xp нет возможности.



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 17 октября 2012 13:57
· Личное сообщение · #8

shura_kr

Задрали уже своей x64. уже раз 10 писали, ставьте XP для взлома и нее*ите мозг ни себе ни остальным.

| Сообщение посчитали полезным: schokk_m4ks1k, vnekrilov, sivorog

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

Создано: 17 октября 2012 13:59
· Личное сообщение · #9

shura_kr
для скрытия отладчика, используй плаг для первой ольки StrongOD + постав галки на все эксепшены и будет тебе счастье)
по поводу запуска прог под вмпротом, на виртуалке, читай в гугле, сам находил не так давно)



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

Создано: 17 октября 2012 14:06
· Личное сообщение · #10

schokk_m4ks1k пишет:
shura_kr
для скрытия отладчика, используй плаг для первой ольки StrongOD + постав галки на все эксепшены и будет тебе счастье)
по поводу запуска прог под вмпротом, на виртуалке, читай в гугле, сам находил не так давно)

все плагины перепробовал результат ноль.
у меня наверно глаз замылился - не могу найти по виртуалке и вмпроту




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

Создано: 17 октября 2012 14:10
· Личное сообщение · #11

shura_kr
а какая у вас виртуальная машина?

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




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

Создано: 17 октября 2012 14:28 · Поправил: Модератор
· Личное сообщение · #12

ClockMan пишет:
shura_kr
а какая у вас виртуальная машина?

вмваря 8.х

не так искал в нете. нашел
--> Link <--

и под виртуалкой с winxp 32 с одим лишь strongod дебагер не детектится

От модератора: не умеешь правкой пользоваться? ну давай я за тебя


<< . 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 » Выход » ЛС
   Для печати Для печати