From 8f29130f6399661fa0e71ad20c2689f1e2b9a6c9 Mon Sep 17 00:00:00 2001 From: Calvin Balke Date: Mon, 29 Jun 2015 13:06:40 -0700 Subject: [PATCH] Updated the ModLoader This new code for the ModLoader allows the WatchDog to dump compiled script bytecode in the event of a crash, and even get the instruction pointer for the scripting language. Some comments were also removed to clean up the code. --- ModLoader/Modloader/source/t2dll.cpp | 30 +++++++++++----------------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/ModLoader/Modloader/source/t2dll.cpp b/ModLoader/Modloader/source/t2dll.cpp index 1a7e1d1..77c7e0a 100644 --- a/ModLoader/Modloader/source/t2dll.cpp +++ b/ModLoader/Modloader/source/t2dll.cpp @@ -21,21 +21,13 @@ BOOL APIENTRY DllMain( HMODULE hModule, return true; } const unsigned char moduroutine[] = {0x8B, 0x3D, 0xEC, 0x82, 0x9E, 0x00, 0x89, 0xF8, 0x8B, 0x14, 0x85, 0xFC, 0xA5, 0x88, 0x00, 0x83, 0xFA, 0x00, 0x74, 0x30, 0x8B, 0x3D, 0xEC, 0x82, 0x9E, 0x00, 0x89, 0xF8, 0x31, 0xD2, 0x89, 0xF8, 0x8B, 0x04, 0x85, 0x00, 0xA6, 0x88, 0x00, 0xF7, 0x34, 0xBD, 0xFC, 0xA5, 0x88, 0x00, 0xFF, 0x0D, 0xEC, 0x82, 0x9E, 0x00, 0x89, 0xF8, 0x89, 0x14, 0x85, 0xFC, 0xA5, 0x88, 0x00, 0xB8, 0xC7, 0xCE, 0x42, 0x00, 0xFF, 0xE0, 0xFF, 0x0D, 0xEC, 0x82, 0x9E, 0x00, 0xC7, 0x04, 0x85, 0xFC, 0xA5, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xC7, 0xCE, 0x42, 0x00, 0xFF, 0xE0}; +const unsigned char interpreterRoutine[] = {0x8B ,0x56 ,0x18 ,0x89 ,0x15 ,0x10 ,0xB7 ,0xA3 ,0x00 ,0x89 ,0x1D ,0x14 ,0xB7 ,0xA3 ,0x00 ,0x8B ,0x55 ,0x80 ,0x89 ,0xD0 ,0xBF ,0xD9 ,0xCE ,0x42 ,0x00 ,0x3D ,0x55 ,0x00 ,0x00 ,0x00 ,0xFF ,0xE7}; const char* congetServPAddr(Linker::SimObject *obj, S32 argc, const char *argv[]) { char test[256] = ""; char test2[256]=""; int spr=(signed int)*serverProcessReplacement; sprintf(test2,"B8%08XFFD089EC5DC3",endian(spr)); - /*test2[0]=test[6]; - test2[1]=test[7]; - test2[2]=test[4]; - test2[3]=test[5]; - test2[4]=test[2]; - test2[5]=test[3]; - test2[6]=test[0]; - test2[7]=test[1]; - test2[8]=0;*/ return test2; } const char* congetModuAddr(Linker::SimObject *obj, S32 argc, const char *argv[]) @@ -44,15 +36,14 @@ const char* congetModuAddr(Linker::SimObject *obj, S32 argc, const char *argv[]) char test2[256]=""; int spr=(signed int)moduroutine; sprintf(test2,"B8%08XFFE0",endian(spr)); - /*test2[0]=test[6]; - test2[1]=test[7]; - test2[2]=test[4]; - test2[3]=test[5]; - test2[4]=test[2]; - test2[5]=test[3]; - test2[6]=test[0]; - test2[7]=test[1]; - test2[8]=0;*/ + return test2; +} +const char* congetInterpreterAddr(Linker::SimObject *obj, S32 argc, const char *argv[]) +{ + char test[256] = ""; + char test2[256]=""; + int spr=(signed int)interpreterRoutine; + sprintf(test2,"B8%08XFFE0",endian(spr)); return test2; } @@ -76,7 +67,10 @@ class CImmDevice Con::addMethodB(NULL, "loadMod", &conLoadMod, "Loads a C++ modification.",2,2); Con::addMethodS(NULL, "getServPAddr",&congetServPAddr,"Gets the memPatch data for ServerProcess",1,1); VirtualProtect( (LPVOID)moduroutine,sizeof(moduroutine),PAGE_EXECUTE_READWRITE,&oldprotect); + VirtualProtect( (LPVOID)interpreterRoutine,sizeof(interpreterRoutine),PAGE_EXECUTE_READWRITE,&oldprotect); Con::addMethodS(NULL, "getModuAddr",&congetModuAddr,"Gets the memPatch data for the MODULO operator routine",1,1); // memPatch("42D89D",getModuAddr()); + Con::addMethodS(NULL, "getInterAddr", &congetInterpreterAddr, "Gets the memPatch data for the interpreter switchtable",1,1); // memPatch("42CED1",getInterAddr()); + // Load the original TribesNext DLL if available typedef void (*LPINITT2DLL)(void); HINSTANCE hDLL = NULL;