Последняя наверное часть.
Просто немного сказать, о чём не сказал.
Предыдущие части тут:
Малварь как искусство - Самомодификация и генерация кода на лету в си. Часть 1. Вкуриваем суть.
Малварь как искусство - Генерация кода на си. Часть вторая. Исполняем код на лету
Вообще этим можно таких дел наворотить.
Вот представьте. Вы зашифровали основную часть своей программы (Каждая основная функция зашифрована и в бинарном виде в дата-секции), а потом по частям расшифровываете функции и исполняете их, ну даже если антивирус и проверит память, и что ? Там будет всего-лишь часть вашей программы.
Да-что там антивирус, даже реверсер в ахересе будет. :)
Правда у способа есть минусы:
1. Очень-уж сложная реализация, нужно-будет посидеть покодить если программа большая.
2. Также размер ваших программ тоже может разрастись.
Ну и последнее, вот ещё старый и рабочий способ поменять несколько байт в вашем процессе, при помощи WriteProcessMemory (если не установлены флаги защиты).
Первое, что нужно сделать для этого – получить доступ к загруженному в память процессу, при помощи функции OpenProcess с атрибутами доступа PROCESS_VM_OPERATION и PROCESS_VM_WRITE.
Вот пример, рабочий:
Получаем:
Как видите, программа заменяет бесконечный цикл простым переходом JZ. Это позволяет программе перейти к следующей инструкции, и мы видим сообщение, которое подтверждает факт замены.
Здорово, да?
В общем способы интересные. :)
Просто немного сказать, о чём не сказал.
Предыдущие части тут:
Малварь как искусство - Самомодификация и генерация кода на лету в си. Часть 1. Вкуриваем суть.
Малварь как искусство - Генерация кода на си. Часть вторая. Исполняем код на лету
Вообще этим можно таких дел наворотить.
Вот представьте. Вы зашифровали основную часть своей программы (Каждая основная функция зашифрована и в бинарном виде в дата-секции), а потом по частям расшифровываете функции и исполняете их, ну даже если антивирус и проверит память, и что ? Там будет всего-лишь часть вашей программы.
Да-что там антивирус, даже реверсер в ахересе будет. :)
Правда у способа есть минусы:
1. Очень-уж сложная реализация, нужно-будет посидеть покодить если программа большая.
2. Также размер ваших программ тоже может разрастись.
Ну и последнее, вот ещё старый и рабочий способ поменять несколько байт в вашем процессе, при помощи WriteProcessMemory (если не установлены флаги защиты).
Первое, что нужно сделать для этого – получить доступ к загруженному в память процессу, при помощи функции OpenProcess с атрибутами доступа PROCESS_VM_OPERATION и PROCESS_VM_WRITE.
Вот пример, рабочий:
Код:
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "windows.h"
int WriteMe(void *addr, int wb)
{
HANDLE
h = OpenProcess(PROCESS_VM_OPERATION |
PROCESS_VM_WRITE,
true, GetCurrentProcessId());
return WriteProcessMemory(h, addr, &wb, 1, NULL);
}
int main(int argc, char* argv[])
{
_asm {
push 0x74; JMP >> JZ
push offset Here
call WriteMe
add esp, 8
Here: JMP short Here
}
printf("Hello i am virus ! :)");
while (1);
return 0;
}
Получаем:
Как видите, программа заменяет бесконечный цикл простым переходом JZ. Это позволяет программе перейти к следующей инструкции, и мы видим сообщение, которое подтверждает факт замены.
Здорово, да?
В общем способы интересные. :)