#include // i kinda stopped caring at this point namespace RemoteCode { RemoteCodeParameters RemoteCodeClient::Start(RemoteProcess &Process) { // Copy over process. m_Process = Process; // PSA: If the loader crashes CS:GO, this is most definitely the reason. HANDLE ShaderApi = Process.FindModule("shaderapidx9.dll"); void *D3D_DevicePtr = (void *)((uintptr_t)ShaderApi + 0xA3FC0); // Read the VTable. // TODO: Check if process is 32-bit or 64-bit.... nah fuck that lol void *D3D_VtablePtr = Process.Read(D3D_DevicePtr); m_DirectX = Process.Read((void *)((uintptr_t)D3D_VtablePtr + 42 * 4)); RemoteCodeParameters Parameters{ (uintptr_t)D3D_VtablePtr, m_DirectX, 0x00000000, 0x00000000, (uintptr_t)VirtualProtect }; m_DirectX = (uintptr_t)D3D_VtablePtr; return Parameters; } void RemoteCodeClient::Dispatch(ByteArray &Shellcode) { // Allocate and set-up shellcode. void *AllocationBase = m_Process.Allocate(Shellcode.size()); m_Process.Write(AllocationBase, Shellcode.data(), Shellcode.size()); // Hijack D3D thread. m_Process.Write((void *)(m_DirectX + 42 * 4), (uintptr_t)AllocationBase); } }