Entirely block dll injections

This commit is contained in:
momo5502 2016-03-01 13:37:51 +01:00
parent b3fbc045a9
commit 5fffac5bab
14 changed files with 95 additions and 32 deletions

2
deps/protobuf vendored

@ -1 +1 @@
Subproject commit 52f62e3652ce80ab14593331f4277539e7fa29c8 Subproject commit 584233bd043a80b2172a598039113d4fe14dc326

View File

@ -35,11 +35,12 @@ namespace Components
0xDC, 0xC1, 0xDC, 0x05, 0xDC, 0xC1, 0xDC, 0x05,
// Uninstall minidump handler // Uninstall minidump handler
0xB8, 0x63, 0xE7, 0x2F, 0x00, // mov eax, 2FE763h // This doesn't work anymore, due to the SetUnhandledExceptionFilter hook, but that's not important
0x05, 0xAD, 0xAD, 0x3C, 0x00, // add eax, 3CADADh //0xB8, 0x63, 0xE7, 0x2F, 0x00, // mov eax, 2FE763h
0x6A, 0x58, // push 88 //0x05, 0xAD, 0xAD, 0x3C, 0x00, // add eax, 3CADADh
0x8B, 0x80, 0xEA, 0x01, 0x00, 0x00, // mov eax, [eax + 1EAh] //0x6A, 0x58, // push 88
0xFF, 0x10, // call dword ptr [eax] //0x8B, 0x80, 0xEA, 0x01, 0x00, 0x00, // mov eax, [eax + 1EAh]
//0xFF, 0x10, // call dword ptr [eax]
// Crash me. // Crash me.
0xB8, 0x4F, 0x91, 0x27, 0x00, // mov eax, 27914Fh 0xB8, 0x4F, 0x91, 0x27, 0x00, // mov eax, 27914Fh
@ -62,15 +63,6 @@ namespace Components
// Push the fake var onto the stack // Push the fake var onto the stack
push ebx push ebx
// Get address to VirtualProtect
mov eax, 6567h
shl eax, 0Ch
or eax, 70000A50h
// Move the address into ebx
push eax
pop ebx
// Save the address to our crash procedure // Save the address to our crash procedure
mov eax, offset crashProcedure mov eax, offset crashProcedure
push eax push eax
@ -80,9 +72,10 @@ namespace Components
push 40h push 40h
push 2D5FFFh push 2D5FFFh
push 401001h push 401001h
call ebx call VirtualProtect
// Increment to our crash procedure // Increment to our crash procedure
// Skip variable space
add dword ptr [esp], 4h add dword ptr [esp], 4h
// This basically removes the pushed ebx value from the stack, so returning results in a call to the procedure // This basically removes the pushed ebx value from the stack, so returning results in a call to the procedure
@ -126,12 +119,39 @@ namespace Components
AntiCheat::PerformCheck(); AntiCheat::PerformCheck();
} }
void AntiCheat::PatchWinAPI()
{
auto loadLibStub = [] ()
{
__asm
{
xor eax, eax
retn 4h
}
};
auto loadLibExStub = [] ()
{
__asm
{
xor eax, eax
retn 0Ch
}
};
Utils::Hook(LoadLibraryA, loadLibStub, HOOK_JUMP).Install()->Quick();
Utils::Hook(LoadLibraryW, loadLibStub, HOOK_JUMP).Install()->Quick();
Utils::Hook(LoadLibraryExA, loadLibExStub, HOOK_JUMP).Install()->Quick();
Utils::Hook(LoadLibraryExW, loadLibExStub, HOOK_JUMP).Install()->Quick();
}
AntiCheat::AntiCheat() AntiCheat::AntiCheat()
{ {
AntiCheat::EmptyHash(); AntiCheat::EmptyHash();
Renderer::OnFrame(AntiCheat::Frame);
Dedicated::OnFrame(AntiCheat::Frame); QuickPatch::OnFrame(AntiCheat::Frame);
QuickPatch::Once(AntiCheat::PatchWinAPI);
#ifdef DEBUG #ifdef DEBUG
Command::Add("penis", [] (Command::Params) Command::Add("penis", [] (Command::Params)

View File

@ -16,6 +16,7 @@ namespace Components
static void Frame(); static void Frame();
static void PerformCheck(); static void PerformCheck();
static void PatchWinAPI();
static void NullSub(); static void NullSub();
}; };

View File

@ -375,8 +375,7 @@ namespace Components
}); });
// Install frame handlers // Install frame handlers
Dedicated::OnFrame(Auth::Frame); QuickPatch::OnFrame(Auth::Frame);
Renderer::OnFrame(Auth::Frame);
// Register dvar // Register dvar
Dvar::Register<int>("sv_securityLevel", 23, 0, 512, Game::dvar_flag::DVAR_FLAG_SERVERINFO, "Security level for GUID certificates (POW)"); Dvar::Register<int>("sv_securityLevel", 23, 0, 512, Game::dvar_flag::DVAR_FLAG_SERVERINFO, "Security level for GUID certificates (POW)");

View File

@ -3,6 +3,7 @@
namespace Components namespace Components
{ {
wink::signal<wink::slot<Dedicated::Callback>> Dedicated::FrameSignal; wink::signal<wink::slot<Dedicated::Callback>> Dedicated::FrameSignal;
wink::signal<wink::slot<Dedicated::Callback>> Dedicated::FrameOnceSignal;
bool Dedicated::IsDedicated() bool Dedicated::IsDedicated()
{ {
@ -143,6 +144,11 @@ namespace Components
Network::SendCommand(master, "heartbeat", "IW4"); Network::SendCommand(master, "heartbeat", "IW4");
} }
void Dedicated::Once(Dedicated::Callback* callback)
{
Dedicated::FrameOnceSignal.connect(callback);
}
void Dedicated::OnFrame(Dedicated::Callback* callback) void Dedicated::OnFrame(Dedicated::Callback* callback)
{ {
Dedicated::FrameSignal.connect(callback); Dedicated::FrameSignal.connect(callback);
@ -151,6 +157,8 @@ namespace Components
void Dedicated::FrameStub() void Dedicated::FrameStub()
{ {
Dedicated::FrameSignal(); Dedicated::FrameSignal();
Dedicated::FrameOnceSignal();
Dedicated::FrameOnceSignal.clear();
Utils::Hook::Call<void()>(0x5A8E80)(); Utils::Hook::Call<void()>(0x5A8E80)();
} }
@ -245,6 +253,7 @@ namespace Components
Dedicated::~Dedicated() Dedicated::~Dedicated()
{ {
Dedicated::FrameOnceSignal.clear();
Dedicated::FrameSignal.clear(); Dedicated::FrameSignal.clear();
} }
} }

View File

@ -14,9 +14,11 @@ namespace Components
static void Heartbeat(); static void Heartbeat();
static void OnFrame(Callback* callback); static void OnFrame(Callback* callback);
static void Once(Callback* callback);
private: private:
static wink::signal<wink::slot<Callback>> FrameSignal; static wink::signal<wink::slot<Callback>> FrameSignal;
static wink::signal<wink::slot<Callback>> FrameOnceSignal;
static void MapRotate(); static void MapRotate();
static void FrameStub(); static void FrameStub();

View File

@ -393,14 +393,7 @@ namespace Components
{ {
#ifdef ENABLE_EXPERIMENTAL_UDP_DOWNLOAD #ifdef ENABLE_EXPERIMENTAL_UDP_DOWNLOAD
// Frame handlers // Frame handlers
if (Dedicated::IsDedicated()) QuickPatch::OnFrame(Download::Frame);
{
Dedicated::OnFrame(Download::Frame);
}
else
{
Renderer::OnFrame(Download::Frame);
}
// Register client handlers // Register client handlers
Network::Handle("dlAckRequest", Download::AckRequest); Network::Handle("dlAckRequest", Download::AckRequest);

View File

@ -133,8 +133,7 @@ namespace Components
{ {
Logger::PipeOutput(nullptr); Logger::PipeOutput(nullptr);
Renderer::OnFrame(Logger::Frame); // Client QuickPatch::OnFrame(Logger::Frame);
Dedicated::OnFrame(Logger::Frame); // Dedi
Utils::Hook(Game::Com_PrintMessage, Logger::PrintMessageStub, HOOK_JUMP).Install()->Quick(); Utils::Hook(Game::Com_PrintMessage, Logger::PrintMessageStub, HOOK_JUMP).Install()->Quick();
} }

View File

@ -700,8 +700,7 @@ namespace Components
}); });
// Install frame handlers // Install frame handlers
Dedicated::OnFrame(Node::FrameHandler); QuickPatch::OnFrame(Node::FrameHandler);
Renderer::OnFrame(Node::FrameHandler);
} }
Node::~Node() Node::~Node()

View File

@ -21,6 +21,30 @@ namespace Components
QuickPatch::ShutdownSignal(); QuickPatch::ShutdownSignal();
} }
void QuickPatch::OnFrame(QuickPatch::Callback* callback)
{
if (Dedicated::IsDedicated())
{
Dedicated::OnFrame(callback);
}
else
{
Renderer::OnFrame(callback);
}
}
void QuickPatch::Once(QuickPatch::Callback* callback)
{
if (Dedicated::IsDedicated())
{
Dedicated::Once(callback);
}
else
{
Renderer::Once(callback);
}
}
void QuickPatch::UnlockStats() void QuickPatch::UnlockStats()
{ {
Command::Execute("setPlayerData prestige 10"); Command::Execute("setPlayerData prestige 10");

View File

@ -12,6 +12,9 @@ namespace Components
static void UnlockStats(); static void UnlockStats();
static void OnShutdown(Callback* callback); static void OnShutdown(Callback* callback);
static void OnFrame(Callback* callback);
static void Once(Callback* callback);
private: private:
static wink::signal<wink::slot<Callback>> ShutdownSignal; static wink::signal<wink::slot<Callback>> ShutdownSignal;

View File

@ -4,6 +4,7 @@ namespace Components
{ {
Utils::Hook Renderer::DrawFrameHook; Utils::Hook Renderer::DrawFrameHook;
wink::signal<wink::slot<Renderer::Callback>> Renderer::FrameSignal; wink::signal<wink::slot<Renderer::Callback>> Renderer::FrameSignal;
wink::signal<wink::slot<Renderer::Callback>> Renderer::FrameOnceSignal;
void __declspec(naked) Renderer::FrameHook() void __declspec(naked) Renderer::FrameHook()
{ {
@ -17,6 +18,13 @@ namespace Components
void Renderer::FrameHandler() void Renderer::FrameHandler()
{ {
Renderer::FrameSignal(); Renderer::FrameSignal();
Renderer::FrameOnceSignal();
Renderer::FrameOnceSignal.clear();
}
void Renderer::Once(Renderer::Callback* callback)
{
Renderer::FrameOnceSignal.connect(callback);
} }
void Renderer::OnFrame(Renderer::Callback* callback) void Renderer::OnFrame(Renderer::Callback* callback)
@ -43,6 +51,7 @@ namespace Components
Renderer::~Renderer() Renderer::~Renderer()
{ {
Renderer::DrawFrameHook.Uninstall(); Renderer::DrawFrameHook.Uninstall();
Renderer::FrameOnceSignal.clear();
Renderer::FrameSignal.clear(); Renderer::FrameSignal.clear();
} }
} }

View File

@ -12,6 +12,7 @@ namespace Components
static int Width(); static int Width();
static int Height(); static int Height();
static void Once(Callback* callback);
static void OnFrame(Callback* callback); static void OnFrame(Callback* callback);
private: private:
@ -19,6 +20,7 @@ namespace Components
static void FrameHandler(); static void FrameHandler();
static wink::signal<wink::slot<Callback>> FrameSignal; static wink::signal<wink::slot<Callback>> FrameSignal;
static wink::signal<wink::slot<Callback>> FrameOnceSignal;
static Utils::Hook DrawFrameHook; static Utils::Hook DrawFrameHook;
}; };
} }

View File

@ -9,7 +9,10 @@ namespace Utils
{ {
public: public:
Hook() : Place(nullptr), Stub(nullptr), Initialized(false), Installed(false), Original(0), UseJump(false), Protection(0) { ZeroMemory(Hook::Buffer, sizeof(Hook::Buffer)); } Hook() : Place(nullptr), Stub(nullptr), Initialized(false), Installed(false), Original(0), UseJump(false), Protection(0) { ZeroMemory(Hook::Buffer, sizeof(Hook::Buffer)); }
Hook(void* place, void* stub, bool useJump = true) : Hook() { Hook::Initialize(place, stub, useJump); } Hook(void* place, void* stub, bool useJump = true) : Hook() { Hook::Initialize(place, stub, useJump); }
Hook(void* place, void(*stub)(), bool useJump = true) : Hook(place, reinterpret_cast<void*>(stub), useJump) {}
Hook(DWORD place, void* stub, bool useJump = true) : Hook(reinterpret_cast<void*>(place), stub, useJump) {} Hook(DWORD place, void* stub, bool useJump = true) : Hook(reinterpret_cast<void*>(place), stub, useJump) {}
Hook(DWORD place, DWORD stub, bool useJump = true) : Hook(reinterpret_cast<void*>(place), reinterpret_cast<void*>(stub), useJump) {} Hook(DWORD place, DWORD stub, bool useJump = true) : Hook(reinterpret_cast<void*>(place), reinterpret_cast<void*>(stub), useJump) {}
Hook(DWORD place, void(*stub)(), bool useJump = true) : Hook(reinterpret_cast<void*>(place), reinterpret_cast<void*>(stub), useJump) {} Hook(DWORD place, void(*stub)(), bool useJump = true) : Hook(reinterpret_cast<void*>(place), reinterpret_cast<void*>(stub), useJump) {}