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

Сейчас на форуме:
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · 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();

Ранг: -1.5 (нарушитель)
Статус: Участник

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

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

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


Ранг: 551.1 (!)
Статус: Участник
оптимист

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

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

Ранг: -1.5 (нарушитель)
Статус: Участник

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

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

вмваря 8.х

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

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

От модератора: не умеешь правкой пользоваться? ну давай я за тебя
<< . 1 . 2 .
 eXeL@B —› Протекторы —› VMProtect antidebug trouble

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