Показать устройство виртуального процессора , который используется в опции "Виртуализация кода" 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 применяемого компиляторами.
- Если встречается функция в которой пакер не может какую-нить инструкцияю обработать, то он вызывает эту функцию полностью. К примеру такой фунцией может быть Win32 API.
- Если встречается инструкция которую не может обработать и это не в функции, то на этом месте виртуализация завершается и пакер просто в конечном итоге ставит сюда прыжок после работы виртуализатора в стабе
Комментариев нет:
Отправить комментарий