У меня есть вот такая функция поиска массива байт в памяти (код ниже), выполняется она естественно в цикле, много (миллионы раз, ищет в гигабайтах памяти). Без защиты поиск в памяти с данной функцией работает около минуты (на некотором примере).
В этой функции я могу покрыть виртуальной машиной только вводную часть, окончание функции, и результат успешного поиска. Если я попробую закрыть виртуальной машиной любую команду из тела цикла: между next_cmp: и jmp next_cmp, то функция будет отрабатывать десятки минут (я не дождался окончания).
Вопрос в том, что вы можете предложить для защиты тела цикла.
- Именно lea rdi, [Array] - так как по Array лежит голая последовательность байтов, и хочется скрыть эту последовательность, что бы ее не было в открытом виде.
- И самой команды сравнения repz cmpsb
PS: Я пробовал переделать cmpsb на простой код, но его тоже не получается покрыть виртуальной машиной, команда типа mov RAX, [zzz] выполняются очень медленно в VM.
PS2: Дополнительный вопрос: закрытие виртуальной машины надо добавлять до инструкции ret или после (у меня после и вроде, нормально работает).
пример кода:
Code: Select all
;функция выполняет сравнение последовательности байт в памяти
searc proc
;vm_begin
db 0EBh, 008h, 056h, 04Dh, 042h, 045h, 047h, 049h, 04Eh, 000h
;R14 содержит реальный адрес
mov R15, R10 ; размер блока в памяти
sub R15, ArraySize ;надо уменьшить на размер последовательности
mov rsi, memAlloced ; адрес начала блока
mov R13, RSI ; счетик адресов
; vm_end
db 0EBh, 008h, 056h, 04Dh, 045h, 04Eh, 044h, 000h, 000h, 000h
next_cmp:
mov rcx, ArraySize ; количество байт сравнения
lea rdi, [Array]
mov RSI, R13
repz cmpsb
jz finded ; сошлось
back_finish:
add R14, 1
add R13, 1
sub R15, 1
jz exit_proc
jmp next_cmp
finded:
;vm_begin
db 0EBh, 008h, 056h, 04Dh, 042h, 045h, 047h, 049h, 04Eh, 000h
Здесь небольшая логика с сохранением найденного
; vm_end
db 0EBh, 008h, 056h, 04Dh, 045h, 04Eh, 044h, 000h, 000h, 000h
jmp back_finish ; назад в перебор
exit_proc:
;vm_begin
db 0EBh, 008h, 056h, 04Dh, 042h, 045h, 047h, 049h, 04Eh, 000h
здесь немного логики
ret
; vm_end
db 0EBh, 008h, 056h, 04Dh, 045h, 04Eh, 044h, 000h, 000h, 000h
searc endP