aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--GameInjector/dllmain.cpp90
-rw-r--r--LauncherInjector/main.cpp11
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<LPVOID*>(&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);