From 83ea828342e59af290857b0854ba768d9412e92c Mon Sep 17 00:00:00 2001 From: BobTheBob <32057864+BobTheBob9@users.noreply.github.com> Date: Fri, 27 Aug 2021 04:34:40 +0100 Subject: fix launcher steam support (hopefully) through disabling steam overlay --- GameInjector/dllmain.cpp | 90 ++++++++++++++++++++++++++++++++++++----------- LauncherInjector/main.cpp | 11 +++--- 2 files changed, 76 insertions(+), 25 deletions(-) diff --git a/GameInjector/dllmain.cpp b/GameInjector/dllmain.cpp index 69ea748a..2ab0415c 100644 --- a/GameInjector/dllmain.cpp +++ b/GameInjector/dllmain.cpp @@ -10,6 +10,30 @@ #define DLL_NAME L"Northstar.dll" +class TempReadWrite +{ +private: + DWORD m_origProtection; + void* m_ptr; + +public: + TempReadWrite(void* ptr) + { + m_ptr = ptr; + MEMORY_BASIC_INFORMATION mbi; + VirtualQuery(m_ptr, &mbi, sizeof(mbi)); + VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &mbi.Protect); + m_origProtection = mbi.Protect; + } + + ~TempReadWrite() + { + MEMORY_BASIC_INFORMATION mbi; + VirtualQuery(m_ptr, &mbi, sizeof(mbi)); + VirtualProtect(mbi.BaseAddress, mbi.RegionSize, m_origProtection, &mbi.Protect); + } +}; + typedef BOOL(WINAPI *CreateProcessWType)( LPCWSTR lpApplicationName, LPWSTR lpCommandLine, @@ -43,18 +67,10 @@ BOOL WINAPI CreateProcessWHook( bool isTitanfallProcess = false; // origin doesn't use lpApplicationName - if (lpApplicationName) - { - std::wcout << lpApplicationName << std::endl; - isTitanfallProcess = wcsstr(lpApplicationName, L"Titanfall2\\Titanfall2.exe"); - } - else - { - std::wcout << lpCommandLine << std::endl; - isTitanfallProcess = wcsstr(lpCommandLine, L"Titanfall2\\Titanfall2.exe"); - } + std::wcout << lpCommandLine << std::endl; + isTitanfallProcess = wcsstr(lpCommandLine, L"Titanfall2\\Titanfall2.exe"); - // steam will start processes suspended + // steam will start processes suspended (since we don't actually inject into steam directly this isn't required anymore, but whatever) bool alreadySuspended = dwCreationFlags & CREATE_SUSPENDED; // suspend process on creation so we can hook @@ -73,22 +89,45 @@ BOOL WINAPI CreateProcessWHook( 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); + // check if we're launching EASteamProxy for steam users, or just launching tf2 directly for origin users + // note: atm we fully disable steam integration in origin when we inject, return to this later + if (!wcsstr(lpApplicationName, L"Origin\\EASteamProxy.exe")) + { + 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); + } + else + { + // for easteamproxy, we have to inject ourself into it + // todo: atm we fully disable steam integration in origin when we inject, do this properly later + } // this doesn't seem to work super well //if (!alreadySuspended) ResumeThread(lpProcessInformation->hThread); + // cleanup MH_DisableHook(&CreateProcessW); MH_RemoveHook(&CreateProcessW); MH_Uninitialize(); + // allow steam integrations to work again + void* ptr = (char*)GetModuleHandleA("OriginClient.dll") + 0x2A83FA; + TempReadWrite rw(ptr); + + *((char*)ptr) = 0x0F; // jmp => je + *((char*)ptr + 1) = 0x84; + *((char*)ptr + 2) = 0xE5; + *((char*)ptr + 3) = 0x01; + *((char*)ptr + 4) = 0x00; + *((char*)ptr + 5) = 0x00; + + // is this undefined behaviour? idk FreeLibrary(ownHModule); } @@ -111,8 +150,8 @@ BOOL APIENTRY DllMain(HMODULE hModule, break; } - AllocConsole(); - freopen("CONOUT$", "w", stdout); + //AllocConsole(); + //freopen("CONOUT$", "w", stdout); ownHModule = hModule; char ownDllPath[MAX_PATH]; @@ -127,6 +166,17 @@ BOOL APIENTRY DllMain(HMODULE hModule, MH_CreateHook(&CreateProcessW, &CreateProcessWHook, reinterpret_cast(&CreateProcessWOriginal)); MH_EnableHook(&CreateProcessW); + // TEMP: temporarily disable steam stuff because it's a huge pain + // change conditional jump to EASteamProxy stuff in launchStep2 to never hit EASteamProxy launch + void* ptr = (char*)GetModuleHandleA("OriginClient.dll") + 0x2A83FA; + TempReadWrite rw(ptr); + + *((char*)ptr) = 0xE9; // je => jmp + *((char*)ptr + 1) = 0xE6; + *((char*)ptr + 2) = 0x01; + *((char*)ptr + 3) = 0x00; + *((char*)ptr + 4) = 0x00; + return TRUE; } diff --git a/LauncherInjector/main.cpp b/LauncherInjector/main.cpp index 2d846f6f..86c50804 100644 --- a/LauncherInjector/main.cpp +++ b/LauncherInjector/main.cpp @@ -101,7 +101,7 @@ int main() // check for steam dll and unpacked exe bool unpacked = fs::exists("Titanfall2-unpacked.exe"); - bool steamBuild = !unpacked && fs::exists("steam_api64.dll"); + //bool steamBuild = !unpacked && fs::exists("steam_api64.dll"); // dont actually need to check for this // unpacked origin if (unpacked) @@ -150,10 +150,11 @@ int main() // hook launcher DWORD launcherPID; - if (steamBuild) - while (!(launcherPID = GetProcessByName(L"EASteamProxy.exe"))) Sleep(50); - else - while (!(launcherPID = GetProcessByName(L"Origin.exe"))) Sleep(50); + // dont actually need to check for steam, origin launches game no matter what + //if (steamBuild) + // while (!(launcherPID = GetProcessByName(L"EASteamProxy.exe"))) Sleep(50); + //else + while (!(launcherPID = GetProcessByName(L"Origin.exe"))) Sleep(50); // injector should clean itself up after its job is done InjectInjectorIntoProcess(launcherPID); -- cgit v1.2.3