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

 eXeL@B —› Основной форум —› непонятные опкоды
Посл.ответ Сообщение

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

Создано: 26 августа 2009 00:00 · Поправил: ufo_maniac
· Личное сообщение · #1

разбираю тут одну дээлельку в IDA, одна функция никак не поддается, непонятные опкоды встречаются.
вот пример:
Code:
  1.                 pop     edx
  2.                 pop     ecx
  3.                 pop     ebx
  4.                 pop     eax
  5.                 cmp     [ebp+8], esi
  6.                 jnz     short loc_1000396A
  7.                 mov     [ebp-40h], esi
  8.                 mov     dword ptr [ebp-4], 4
  9.                 push    ebx
  10.                 mov     ebx, 0
  11.                 mov     eax, 1
  12. ; ---------------------------------------------------------------------- -----
  13.                 db  0Fh
  14.                 db  3Fh ; ?
  15.                 db    7
  16.                 db  0Bh
  17. ; ---------------------------------------------------------------------- -----
  18.                 test    ebx, ebx
  19.                 setz    byte ptr [ebp-4Ch]
  20.                 pop     ebx
  21.                 mov     [ebp-4], edi
  22.                 mov     eax, [ebp-40h]
  23.                 jmp     short loc_1000395F
есть еще три кусочка кода непонятных, два тоже с OF 3F начинаются, а один с 0F B8.
в функе есть указатели на строки, упоминающие виртуальные машины.
судя по всему в функции детектится как-то, не под виртуалкой ли она работает.
в Symantec'овской презентации "Attacks on Virtual Machine Emulators" есть такой кусочек текста:

Detecting VirtualPC:

- IDT/GDT at high memory address
- Non-zero LDT
- 0F 3F opcode
- 0F C7 C8 opcode
- Overly long instruction
- Device names


то есть с помощью опкода 0F 3F детектится VirtualPC?
а как? что этот опкод делает? и почему IDA Pro 5.2 его не понимает?



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 26 августа 2009 00:26
· Личное сообщение · #2

ufo_maniac пишет:
то есть с помощью опкода 0F 3F детектится VirtualPC?а как? что этот опкод делает? и почему IDA Pro 5.2 его не понимает?

Это байты - несуществующей команды процессора, изза этого ида их и не распознает. Когда этот код выполняется под виртуалкой, то выполнение такой инструкции вызывает исключение. Виртуалка перехватывает его и выполняет какой-то код изменяя значения регистров. Если виртуалки нет, то это исключение поймает обработчик в самой твоей DLL. Вот так и определяется есть виртуалка или нет.

-----
Реверсивная инженерия - написание кода идентичного натуральному




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

Создано: 26 августа 2009 01:42 · Поправил: ufo_maniac
· Личное сообщение · #3

Hexxx пишет:
Это байты - несуществующей команды процессора
...

спасибо, с твоей помощью разобрался.
сначала функа детектит VМware (c помощью "магического числа" 564D5868h и порта 5658h), потом детектит VirtualPC (LDT и GDT проверяет), потом детектит QEMU, потом еще что-то...
вот тут статья о детекте виртуалок:
pferrie.tripod.com/papers/attacks2.pdf
в общем, для моих целей эти дела можно занопить и продолжать,
а тему можно закрыть. еще раз спасибо!


 eXeL@B —› Основной форум —› непонятные опкоды
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати