Przeglądaj źródła

Most recent version

master
c0dycode 4 lat temu
rodzic
commit
be4f51be02
1 zmienionych plików z 145 dodań i 82 usunięć
  1. +145
    -82
      BL3ProxySettings.cpp

+ 145
- 82
BL3ProxySettings.cpp Wyświetl plik

@@ -80,6 +80,8 @@ auto generateMicropatchArrayPattern = xorstr("48 89 5C 24 ?? 48 89 74 24 ?? 48 8
auto generateMicropatchArrayBackupPattern = xorstr("48 8D 54 24 ?? E8 ?? ?? ?? ?? 48 8D 55 60"); auto generateMicropatchArrayBackupPattern = xorstr("48 8D 54 24 ?? E8 ?? ?? ?? ?? 48 8D 55 60");
auto getNewsItemsPattern = xorstr("48 89 ?? ?? ?? 48 89 ?? ?? ?? 48 89 ?? ?? ?? 48 89 ?? ?? ?? 55 41 ?? 41 ?? 41 ?? 41 ?? 48 8D ?? ?? ?? ?? ?? ?? 48 81 EC ?? ?? ?? ?? ?? 8D"); auto getNewsItemsPattern = xorstr("48 89 ?? ?? ?? 48 89 ?? ?? ?? 48 89 ?? ?? ?? 48 89 ?? ?? ?? 55 41 ?? 41 ?? 41 ?? 41 ?? 48 8D ?? ?? ?? ?? ?? ?? 48 81 EC ?? ?? ?? ?? ?? 8D");
auto FGbxSparkModuleStartupModulePattern = xorstr("40 53 48 83 EC 50 48 8B D9 48 89 0D"); auto FGbxSparkModuleStartupModulePattern = xorstr("40 53 48 83 EC 50 48 8B D9 48 89 0D");
auto onMicropatchesReceivedPattern = xorstr("48 89 5C 24 ?? 48 89 74 24 ?? 55 57 41 55 41 56 41 57 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 48 63 51 08");
auto areMicropatchesDifferentPattern = xorstr("48 89 5C 24 ?? 55 56 57 48 83 EC 20 C7 02");
// + 0x33 // + 0x33
auto parseJSONString = xorstr("40 55 53 56 57 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 45 10 48 8B D9"); auto parseJSONString = xorstr("40 55 53 56 57 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 45 10 48 8B D9");


@@ -91,6 +93,8 @@ auto reallocPattern = xorstr("48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 20 48 8B


CRITICAL_SECTION critsec; CRITICAL_SECTION critsec;


static bool isInInternalMode = false;

// //
//std::string startReceiveHotfixes_Pattern = xorstr("48 63 81 c4 00 00 00 83 f8 06 77 49 4c 8d 05"); //std::string startReceiveHotfixes_Pattern = xorstr("48 63 81 c4 00 00 00 83 f8 06 77 49 4c 8d 05");
//// ////
@@ -644,6 +648,9 @@ tGenerateMicropatchArray oGenerateMicropatchArray = NULL;
typedef void* (__fastcall* tParseJSONString)(void** jsonReader, const FString* text); typedef void* (__fastcall* tParseJSONString)(void** jsonReader, const FString* text);
tParseJSONString oParseJSONString = NULL; tParseJSONString oParseJSONString = NULL;


typedef bool(__fastcall* tAreMicropatchesDifferent)(TArray<FMicropatch>* micropatches, void* severity);
tAreMicropatchesDifferent oAreMicropatchesDifferent = NULL;

FSparkModule** pSparkModule = NULL; FSparkModule** pSparkModule = NULL;




@@ -720,6 +727,16 @@ void* hkParseJSONString(void** reader, FString* text) {
} }
json j; json j;
char buffer[256] = { 0 }; char buffer[256] = { 0 };
if (ModdedHotfixes == 0 && TotalHotfixes == 0) {
delete ws;
#ifdef _WIN32
WSACleanup();
#endif
if (oParseJSONString)
return oParseJSONString(reader, text);
return NULL;
}
sprintf(buffer, "%I64u/%I64u", ModdedHotfixes, TotalHotfixes); sprintf(buffer, "%I64u/%I64u", ModdedHotfixes, TotalHotfixes);
j["eventName"] = "getNews"; j["eventName"] = "getNews";
@@ -774,7 +791,7 @@ void* hkParseJSONString(void** reader, FString* text) {
#ifdef _WIN32 #ifdef _WIN32
WSACleanup(); WSACleanup();
#endif #endif
std::cout << modified.ToString() << std::endl;
//std::cout << modified.ToString() << std::endl;
if (oParseJSONString) { if (oParseJSONString) {
void* result = oParseJSONString(reader, text); void* result = oParseJSONString(reader, text);
return result; return result;
@@ -997,17 +1014,17 @@ static Curl_Write_Data* currentCurlWriteData = NULL;


size_t __stdcall hkWriteCallback(char* ptr, size_t size, size_t dataSize, void* userdata) { size_t __stdcall hkWriteCallback(char* ptr, size_t size, size_t dataSize, void* userdata) {
size_t writeSize = oWrite_Callback(ptr, size, dataSize, userdata); size_t writeSize = oWrite_Callback(ptr, size, dataSize, userdata);
currentCurlWriteData = (Curl_Write_Data*)userdata;
std::string currentURL = currentCurlWriteData->RequestURL.ToString();
if (currentURL.find("verification") != std::string::npos && currentURL.find("discovery") != std::string::npos) {
std::cout << "Need to get and alter response here" << std::endl;
/*static std::string moddedHotfixes = getMicropatchString();
currentCurlWriteData->Body->Content.ResizeGrow(currentCurlWriteData->Body->Content.Count, moddedHotfixes.size(), 1);
strcpy(currentCurlWriteData->Body->Content.Data, &moddedHotfixes.data()[0]);
currentCurlWriteData->Body->Content.Max = moddedHotfixes.size();
currentCurlWriteData->Body->Content.Count = moddedHotfixes.size();*/
std::cout << "" << std::endl;
}
//currentCurlWriteData = (Curl_Write_Data*)userdata;
//std::string currentURL = currentCurlWriteData->RequestURL.ToString();
//if (currentURL.find("verification") != std::string::npos && currentURL.find("discovery") != std::string::npos) {
// std::cout << "Need to get and alter response here" << std::endl;
// /*static std::string moddedHotfixes = getMicropatchString();
// currentCurlWriteData->Body->Content.ResizeGrow(currentCurlWriteData->Body->Content.Count, moddedHotfixes.size(), 1);
// strcpy(currentCurlWriteData->Body->Content.Data, &moddedHotfixes.data()[0]);
// currentCurlWriteData->Body->Content.Max = moddedHotfixes.size();
// currentCurlWriteData->Body->Content.Count = moddedHotfixes.size();*/
// std::cout << "" << std::endl;
//}
return writeSize; return writeSize;
} }


@@ -1038,56 +1055,61 @@ bool startLogging = false;
DWORD __stdcall hkCurl_Easy_SetOpt(void* curlHandle, long option, void* parameter) DWORD __stdcall hkCurl_Easy_SetOpt(void* curlHandle, long option, void* parameter)
{ {
DWORD result; DWORD result;
/*result = oCurl_Easy_SetOpt(curlHandle, option, parameter);*/
EnterCriticalSection(&critsec);
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
if (!isInInternalMode) {
EnterCriticalSection(&critsec);


result = oCurl_Easy_SetOpt(curlHandle, CURLOPT_PROXY, const_cast<char*>((proxyURLA + proxyPort).c_str()));
if (result != CURLE_OK) {
std::cout << "Failed to set proxy. Errorcode: " << result << std::endl;
}
result = oCurl_Easy_SetOpt(curlHandle, CURLOPT_PROXY, const_cast<char*>((proxyURLA + proxyPort).c_str()));
if (result != CURLE_OK) {
std::cout << "Failed to set proxy. Errorcode: " << result << std::endl;
}


result = oCurl_Easy_SetOpt(curlHandle, CURLOPT_ERRORBUFFER, errbuf);
if (result != CURLE_OK) {
std::cout << "Failed to set errorbuffer. Errorcode: " << result << std::endl;
}
result = oCurl_Easy_SetOpt(curlHandle, CURLOPT_ERRORBUFFER, errbuf);
if (result != CURLE_OK) {
std::cout << "Failed to set errorbuffer. Errorcode: " << result << std::endl;
}


if (option == CURLOPT_SSL_VERIFYHOST) {
parameter = (void*)0L;
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}
else if (option == CURLOPT_SSL_VERIFYPEER) {
parameter = (void*)0L;
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}
else if (option == CURLOPT_USE_SSL) {
parameter = (void*)CURLUSESSL_TRY;
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}
else if (option == CURLOPT_WRITEFUNCTION) {
std::cout << "Write data func at: 0x" << std::hex << parameter << std::endl;
if (option == CURLOPT_SSL_VERIFYHOST) {
parameter = (void*)0L;
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}
else if (option == CURLOPT_SSL_VERIFYPEER) {
parameter = (void*)0L;
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}
else if (option == CURLOPT_USE_SSL) {
parameter = (void*)CURLUSESSL_TRY;
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}
else if (option == CURLOPT_WRITEFUNCTION) {
//std::cout << "Write data func at: 0x" << std::hex << parameter << std::endl;


oWrite_Callback = (tWrite_Callback)parameter;
parameter = &hkWriteCallback;
hookedWriteCallback = true;
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}
else if (option == CURLOPT_READFUNCTION) {
std::cout << "Read data func at: 0x" << std::hex << parameter << std::endl;
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}
else if (option == CURLOPT_CAINFO) {
result = CURLE_OK;
}
else {
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}
oWrite_Callback = (tWrite_Callback)parameter;
parameter = &hkWriteCallback;
hookedWriteCallback = true;
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}
else if (option == CURLOPT_READFUNCTION) {
//std::cout << "Read data func at: 0x" << std::hex << parameter << std::endl;
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}
else if (option == CURLOPT_CAINFO) {
result = CURLE_OK;
}
else {
result = oCurl_Easy_SetOpt(curlHandle, option, parameter);
}


LeaveCriticalSection(&critsec);
LeaveCriticalSection(&critsec);
}


return result; return result;
} }


bool __fastcall hkAreMicropatchesDifferent(TArray<FMicropatch>* micropatches, void* severity) {
return true;
}

void hkGenerateMicropatchArray(void* someTMap, TArray<FMicropatch>* outPatches) { void hkGenerateMicropatchArray(void* someTMap, TArray<FMicropatch>* outPatches) {
if (oGenerateMicropatchArray) { if (oGenerateMicropatchArray) {
oGenerateMicropatchArray(someTMap, outPatches); oGenerateMicropatchArray(someTMap, outPatches);
@@ -1195,9 +1217,9 @@ void hkGetNewsItems(void* newsWidget) {
if (*pSparkModule) { if (*pSparkModule) {
if ((*pSparkModule)->SparkNewsService && (*pSparkModule)->SparkNewsService->NewsItems.Data != NULL) { if ((*pSparkModule)->SparkNewsService && (*pSparkModule)->SparkNewsService->NewsItems.Data != NULL) {
for (int i = 0; i < (*pSparkModule)->SparkNewsService->NewsItems.Count; ++i) {
/*for (int i = 0; i < (*pSparkModule)->SparkNewsService->NewsItems.Count; ++i) {
std::cout << (*pSparkModule)->SparkNewsService->NewsItems.Data[i].NewsText.ToString() << std::endl; std::cout << (*pSparkModule)->SparkNewsService->NewsItems.Data[i].NewsText.ToString() << std::endl;
}
}*/
} }
} }
if (oGetNewsItems) { if (oGetNewsItems) {
@@ -1344,17 +1366,11 @@ DWORD WINAPI MainThread(LPVOID param)
} }
std::cout << "Found 5/7 Patterns" << std::endl; std::cout << "Found 5/7 Patterns" << std::endl;


/*uintptr_t generateMicropatchArray = PatternScan::FindSignature(NULL, generateMicropatchArrayPattern.crypt_get());
while (generateMicropatchArray == NULL) {
generateMicropatchArray = PatternScan::FindSignature(NULL, generateMicropatchArrayPattern.crypt_get());
Sleep(50);
}*/
std::cout << "Found 6/7 Patterns" << std::endl;
/*uintptr_t getNewsItems = PatternScan::FindSignature(NULL, getNewsItemsPattern.crypt_get());
while (getNewsItems == NULL) {
getNewsItems = PatternScan::FindSignature(NULL, getNewsItemsPattern.crypt_get());
Sleep(50);
}*/
uintptr_t areMicropatchesDifferentAddress = PatternScan::FindSignature(NULL, areMicropatchesDifferentPattern.crypt_get());
while (areMicropatchesDifferentAddress == NULL) {
areMicropatchesDifferentAddress = PatternScan::FindSignature(NULL, areMicropatchesDifferentPattern.crypt_get());
Sleep(100);
}


uintptr_t sparkModuleAddress = PatternScan::FindSignature(NULL, FGbxSparkModuleStartupModulePattern.crypt_get()); uintptr_t sparkModuleAddress = PatternScan::FindSignature(NULL, FGbxSparkModuleStartupModulePattern.crypt_get());
while (sparkModuleAddress == NULL) { while (sparkModuleAddress == NULL) {
@@ -1366,15 +1382,7 @@ DWORD WINAPI MainThread(LPVOID param)


pSparkModule = reinterpret_cast<FSparkModule**>(sparkModuleAddress + sparkSingletonOffset + 7); pSparkModule = reinterpret_cast<FSparkModule**>(sparkModuleAddress + sparkSingletonOffset + 7);


/*uintptr_t parseJSONStringAddress = PatternScan::FindSignature(NULL, parseJSONString.crypt_get());
while (parseJSONStringAddress == NULL) {
parseJSONStringAddress = PatternScan::FindSignature(NULL, parseJSONString.crypt_get());
Sleep(50);
}
parseJSONStringAddress += 0x33;

int32_t parseJSONStringOffset = *(int32_t*)(parseJSONStringAddress + 1);
parseJSONStringAddress = parseJSONStringAddress + parseJSONStringOffset + 5;*/


std::cout << "Found 7/7 Patterns" << std::endl; std::cout << "Found 7/7 Patterns" << std::endl;
/*uintptr_t fsparkmanagerctor = PatternScan::FindSignature(NULL, sparkManagerCtorPattern.c_str()); /*uintptr_t fsparkmanagerctor = PatternScan::FindSignature(NULL, sparkManagerCtorPattern.c_str());
@@ -1415,14 +1423,10 @@ DWORD WINAPI MainThread(LPVOID param)
Sleep(200); Sleep(200);
while (MH_CreateHookEx((LPVOID)curl_easy_getinfo, &hkCurl_Easy_GetInfo, &oCurl_Easy_GetInfo) != MH_OK) while (MH_CreateHookEx((LPVOID)curl_easy_getinfo, &hkCurl_Easy_GetInfo, &oCurl_Easy_GetInfo) != MH_OK)
Sleep(200); Sleep(200);
while (MH_CreateHookEx((LPVOID)areMicropatchesDifferentAddress, &hkAreMicropatchesDifferent, &oAreMicropatchesDifferent) != MH_OK)
Sleep(200);
std::cout << "Placed 5/7 hooks" << std::endl; std::cout << "Placed 5/7 hooks" << std::endl;
/*while (MH_CreateHookEx((LPVOID)generateMicropatchArray, &hkGenerateMicropatchArray, &oGenerateMicropatchArray) != MH_OK)
Sleep(200);*/
std::cout << "Placed 6/7 hooks" << std::endl;
/*while (MH_CreateHookEx((LPVOID)getNewsItems, &hkGetNewsItems, &oGetNewsItems) != MH_OK)
Sleep(200); */
/*while (MH_CreateHookEx((LPVOID)parseJSONStringAddress, &hkParseJSONString, &oParseJSONString) != MH_OK)
Sleep(200);*/
std::cout << "Placed 7/7 hooks" << std::endl; std::cout << "Placed 7/7 hooks" << std::endl;
while (MH_EnableHook(MH_ALL_HOOKS) != MH_OK) { while (MH_EnableHook(MH_ALL_HOOKS) != MH_OK) {
Sleep(200); Sleep(200);
@@ -1435,8 +1439,67 @@ DWORD WINAPI MainThread(LPVOID param)
struct ArgStruct { struct ArgStruct {
const char dllPath[MAX_PATH]; const char dllPath[MAX_PATH];
int portNumber; int portNumber;
bool boolValue;
}; };


// TODO: Send log messages on success/errors
extern "C" __declspec(dllexport) DWORD __stdcall ToggleOperationalMode(ArgStruct* argStruct)
{
EnterCriticalSection(&critsec);
static uintptr_t generateMicropatchArray;
while (generateMicropatchArray == NULL) {
generateMicropatchArray = PatternScan::FindSignature(NULL, generateMicropatchArrayPattern.crypt_get());
Sleep(50);
}
static uintptr_t getNewsItems;
while (getNewsItems == NULL) {
getNewsItems = PatternScan::FindSignature(NULL, getNewsItemsPattern.crypt_get());
Sleep(50);
}
static uintptr_t parseJSONStringAddress;
while (parseJSONStringAddress == NULL) {
parseJSONStringAddress = PatternScan::FindSignature(NULL, parseJSONString.crypt_get());
if (parseJSONStringAddress != NULL) {
parseJSONStringAddress += 0x33;

int32_t parseJSONStringOffset = *(int32_t*)(parseJSONStringAddress + 1);
parseJSONStringAddress = parseJSONStringAddress + parseJSONStringOffset + 5;
}
Sleep(50);
}
// Hook or unhook
if (argStruct->boolValue && !isInInternalMode) {
MH_STATUS hookStatus = MH_CreateHookEx((LPVOID)generateMicropatchArray, &hkGenerateMicropatchArray, &oGenerateMicropatchArray);
if (hookStatus == MH_ERROR_ALREADY_CREATED || hookStatus == MH_OK) {
hookStatus = MH_EnableHook((LPVOID)generateMicropatchArray);
}
hookStatus = MH_CreateHookEx((LPVOID)getNewsItems, &hkGetNewsItems, &oGetNewsItems);
if (hookStatus == MH_ERROR_ALREADY_CREATED || hookStatus == MH_OK) {
hookStatus = MH_EnableHook((LPVOID)getNewsItems);
}
hookStatus = MH_CreateHookEx((LPVOID)parseJSONStringAddress, &hkParseJSONString, &oParseJSONString);
if (hookStatus == MH_ERROR_ALREADY_CREATED || hookStatus == MH_OK) {
hookStatus = MH_EnableHook((LPVOID)parseJSONStringAddress);
}

isInInternalMode = true;
}
else if (!argStruct->boolValue && isInInternalMode) {
while (MH_DisableHook((LPVOID)generateMicropatchArray) != MH_OK)
Sleep(200);
while (MH_DisableHook((LPVOID)getNewsItems) != MH_OK)
Sleep(200);
while (MH_DisableHook((LPVOID)parseJSONStringAddress) != MH_OK)
Sleep(200);
while (MH_ApplyQueued() != MH_OK)
Sleep(200);
isInInternalMode = false;
}

LeaveCriticalSection(&critsec);
return TRUE;
}

extern "C" __declspec(dllexport) DWORD __stdcall InitFunc(ArgStruct * argstruct) extern "C" __declspec(dllexport) DWORD __stdcall InitFunc(ArgStruct * argstruct)
{ {
EnterCriticalSection(&critsec); EnterCriticalSection(&critsec);


Ładowanie…
Anuluj
Zapisz