From a33448addee9f84300f81198ddcd40e5a8988645 Mon Sep 17 00:00:00 2001 From: oureveryday Date: Mon, 1 Jan 2024 15:21:05 +0800 Subject: [PATCH] Update --- README.md | 28 ++- Release_dlls/SteamAPICheckBypass.dll | Bin 50688 -> 82944 bytes Release_dlls/SteamAPICheckBypass_x32.dll | Bin 38912 -> 68096 bytes SteamAPICheckBypass.EXAMPLE.ini | 7 + SteamAPICheckBypass/dllmain.cpp | 299 ++++++++++++++++------- SteamAPICheckBypass_x32/dllmain.cpp | 299 +++++++++++++++++------ 6 files changed, 469 insertions(+), 164 deletions(-) create mode 100644 SteamAPICheckBypass.EXAMPLE.ini diff --git a/README.md b/README.md index fece9b2..b7025cc 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,6 @@ Bypasses Steam API dll integrity/size check by hooking CreateFile API. ## Usage -* Rename original `steam_api(64).dll` to `steam_api(64).org` or `steam_api(64).api.bak` or `steam_api(64)_o.dll` first. - ### Method 1 * Use CFF Explorer and add `SteamAPICheckBypass` dll import to game main exe, then put the `SteamAPICheckBypass(x32).dll` dll beside game exe. @@ -18,6 +16,32 @@ Bypasses Steam API dll integrity/size check by hooking CreateFile API. * Put `SteamAPICheckBypass.dll` `version.dll` `libraries.txt` beside game exe. +## Configuration (Optional) + +* Create `SteamAPICheckBypass.ini` and write file names you want to replace. Example: + +```text +[Replace] +OriginalFileFile=ReplaceFileName +steam_api64.dll=steam_api64.dll.bak +steam_api.dll=steam_api.dll.bak + +[AfterFirstTime] +OriginalFileFile=0 +steam_api.dll=0 +``` + +* `Replace`: The file name to replace. +* `AfterFirstTime`: Start to replace after the first read of the file. + +## Internal Process + +1. The Crack will check `useinternallist` in the source code, if it's true, it will use `internalreplaceList`. + +2. The Crack will try to parse the ini file and add them into the replace list. + +3. If ini file not exist, try find `steam_api(64).dll.bak`, `steam_api(64).org`,`steam_api(64)_o.dll` and add the existed file into replace list. + ## Dependencies * diff --git a/Release_dlls/SteamAPICheckBypass.dll b/Release_dlls/SteamAPICheckBypass.dll index 9a5922d7dff1ca846c334bbf0755ab227b50d930..9ad5121cb01aa4caa143d9c82d2b74942b2350ff 100644 GIT binary patch literal 82944 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 literal 50688 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 M8vghC-==~84`BvsA^-pY diff --git a/Release_dlls/SteamAPICheckBypass_x32.dll b/Release_dlls/SteamAPICheckBypass_x32.dll index 2f895f99f84c3f051eecbcb8614be237c38bb92a..b67c1369ad456fe648a16845d586f0780b948b2c 100644 GIT binary patch literal 68096 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 b@s0Y%@YS#x_=+9;z(?rEApiKtsDb|m!PbdL delta 17846 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 A!2kdN diff --git a/SteamAPICheckBypass.EXAMPLE.ini b/SteamAPICheckBypass.EXAMPLE.ini new file mode 100644 index 0000000..baf12e8 --- /dev/null +++ b/SteamAPICheckBypass.EXAMPLE.ini @@ -0,0 +1,7 @@ +[Replace] +steam_api64.dll=steam_api64.dll.bak +steam_api.dll=steam_api.dll.bak + +[AfterFirstTime] +steam_api.dll=0 +steam_api.dll=0 diff --git a/SteamAPICheckBypass/dllmain.cpp b/SteamAPICheckBypass/dllmain.cpp index 4765c6d..0ec2429 100644 --- a/SteamAPICheckBypass/dllmain.cpp +++ b/SteamAPICheckBypass/dllmain.cpp @@ -5,21 +5,47 @@ #include "detours.h" #include "Console.h" -#include -#include -#include -#include +#include #include +#include +#include +#include +#include + #pragma comment(lib, "detours.lib") #pragma comment(lib, "ntdll.lib") +struct Replace +{ + std::string origname; + std::string replacename; + bool replaceafterfirsttime; // Replace reading request after reading for first time + bool firstime = false; // first time read indicator, should always be false +}; + +//----------Configuration start--------------- + +bool useinternallist = false; //Use built-in replace list without reading .ini file + +std::vector internalreplaceList = { + {"steam_api.dll", "steam_api.org", false, false}, + {"steam_api64.dll", "steam_api64.org", false, false}, +};//internal replace list example + +//----------Configuration end----------------- + + #pragma region Utils +bool isFileExist(const wchar_t* fileName) { + HANDLE hFile = CreateFileW(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile != INVALID_HANDLE_VALUE) { + CloseHandle(hFile); + return true; + } + return false; +} -wchar_t steamAPI_Path[MAX_PATH]; -wchar_t steamAPI64_Path[MAX_PATH]; -bool steamAPI_P = false; -bool steamAPI64_P = false; void PrintLog(std::string str) { @@ -33,6 +59,38 @@ void PrintLog(std::string str) OutputDebugString(wideString); delete[] wideString; } +std::string convertWCharToString(const wchar_t* wideString) { + // Get the length of the converted string + int size = WideCharToMultiByte(CP_UTF8, 0, wideString, -1, NULL, 0, NULL, NULL); + + // Allocate a buffer for the converted string + char* buffer = new char[size]; + + // Convert the wchar_t string to a char string + WideCharToMultiByte(CP_UTF8, 0, wideString, -1, buffer, size, NULL, NULL); + + // Create a std::string from the char string + std::string convertedString(buffer); + + // Clean up the allocated buffer + delete[] buffer; + + return convertedString; +} + +wchar_t const* GetCurrentPath() +{ + wchar_t exePath[MAX_PATH]; + GetModuleFileNameW(NULL, exePath, MAX_PATH); + wchar_t* lastBackslash = wcsrchr(exePath, L'\\'); + if (lastBackslash != nullptr) { + *lastBackslash = L'\0'; // Null-terminate to get the directory path + } + return exePath; +} +#pragma endregion + +std::vector replaceList; HANDLE(WINAPI* OrigCreateFileW) ( LPCWSTR lpFileName, @@ -52,6 +110,41 @@ HANDLE(WINAPI* OrigCreateFileA) ( DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) = CreateFileA; +std::string GetReplacedPath(std::string path) +{ + // Get the file name from the path + size_t lastSlash = path.find_last_of('/'); + size_t lastBackslash = path.find_last_of('\\'); + size_t lastSeparator = (lastSlash > lastBackslash) ? lastSlash : lastBackslash; + std::string filename = path.substr(lastSeparator + 1); + + // Check if the file name matches any entry in the replaceList + for (Replace& replace : replaceList) + { + if (filename.find(replace.origname) != std::string::npos) + { + + replace.firstime = true; + + if (replace.replaceafterfirsttime && !replace.firstime) + { + PrintLog("Reading " + replace.origname + "for first time."); + break; + } + PrintLog("Reading " + replace.origname + ",Replacing..."); + // Replace the path's filename with replacename + size_t pos = path.find_last_of("/\\"); + path = path.substr(0, pos + 1) + replace.replacename; + PrintLog(path); + // Set firstime to true if replaceafterfirsttime is true and firstime is false + + + break; // No need to check further once a replacement is made + } + } + + return path; +} HANDLE WINAPI CreateFileAHook( LPCSTR lpFileName, @@ -62,30 +155,9 @@ HANDLE WINAPI CreateFileAHook( DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { - LPCSTR newFileName; - std::string origpath = std::string(lpFileName); - std::transform(origpath.begin(), origpath.end(), origpath.begin(), tolower); - if ((std::string::npos != origpath.find("steam_api.dll")) && steamAPI_P) - { - PrintLog("Detected reading steam_api.dll at CreateFileA, replacing..."); - int bufferSize = WideCharToMultiByte(CP_UTF8, 0, steamAPI_Path, -1, NULL, 0, NULL, NULL); - LPSTR ansiString = new char[bufferSize]; - WideCharToMultiByte(CP_UTF8, 0, steamAPI_Path, -1, ansiString, bufferSize, NULL, NULL); - newFileName = ansiString; - } - else if ((std::string::npos != origpath.find("steam_api64.dll")) && steamAPI64_P) - { - PrintLog("Detected reading steam_api64.dll at CreateFileA, replacing..."); - int bufferSize = WideCharToMultiByte(CP_UTF8, 0, steamAPI64_Path, -1, NULL, 0, NULL, NULL); - LPSTR ansiString = new char[bufferSize]; - WideCharToMultiByte(CP_UTF8, 0, steamAPI64_Path, -1, ansiString, bufferSize, NULL, NULL); - newFileName = ansiString; - } - else - { - newFileName = lpFileName; - } + std::string newFileNamestring = GetReplacedPath(origpath); + LPCSTR newFileName = newFileNamestring.c_str(); return OrigCreateFileA(newFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } @@ -99,31 +171,16 @@ HANDLE WINAPI CreateFileWHook( DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { - LPCWSTR newFileName; - size_t len = wcslen(lpFileName) + 1; size_t convertedChars = 0; char* mbstr = new char[len]; wcstombs_s(&convertedChars, mbstr, len, lpFileName, len - 1); std::string origpath = std::string(mbstr); - delete[] mbstr; - std::transform(origpath.begin(), origpath.end(), origpath.begin(), tolower); - if ((std::string::npos != origpath.find("steam_api.dll")) && steamAPI_P) - { - PrintLog("Detected reading steam_api.dll at CreateFileW, replacing..."); - newFileName = steamAPI_Path; - } - else if ((std::string::npos != origpath.find("steam_api64.dll")) && steamAPI64_P) - { - PrintLog("Detected reading steam_api64.dll at CreateFileW, replacing..."); - newFileName = steamAPI64_Path; - } - else - { - newFileName = lpFileName; - } + std::string newFileName = GetReplacedPath(origpath); + std::wstring newFileNamestring = std::wstring(newFileName.begin(), newFileName.end()); + LPCWSTR newFileNameLPC=newFileNamestring.c_str(); - return OrigCreateFileW(newFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); + return OrigCreateFileW(newFileNameLPC, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } @@ -154,16 +211,73 @@ void LoadHook() PrintLog("CreateFileW Hook Failed."); } -bool isFileExist(const wchar_t* fileName) { - HANDLE hFile = CreateFileW(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile != INVALID_HANDLE_VALUE) { - CloseHandle(hFile); - return true; +LPCWSTR ConvertToLPCWSTR(const char* charString) { + int size = MultiByteToWideChar(CP_UTF8, 0, charString, -1, nullptr, 0); + wchar_t* buffer = new wchar_t[size]; + MultiByteToWideChar(CP_UTF8, 0, charString, -1, buffer, size); + return buffer; +} + +LPWSTR ConvertToLPWSTR(const char* charString) { + int size = MultiByteToWideChar(CP_UTF8, 0, charString, -1, nullptr, 0); + wchar_t* buffer = new wchar_t[size]; + MultiByteToWideChar(CP_UTF8, 0, charString, -1, buffer, size); + return buffer; +} + +bool readReplacesFromIni(const std::string& filename, std::vector& replaceList) { + std::ifstream iniFile(filename); + std::string line; + std::map replaceMap; + std::map afterFirstTimeMap; + if (!iniFile.is_open()) { + PrintLog("Unable to open ini file."); + return false; } - return false; + + + while (std::getline(iniFile, line) && line != "[AfterFirstTime]") { + if (line[0] == '[') continue; + std::istringstream is_line(line); + std::string key; + if (std::getline(is_line, key, '=')) { + std::string value; + if (std::getline(is_line, value)) { + replaceMap[key] = value; + } + } + } + + while (std::getline(iniFile, line)) { + if (line[0] == '[') continue; + std::istringstream is_line(line); + std::string key; + if (std::getline(is_line, key, '=')) { + std::string value; + if (std::getline(is_line, value)) { + if (value == "1") + { + afterFirstTimeMap[key] = true; + } + else afterFirstTimeMap[key] = false; + } + } + } + + + for (const auto& entry : replaceMap) { + Replace replace; + replace.origname = entry.first; + replace.replacename = entry.second; + replace.replaceafterfirsttime = afterFirstTimeMap[entry.first]; + replaceList.push_back(replace); + } + + iniFile.close(); + return true; } -void Checkfile() +void Checkfile(std::vector& replaceList) { PrintLog("Checking Original Steam_API(64) files..."); @@ -212,44 +326,67 @@ void Checkfile() if (SteamAPI_BAK) { PrintLog("Found steam_api.dll.bak."); - steamAPI_P = true; - wcscpy_s(steamAPI_Path, MAX_PATH, steamAPI_BAK); - } - - if (SteamAPI_ORG) + replaceList.push_back({ "steam_api.dll","steam_api.dll.bak",false }); + }else if (SteamAPI_ORG) { PrintLog("Found steam_api.org."); - steamAPI_P = true; - wcscpy_s(steamAPI_Path, MAX_PATH, steamAPI_ORG); - } - - if (SteamAPI_O) + replaceList.push_back({ "steam_api.dll","steam_api.org",false }); + }else if (SteamAPI_O) { PrintLog("Found steam_api_o.dll."); - steamAPI_P = true; - wcscpy_s(steamAPI_Path, MAX_PATH, steamAPI_O); + replaceList.push_back({ "steam_api.dll","steam_api_o.dll",false }); } if (SteamAPI64_BAK) { PrintLog("Found steam_api64.dll.bak."); - steamAPI64_P = true; - wcscpy_s(steamAPI64_Path, MAX_PATH, steamAPI64_BAK); + replaceList.push_back({ "steam_api.dll","steam_api64.dll.bak",false }); + }else if (SteamAPI64_ORG) + { + PrintLog("Found steam_api64.org."); + replaceList.push_back({ "steam_api.dll","steam_api64.org",false }); + }else if (SteamAPI64_O) + { + PrintLog("Found steam_api64_o.dll."); + replaceList.push_back({ "steam_api.dll","steam_api64_o.dll",false }); } +} - if (SteamAPI64_ORG) +void GetReplaceList() +{ + wchar_t iniPath[MAX_PATH]; + wcscpy_s(iniPath, MAX_PATH, GetCurrentPath()); + wcscat_s(iniPath, MAX_PATH, L"\\SteamAPICheckBypass.ini"); + + if(useinternallist) { - PrintLog("Found steam_api64.org."); - steamAPI64_P = true; - wcscpy_s(steamAPI64_Path, MAX_PATH, steamAPI64_ORG); + replaceList = internalreplaceList; } - if (SteamAPI64_O) + if(readReplacesFromIni(convertWCharToString(iniPath), replaceList)) { - PrintLog("Found steam_api64_o.dll."); - steamAPI_P = true; - wcscpy_s(steamAPI_Path, MAX_PATH, steamAPI64_O); + PrintLog("Successfully get ini replace infos."); + } + else + { + PrintLog("Failed to get ini replace infos, detecting files..."); + Checkfile(replaceList); } + PrintLog("-----------------"); + PrintLog("Replace List:"); + { + for (const auto& replace : replaceList) { + PrintLog(replace.origname + "," + replace.replacename); + } + } + PrintLog("-----------------"); +} + +void Init() +{ + PrintLog("SteamAPICheckBypass Init"); + GetReplaceList(); + LoadHook(); } BOOL APIENTRY DllMain(HMODULE hModule, @@ -257,7 +394,6 @@ BOOL APIENTRY DllMain(HMODULE hModule, LPVOID lpReserved ) { - LONG Error; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: @@ -267,8 +403,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, #endif PrintLog("Steam API Check Bypass dll Loaded."); - Checkfile(); - LoadHook(); + Init(); case DLL_PROCESS_DETACH: case DLL_THREAD_ATTACH: diff --git a/SteamAPICheckBypass_x32/dllmain.cpp b/SteamAPICheckBypass_x32/dllmain.cpp index 4765c6d..febcea1 100644 --- a/SteamAPICheckBypass_x32/dllmain.cpp +++ b/SteamAPICheckBypass_x32/dllmain.cpp @@ -5,21 +5,47 @@ #include "detours.h" #include "Console.h" -#include -#include -#include -#include +#include #include +#include +#include +#include +#include + #pragma comment(lib, "detours.lib") #pragma comment(lib, "ntdll.lib") +struct Replace +{ + std::string origname; + std::string replacename; + bool replaceafterfirsttime; // Replace reading request after reading for first time + bool firstime = false; // first time read indicator, should always be false +}; + +//----------Configuration start--------------- + +bool useinternallist = false; //Use built-in replace list without reading .ini file + +std::vector internalreplaceList = { + {"steam_api.dll", "steam_api.org", false, false}, + {"steam_api64.dll", "steam_api64.org", false, false}, +};//internal replace list example + +//----------Configuration end----------------- + + #pragma region Utils +bool isFileExist(const wchar_t* fileName) { + HANDLE hFile = CreateFileW(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile != INVALID_HANDLE_VALUE) { + CloseHandle(hFile); + return true; + } + return false; +} -wchar_t steamAPI_Path[MAX_PATH]; -wchar_t steamAPI64_Path[MAX_PATH]; -bool steamAPI_P = false; -bool steamAPI64_P = false; void PrintLog(std::string str) { @@ -33,6 +59,38 @@ void PrintLog(std::string str) OutputDebugString(wideString); delete[] wideString; } +std::string convertWCharToString(const wchar_t* wideString) { + // Get the length of the converted string + int size = WideCharToMultiByte(CP_UTF8, 0, wideString, -1, NULL, 0, NULL, NULL); + + // Allocate a buffer for the converted string + char* buffer = new char[size]; + + // Convert the wchar_t string to a char string + WideCharToMultiByte(CP_UTF8, 0, wideString, -1, buffer, size, NULL, NULL); + + // Create a std::string from the char string + std::string convertedString(buffer); + + // Clean up the allocated buffer + delete[] buffer; + + return convertedString; +} + +wchar_t const* GetCurrentPath() +{ + wchar_t exePath[MAX_PATH]; + GetModuleFileNameW(NULL, exePath, MAX_PATH); + wchar_t* lastBackslash = wcsrchr(exePath, L'\\'); + if (lastBackslash != nullptr) { + *lastBackslash = L'\0'; // Null-terminate to get the directory path + } + return exePath; +} +#pragma endregion + +std::vector replaceList; HANDLE(WINAPI* OrigCreateFileW) ( LPCWSTR lpFileName, @@ -52,6 +110,41 @@ HANDLE(WINAPI* OrigCreateFileA) ( DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) = CreateFileA; +std::string GetReplacedPath(std::string path) +{ + // Get the file name from the path + size_t lastSlash = path.find_last_of('/'); + size_t lastBackslash = path.find_last_of('\\'); + size_t lastSeparator = (lastSlash > lastBackslash) ? lastSlash : lastBackslash; + std::string filename = path.substr(lastSeparator + 1); + + // Check if the file name matches any entry in the replaceList + for (Replace& replace : replaceList) + { + if (filename.find(replace.origname) != std::string::npos) + { + + replace.firstime = true; + + if (replace.replaceafterfirsttime && !replace.firstime) + { + PrintLog("Reading " + replace.origname + "for first time."); + break; + } + PrintLog("Reading " + replace.origname + ",Replacing..."); + // Replace the path's filename with replacename + size_t pos = path.find_last_of("/\\"); + path = path.substr(0, pos + 1) + replace.replacename; + PrintLog(path); + // Set firstime to true if replaceafterfirsttime is true and firstime is false + + + break; // No need to check further once a replacement is made + } + } + + return path; +} HANDLE WINAPI CreateFileAHook( LPCSTR lpFileName, @@ -62,30 +155,9 @@ HANDLE WINAPI CreateFileAHook( DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { - LPCSTR newFileName; - std::string origpath = std::string(lpFileName); - std::transform(origpath.begin(), origpath.end(), origpath.begin(), tolower); - if ((std::string::npos != origpath.find("steam_api.dll")) && steamAPI_P) - { - PrintLog("Detected reading steam_api.dll at CreateFileA, replacing..."); - int bufferSize = WideCharToMultiByte(CP_UTF8, 0, steamAPI_Path, -1, NULL, 0, NULL, NULL); - LPSTR ansiString = new char[bufferSize]; - WideCharToMultiByte(CP_UTF8, 0, steamAPI_Path, -1, ansiString, bufferSize, NULL, NULL); - newFileName = ansiString; - } - else if ((std::string::npos != origpath.find("steam_api64.dll")) && steamAPI64_P) - { - PrintLog("Detected reading steam_api64.dll at CreateFileA, replacing..."); - int bufferSize = WideCharToMultiByte(CP_UTF8, 0, steamAPI64_Path, -1, NULL, 0, NULL, NULL); - LPSTR ansiString = new char[bufferSize]; - WideCharToMultiByte(CP_UTF8, 0, steamAPI64_Path, -1, ansiString, bufferSize, NULL, NULL); - newFileName = ansiString; - } - else - { - newFileName = lpFileName; - } + std::string newFileNamestring = GetReplacedPath(origpath); + LPCSTR newFileName = newFileNamestring.c_str(); return OrigCreateFileA(newFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } @@ -99,31 +171,16 @@ HANDLE WINAPI CreateFileWHook( DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { - LPCWSTR newFileName; - size_t len = wcslen(lpFileName) + 1; size_t convertedChars = 0; char* mbstr = new char[len]; wcstombs_s(&convertedChars, mbstr, len, lpFileName, len - 1); std::string origpath = std::string(mbstr); - delete[] mbstr; - std::transform(origpath.begin(), origpath.end(), origpath.begin(), tolower); - if ((std::string::npos != origpath.find("steam_api.dll")) && steamAPI_P) - { - PrintLog("Detected reading steam_api.dll at CreateFileW, replacing..."); - newFileName = steamAPI_Path; - } - else if ((std::string::npos != origpath.find("steam_api64.dll")) && steamAPI64_P) - { - PrintLog("Detected reading steam_api64.dll at CreateFileW, replacing..."); - newFileName = steamAPI64_Path; - } - else - { - newFileName = lpFileName; - } + std::string newFileName = GetReplacedPath(origpath); + std::wstring newFileNamestring = std::wstring(newFileName.begin(), newFileName.end()); + LPCWSTR newFileNameLPC = newFileNamestring.c_str(); - return OrigCreateFileW(newFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); + return OrigCreateFileW(newFileNameLPC, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } @@ -154,16 +211,73 @@ void LoadHook() PrintLog("CreateFileW Hook Failed."); } -bool isFileExist(const wchar_t* fileName) { - HANDLE hFile = CreateFileW(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile != INVALID_HANDLE_VALUE) { - CloseHandle(hFile); - return true; +LPCWSTR ConvertToLPCWSTR(const char* charString) { + int size = MultiByteToWideChar(CP_UTF8, 0, charString, -1, nullptr, 0); + wchar_t* buffer = new wchar_t[size]; + MultiByteToWideChar(CP_UTF8, 0, charString, -1, buffer, size); + return buffer; +} + +LPWSTR ConvertToLPWSTR(const char* charString) { + int size = MultiByteToWideChar(CP_UTF8, 0, charString, -1, nullptr, 0); + wchar_t* buffer = new wchar_t[size]; + MultiByteToWideChar(CP_UTF8, 0, charString, -1, buffer, size); + return buffer; +} + +bool readReplacesFromIni(const std::string& filename, std::vector& replaceList) { + std::ifstream iniFile(filename); + std::string line; + std::map replaceMap; + std::map afterFirstTimeMap; + if (!iniFile.is_open()) { + PrintLog("Unable to open ini file."); + return false; } - return false; + + + while (std::getline(iniFile, line) && line != "[AfterFirstTime]") { + if (line[0] == '[') continue; + std::istringstream is_line(line); + std::string key; + if (std::getline(is_line, key, '=')) { + std::string value; + if (std::getline(is_line, value)) { + replaceMap[key] = value; + } + } + } + + while (std::getline(iniFile, line)) { + if (line[0] == '[') continue; + std::istringstream is_line(line); + std::string key; + if (std::getline(is_line, key, '=')) { + std::string value; + if (std::getline(is_line, value)) { + if (value == "1") + { + afterFirstTimeMap[key] = true; + } + else afterFirstTimeMap[key] = false; + } + } + } + + + for (const auto& entry : replaceMap) { + Replace replace; + replace.origname = entry.first; + replace.replacename = entry.second; + replace.replaceafterfirsttime = afterFirstTimeMap[entry.first]; + replaceList.push_back(replace); + } + + iniFile.close(); + return true; } -void Checkfile() +void Checkfile(std::vector& replaceList) { PrintLog("Checking Original Steam_API(64) files..."); @@ -212,44 +326,71 @@ void Checkfile() if (SteamAPI_BAK) { PrintLog("Found steam_api.dll.bak."); - steamAPI_P = true; - wcscpy_s(steamAPI_Path, MAX_PATH, steamAPI_BAK); + replaceList.push_back({ "steam_api.dll","steam_api.dll.bak",false }); } - - if (SteamAPI_ORG) + else if (SteamAPI_ORG) { PrintLog("Found steam_api.org."); - steamAPI_P = true; - wcscpy_s(steamAPI_Path, MAX_PATH, steamAPI_ORG); + replaceList.push_back({ "steam_api.dll","steam_api.org",false }); } - - if (SteamAPI_O) + else if (SteamAPI_O) { PrintLog("Found steam_api_o.dll."); - steamAPI_P = true; - wcscpy_s(steamAPI_Path, MAX_PATH, steamAPI_O); + replaceList.push_back({ "steam_api.dll","steam_api_o.dll",false }); } if (SteamAPI64_BAK) { PrintLog("Found steam_api64.dll.bak."); - steamAPI64_P = true; - wcscpy_s(steamAPI64_Path, MAX_PATH, steamAPI64_BAK); + replaceList.push_back({ "steam_api.dll","steam_api64.dll.bak",false }); } - - if (SteamAPI64_ORG) + else if (SteamAPI64_ORG) { PrintLog("Found steam_api64.org."); - steamAPI64_P = true; - wcscpy_s(steamAPI64_Path, MAX_PATH, steamAPI64_ORG); + replaceList.push_back({ "steam_api.dll","steam_api64.org",false }); } - - if (SteamAPI64_O) + else if (SteamAPI64_O) { PrintLog("Found steam_api64_o.dll."); - steamAPI_P = true; - wcscpy_s(steamAPI_Path, MAX_PATH, steamAPI64_O); + replaceList.push_back({ "steam_api.dll","steam_api64_o.dll",false }); + } +} + +void GetReplaceList() +{ + wchar_t iniPath[MAX_PATH]; + wcscpy_s(iniPath, MAX_PATH, GetCurrentPath()); + wcscat_s(iniPath, MAX_PATH, L"\\SteamAPICheckBypass.ini"); + + if (useinternallist) + { + replaceList = internalreplaceList; } + + if (readReplacesFromIni(convertWCharToString(iniPath), replaceList)) + { + PrintLog("Successfully get ini replace infos."); + } + else + { + PrintLog("Failed to get ini replace infos, detecting files..."); + Checkfile(replaceList); + } + PrintLog("-----------------"); + PrintLog("Replace List:"); + { + for (const auto& replace : replaceList) { + PrintLog(replace.origname + "," + replace.replacename); + } + } + PrintLog("-----------------"); +} + +void Init() +{ + PrintLog("SteamAPICheckBypass Init"); + GetReplaceList(); + LoadHook(); } BOOL APIENTRY DllMain(HMODULE hModule, @@ -257,7 +398,6 @@ BOOL APIENTRY DllMain(HMODULE hModule, LPVOID lpReserved ) { - LONG Error; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: @@ -267,8 +407,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, #endif PrintLog("Steam API Check Bypass dll Loaded."); - Checkfile(); - LoadHook(); + Init(); case DLL_PROCESS_DETACH: case DLL_THREAD_ATTACH: