From 125f53aaa690e4870af88aa3a8947ac5ac0b435d Mon Sep 17 00:00:00 2001 From: BobTheBob <32057864+BobTheBob9@users.noreply.github.com> Date: Wed, 18 Aug 2021 03:56:51 +0100 Subject: lots of launcher stuff --- GameInjector/GameInjector.vcxproj | 176 ++++++++++++++++++++++++++++ GameInjector/GameInjector.vcxproj.filters | 39 +++++++ GameInjector/MinHook.h | 186 ++++++++++++++++++++++++++++++ GameInjector/MinHook.x64.dll | Bin 0 -> 15360 bytes GameInjector/MinHook.x64.lib | Bin 0 -> 4048 bytes GameInjector/MinHook.x86.dll | Bin 0 -> 12288 bytes GameInjector/MinHook.x86.lib | Bin 0 -> 4238 bytes GameInjector/dllmain.cpp | 119 +++++++++++++++++++ GameInjector/framework.h | 5 + GameInjector/pch.cpp | 5 + GameInjector/pch.h | 15 +++ 11 files changed, 545 insertions(+) create mode 100644 GameInjector/GameInjector.vcxproj create mode 100644 GameInjector/GameInjector.vcxproj.filters create mode 100644 GameInjector/MinHook.h create mode 100644 GameInjector/MinHook.x64.dll create mode 100644 GameInjector/MinHook.x64.lib create mode 100644 GameInjector/MinHook.x86.dll create mode 100644 GameInjector/MinHook.x86.lib create mode 100644 GameInjector/dllmain.cpp create mode 100644 GameInjector/framework.h create mode 100644 GameInjector/pch.cpp create mode 100644 GameInjector/pch.h (limited to 'GameInjector') diff --git a/GameInjector/GameInjector.vcxproj b/GameInjector/GameInjector.vcxproj new file mode 100644 index 00000000..37a269df --- /dev/null +++ b/GameInjector/GameInjector.vcxproj @@ -0,0 +1,176 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {b3554508-967e-49d2-bf87-586dd95d817c} + GameInjector + 10.0 + + + + DynamicLibrary + true + v142 + Unicode + + + DynamicLibrary + false + v142 + true + Unicode + + + DynamicLibrary + true + v142 + Unicode + + + DynamicLibrary + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + Level3 + true + WIN32;_DEBUG;GAMEINJECTOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + pch.h + $(ProjectDir) + stdcpp17 + + + Windows + true + false + $(ProjectDir)MinHook.x86.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + WIN32;NDEBUG;GAMEINJECTOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + pch.h + $(ProjectDir) + stdcpp17 + + + Windows + true + true + true + false + $(ProjectDir)MinHook.x86.lib;%(AdditionalDependencies) + + + + + Level3 + true + _DEBUG;GAMEINJECTOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + pch.h + + + Windows + true + false + + + + + Level3 + true + true + true + NDEBUG;GAMEINJECTOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + pch.h + + + Windows + true + true + true + false + + + + + + + + + + + Create + Create + Create + Create + + + + + + \ No newline at end of file diff --git a/GameInjector/GameInjector.vcxproj.filters b/GameInjector/GameInjector.vcxproj.filters new file mode 100644 index 00000000..e70fcdb6 --- /dev/null +++ b/GameInjector/GameInjector.vcxproj.filters @@ -0,0 +1,39 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {111f468d-e3a5-4d1a-903d-8911f4cfd715} + + + + + Header Files + + + Header Files + + + Header Files\include + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/GameInjector/MinHook.h b/GameInjector/MinHook.h new file mode 100644 index 00000000..15c0a875 --- /dev/null +++ b/GameInjector/MinHook.h @@ -0,0 +1,186 @@ +/* + * MinHook - The Minimalistic API Hooking Library for x64/x86 + * Copyright (C) 2009-2017 Tsuda Kageyu. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__) + #error MinHook supports only x86 and x64 systems. +#endif + +#include + +// MinHook Error Codes. +typedef enum MH_STATUS +{ + // Unknown error. Should not be returned. + MH_UNKNOWN = -1, + + // Successful. + MH_OK = 0, + + // MinHook is already initialized. + MH_ERROR_ALREADY_INITIALIZED, + + // MinHook is not initialized yet, or already uninitialized. + MH_ERROR_NOT_INITIALIZED, + + // The hook for the specified target function is already created. + MH_ERROR_ALREADY_CREATED, + + // The hook for the specified target function is not created yet. + MH_ERROR_NOT_CREATED, + + // The hook for the specified target function is already enabled. + MH_ERROR_ENABLED, + + // The hook for the specified target function is not enabled yet, or already + // disabled. + MH_ERROR_DISABLED, + + // The specified pointer is invalid. It points the address of non-allocated + // and/or non-executable region. + MH_ERROR_NOT_EXECUTABLE, + + // The specified target function cannot be hooked. + MH_ERROR_UNSUPPORTED_FUNCTION, + + // Failed to allocate memory. + MH_ERROR_MEMORY_ALLOC, + + // Failed to change the memory protection. + MH_ERROR_MEMORY_PROTECT, + + // The specified module is not loaded. + MH_ERROR_MODULE_NOT_FOUND, + + // The specified function is not found. + MH_ERROR_FUNCTION_NOT_FOUND +} +MH_STATUS; + +// Can be passed as a parameter to MH_EnableHook, MH_DisableHook, +// MH_QueueEnableHook or MH_QueueDisableHook. +#define MH_ALL_HOOKS NULL + +#ifdef __cplusplus +extern "C" { +#endif + + // Initialize the MinHook library. You must call this function EXACTLY ONCE + // at the beginning of your program. + MH_STATUS WINAPI MH_Initialize(VOID); + + // Uninitialize the MinHook library. You must call this function EXACTLY + // ONCE at the end of your program. + MH_STATUS WINAPI MH_Uninitialize(VOID); + + // Creates a Hook for the specified target function, in disabled state. + // Parameters: + // pTarget [in] A pointer to the target function, which will be + // overridden by the detour function. + // pDetour [in] A pointer to the detour function, which will override + // the target function. + // ppOriginal [out] A pointer to the trampoline function, which will be + // used to call the original target function. + // This parameter can be NULL. + MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal); + + // Creates a Hook for the specified API function, in disabled state. + // Parameters: + // pszModule [in] A pointer to the loaded module name which contains the + // target function. + // pszTarget [in] A pointer to the target function name, which will be + // overridden by the detour function. + // pDetour [in] A pointer to the detour function, which will override + // the target function. + // ppOriginal [out] A pointer to the trampoline function, which will be + // used to call the original target function. + // This parameter can be NULL. + MH_STATUS WINAPI MH_CreateHookApi( + LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal); + + // Creates a Hook for the specified API function, in disabled state. + // Parameters: + // pszModule [in] A pointer to the loaded module name which contains the + // target function. + // pszTarget [in] A pointer to the target function name, which will be + // overridden by the detour function. + // pDetour [in] A pointer to the detour function, which will override + // the target function. + // ppOriginal [out] A pointer to the trampoline function, which will be + // used to call the original target function. + // This parameter can be NULL. + // ppTarget [out] A pointer to the target function, which will be used + // with other functions. + // This parameter can be NULL. + MH_STATUS WINAPI MH_CreateHookApiEx( + LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget); + + // Removes an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); + + // Enables an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // enabled in one go. + MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); + + // Disables an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // disabled in one go. + MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); + + // Queues to enable an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // queued to be enabled. + MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget); + + // Queues to disable an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // queued to be disabled. + MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget); + + // Applies all queued changes in one go. + MH_STATUS WINAPI MH_ApplyQueued(VOID); + + // Translates the MH_STATUS to its name as a string. + const char * WINAPI MH_StatusToString(MH_STATUS status); + +#ifdef __cplusplus +} +#endif + diff --git a/GameInjector/MinHook.x64.dll b/GameInjector/MinHook.x64.dll new file mode 100644 index 00000000..b4f51c2e Binary files /dev/null and b/GameInjector/MinHook.x64.dll differ diff --git a/GameInjector/MinHook.x64.lib b/GameInjector/MinHook.x64.lib new file mode 100644 index 00000000..909fe682 Binary files /dev/null and b/GameInjector/MinHook.x64.lib differ diff --git a/GameInjector/MinHook.x86.dll b/GameInjector/MinHook.x86.dll new file mode 100644 index 00000000..d6167c83 Binary files /dev/null and b/GameInjector/MinHook.x86.dll differ diff --git a/GameInjector/MinHook.x86.lib b/GameInjector/MinHook.x86.lib new file mode 100644 index 00000000..02f351c2 Binary files /dev/null and b/GameInjector/MinHook.x86.lib differ diff --git a/GameInjector/dllmain.cpp b/GameInjector/dllmain.cpp new file mode 100644 index 00000000..c18495be --- /dev/null +++ b/GameInjector/dllmain.cpp @@ -0,0 +1,119 @@ +// dllmain.cpp : Defines the entry point for the DLL application. + +#include "pch.h" +#include "MinHook.h" +#include +#include +#include +#include +#include + +#define DLL_NAME L"Northstar.dll" + +typedef BOOL(WINAPI *CreateProcessWType)( + LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation +); +CreateProcessWType CreateProcessWOriginal; + +HMODULE ownHModule; +std::filesystem::path tf2DirPath; + +BOOL WINAPI CreateProcessWHook( + LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation +) +{ + bool isTitanfallProcess = false; + + // origin doesn't use lpApplicationName + if (lpApplicationName) + isTitanfallProcess = wcsstr(lpApplicationName, L"Titanfall2\\Titanfall2.exe"); + else + isTitanfallProcess = wcsstr(lpCommandLine, L"Titanfall2\\Titanfall2.exe"); + + std::wcout << lpCommandLine << std::endl; + + // suspend process on creation so we can hook + if (isTitanfallProcess) + dwCreationFlags |= CREATE_SUSPENDED; + + BOOL ret = CreateProcessWOriginal(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); + + if (isTitanfallProcess) + { + std::cout << "Creating titanfall process!" << std::endl; + std::cout << "Handle: " << lpProcessInformation->hProcess << " ID: " << lpProcessInformation->dwProcessId << " Thread: " << lpProcessInformation->hThread << std::endl; + + STARTUPINFO si; + memset(&si, 0, sizeof(si)); + PROCESS_INFORMATION pi; + memset(&pi, 0, sizeof(pi)); + + std::stringstream argStr; + argStr << lpProcessInformation->dwProcessId; + argStr << " "; + argStr << lpProcessInformation->dwThreadId; + + CreateProcessA((tf2DirPath / "InjectionProxy64.exe").string().c_str(), (LPSTR)(argStr.str().c_str()), 0, 0, false, 0, 0, tf2DirPath.string().c_str(), (LPSTARTUPINFOA)&si, &pi); + WaitForSingleObject(pi.hThread, INFINITE); + ResumeThread(lpProcessInformation->hProcess); + + MH_RemoveHook(&CreateProcessW); + FreeLibrary(ownHModule); + } + + + return ret; +} + +BOOL APIENTRY DllMain(HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + //DisableThreadLibraryCalls(hModule); + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + + ownHModule = hModule; + char ownDllPath[MAX_PATH]; + GetModuleFileNameA(hModule, ownDllPath, MAX_PATH); + + tf2DirPath = std::filesystem::path(ownDllPath).parent_path(); + + //AllocConsole(); + //freopen("CONOUT$", "w", stdout); + + // hook CreateProcessW + if (MH_Initialize() > MH_ERROR_ALREADY_INITIALIZED) // MH_ERROR_ALREADY_INITIALIZED = 1, MH_OK = 0, these are the only results we should expect + return TRUE; + + MH_CreateHook(&CreateProcessW, &CreateProcessWHook, reinterpret_cast(&CreateProcessWOriginal)); + MH_EnableHook(&CreateProcessW); + + return TRUE; +} + diff --git a/GameInjector/framework.h b/GameInjector/framework.h new file mode 100644 index 00000000..54b83e94 --- /dev/null +++ b/GameInjector/framework.h @@ -0,0 +1,5 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files +#include diff --git a/GameInjector/pch.cpp b/GameInjector/pch.cpp new file mode 100644 index 00000000..64b7eef6 --- /dev/null +++ b/GameInjector/pch.cpp @@ -0,0 +1,5 @@ +// pch.cpp: source file corresponding to the pre-compiled header + +#include "pch.h" + +// When you are using pre-compiled headers, this source file is necessary for compilation to succeed. diff --git a/GameInjector/pch.h b/GameInjector/pch.h new file mode 100644 index 00000000..1fd0adab --- /dev/null +++ b/GameInjector/pch.h @@ -0,0 +1,15 @@ +// pch.h: This is a precompiled header file. +// Files listed below are compiled only once, improving build performance for future builds. +// This also affects IntelliSense performance, including code completion and many code browsing features. +// However, files listed here are ALL re-compiled if any one of them is updated between builds. +// Do not add files here that you will be updating frequently as this negates the performance advantage. + +#ifndef PCH_H +#define PCH_H + +#define _CRT_SECURE_NO_WARNINGS + +// add headers that you want to pre-compile here +#include "framework.h" + +#endif //PCH_H -- cgit v1.2.3