суббота, 25 июля 2009 г.

Virtual Machine of RLPack v1.20.1full

Цель:
Показать устройство виртуального процессора , который используется в опции "Виртуализация кода" RLPack v1.20.1f

Описание:

Одна виртуальная машинная инструкция описывается структурой из трех DWORD-ов,где 1-й это код операции, а два втоорых дополнительных, которые могут иметь коды регистров, значения смещений, константы. В программном представлении можно воспользоваться следующей структурой:


typedef struct _RLPK_VM_INSTR {
DWORD Type;
DWORD Field_4;
DWORD Field_8;
} RLPK_VM_INSTR, *PRLPK_VM_INSTR;

Условием завершения потока виртуальных иструкций является значение 0 в очередном экземпляре RLPK_VM_INSTR.

Всего имеется 27 различных видов инструкций и 24 кода для регистров.

Кодировка регистров и их соответствие в нашей "родной" x86-архитектуре:

  • ESI - 0x06, 0x15
  • EDI - 0x05, 0x16
  • EBP - 0x07, 0x17
  • ESP - 0x08, 0x18
  • EAX - 0x01, 0x09, 0x0A, 0x0B
  • EBX - 0x02, 0x0C, 0x0D, 0x0E
  • ECX - 0x03, 0x0F, 0x10, 0x11
  • EDX - 0x04, 0x12, 0x13, 0x14

Кодировка инструкций и их соотвествие в нашей привычной и родной нам x86-архитектуре:

  • 0x1 - MOV EBP,ESP
  • 0x2 - PUSH NUM // NUM - Field_4
  • 0x3 - PUSH REG // REG - Field_4
  • 0x4, 0x5 - ADD REG, NUMBER // REG - Field_4, NUM - Field_8
  • 0x6 - MOV REG,NUM // REG - Feld_4, NUM - Field_8
  • 0x8 - MOV REG,FS:[0] // REG - Field_4
  • 0x9 - MOV FS:[0],REG // REG - Field_4
  • 0xA - MOV REG2,[REG] // REG - Field_4, REG2 - Field_8
  • 0xB - MOV [ADDR],REG // REG - Field_8, ADDR - Field_4
  • 0xC - CALL ADDR // ADDR - Field_4
  • 0xD - MOV REG,[ADDR] // REG - Field_4, ADDR - Field_8
  • 0x10 - MOV REG2, REG1 // REG1 - Field_4, REG2 - Field_8
  • 0x11 - CALL [ADDR] // Address - Field_4
  • 0x12 - PUSH DWORD[FS:0] // no comments :)
  • 0x14 - POP REG // REG - Field_4
  • 0x17 - MOV [REG2],REG // REG - Field_4, REG2 - Field_8
  • 0x18 - VM_RET // Детализация будет позже ;)
  • 0x19, 0x1A - MOV [ADDR],NUM // ADDR - Field_4 ,NUM - Field_8
  • 0x1B - MOV REG,[REG2+NUM] // REG - Field_4, REG2 = Field_8 >> 2, NUM = Field_8 & 0xFFFF
--- Есть еще команды, опишу в следующий раз, ждите продолжения )))

Виртуализация:

Работа пакера делится:

  • виртуализация вызова функций напрямую
  • виртуализация подряд идущего, т.е. аналогично INLINE применяемого компиляторами.

  1. Если встречается функция в которой пакер не может какую-нить инструкцияю обработать, то он вызывает эту функцию полностью. К примеру такой фунцией может быть Win32 API.
  2. Если встречается инструкция которую не может обработать и это не в функции, то на этом месте виртуализация завершается и пакер просто в конечном итоге ставит сюда прыжок после работы виртуализатора в стабе

Комментариев нет: