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