Интересно стало, как-же будут реагировать антивирусы на вызов VirtualAlloc с флагом PAGE_EXECUTE_READWRITE (Флаг на исполнение).
Думал будет елочка на dyncheck.com, а-нет результаты весьма неплохие.)))
Странно конечно, ведь выделять память на исполнение, уже потенциально опасно, можно использовать всякие трюки для сокрытия кода и не только.
Тестовая программа:
1)Выделяется память VirtualAlloc с флагом PAGE_EXECUTE_READWRITE.
2)Копируется туда, код функции Xor.
3)Для проверки шифрует/расшифровывает тестовую строку и выводит результат.
В итоге вот результаты:
На запуск:
Думал будет елочка на dyncheck.com, а-нет результаты весьма неплохие.)))
Странно конечно, ведь выделять память на исполнение, уже потенциально опасно, можно использовать всякие трюки для сокрытия кода и не только.
Тестовая программа:
1)Выделяется память VirtualAlloc с флагом PAGE_EXECUTE_READWRITE.
2)Копируется туда, код функции Xor.
3)Для проверки шифрует/расшифровывает тестовую строку и выводит результат.
C:
#pragma optimize( "", off )
#include <windows.h>
#include <stdint.h>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define getpagesize() 4096
void functionMemoryXorStart(char* buffer, long fileSize, char* key, long keyLength)
{
for (int i = 0; i < fileSize; i++) {
buffer[i] = buffer[i] ^ key[i % keyLength];
}
}
void functionMemoryXorEnd(void)
{
return;
}
static char buffer_test[] = { 'H','I','\0' };
static char key[] = { '1','2','\0' };
int main(int argc, char** argv)
{
void (*p_mem_func) (char*, long, char*, long) = NULL;
p_mem_func = (void(__cdecl*)(char*, long, char*, long)) VirtualAlloc(NULL, getpagesize(), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (p_mem_func == NULL) {
printf(" VirtualAlloc is bad\n");
return (-1);
}
uint32_t size_func = (uintptr_t)(&functionMemoryXorEnd) - (uintptr_t)(&functionMemoryXorStart);
memcpy(p_mem_func, functionMemoryXorStart, size_func);
//Шифрование
p_mem_func (buffer_test, 3, key, 2);
printf("Buffer crypt test:%s \n\n", buffer_test);
//Расшифровка
p_mem_func(buffer_test, 3, key, 2);
printf("Buffer decrypt test:%s \n", buffer_test);
while (1);
return 0;
}
#pragma optimize( "", on)
В итоге вот результаты:
На запуск: