Совет по защите кода

Post here any topics that related to Enigma Protector, its functionality, your misunderstanding, offers to improvements etc etc etc
Post Reply
Aleks_IZA
Posts: 2
Joined: Fri Aug 14, 2020 3:21 pm

Совет по защите кода

Post by Aleks_IZA » Wed Sep 02, 2020 4:21 am

Добрый день,

У меня есть вот такая функция поиска массива байт в памяти (код ниже), выполняется она естественно в цикле, много (миллионы раз, ищет в гигабайтах памяти). Без защиты поиск в памяти с данной функцией работает около минуты (на некотором примере).

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

Enigma
Site Admin
Posts: 2572
Joined: Wed Aug 20, 2008 2:24 pm

Re: Совет по защите кода

Post by Enigma » Thu Sep 03, 2020 12:32 pm

Здравствуйте, по поводу вопросов:

1. Чтобы хоть как то скрыть массив байт который используется для поиска, советую добавить его в протектор в опцию Protection Features - Protected Strings. Данная опция, независимо от названия, так же поддерживает защиту любого массива байт. Переключитесь в редакторе на байт код, вместо редактора строк. В коде, до цикла, извлекать данный массив с помощью функции EP_ProtectedStringById.

2. По поводу RET, для виртуальной машины это не имеет значение, где заканчивается маркер, до или после RET. В первом случае, сама инструкция RET не будет эмулирована виртуальной машиной, так что второй вариант лучше.

3. Защита цикла - данный цикл очень восприимчив к любым изменениям, при добавлении любой инструкции он будет занимать больше времени, не говоря уже о виртуальной машине. Могу только предложить такой вариант:
- незащищенный цикл будет проверять половину массива байт в памяти
- если совпадение найдено, сделайте второй цикл, уже защищенный, который проверит вторую часть массива.
Такой метод будет работать гораздо быстрее, потому что защищенная часть будет выполняться гораздо реже, а соответственно тратить на поиск время.

Aleks_IZA
Posts: 2
Joined: Fri Aug 14, 2020 3:21 pm

Re: Совет по защите кода

Post by Aleks_IZA » Fri Sep 04, 2020 4:38 am

Спасибо.

Post Reply