diff --git a/game_payload/src/ace.c b/game_payload/src/ace.c index de9d032..04a4d5c 100644 --- a/game_payload/src/ace.c +++ b/game_payload/src/ace.c @@ -9,83 +9,75 @@ static void _dll_notification(ULONG reason, const PLDR_DLL_NOTIFICATION_DATA dat return; } - // context should be set to the target module name, lowercase + // context should be set to the target module name wchar_t *targetModuleName = (wchar_t*)context; - wchar_t lwModuleName[MAX_PATH]; - wcscpy(lwModuleName, data->Loaded.BaseDllName->Buffer); - _wcslwr(lwModuleName); - - if (wcscmp(targetModuleName, lwModuleName) == 0) { - // Replace entry point with a stub - void *entryPoint = pe_find_entry_point(data->Loaded.DllBase); - - const char ENTRY_POINT_STUB[] = { - 0xB8, 0x01, 0x00, 0x00, 0x00, // mov eax, 1 - 0xC3 // ret - }; - - DWORD oldProtect; - VirtualProtect(entryPoint, sizeof(ENTRY_POINT_STUB), PAGE_EXECUTE_READWRITE, &oldProtect); - - memcpy(entryPoint, ENTRY_POINT_STUB, sizeof(ENTRY_POINT_STUB)); - - VirtualProtect(entryPoint, sizeof(ENTRY_POINT_STUB), oldProtect, &oldProtect); + if (wcsicmp(targetModuleName, data->Loaded.BaseDllName->Buffer) != 0) { + return; } + + // Replace entry point with a stub + void *entryPoint = pe_find_entry_point(data->Loaded.DllBase); + + const char ENTRY_POINT_STUB[] = { + 0xB8, 0x01, 0x00, 0x00, 0x00, // mov eax, 1 + 0xC3 // ret + }; + + DWORD oldProtect; + VirtualProtect(entryPoint, sizeof(ENTRY_POINT_STUB), PAGE_EXECUTE_READWRITE, &oldProtect); + + memcpy(entryPoint, ENTRY_POINT_STUB, sizeof(ENTRY_POINT_STUB)); + + VirtualProtect(entryPoint, sizeof(ENTRY_POINT_STUB), oldProtect, &oldProtect); + +} + +static void _create_driver_file(const char *path) { + // They only report presence + HANDLE file = CreateFileA(path, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + + if (file == INVALID_HANDLE_VALUE) { + msg_err_a("Could not create driver file: %s", file); + } + + CloseHandle(file); } void ace_fake_driver_files() { - // They only report presence - const char *wdDriverPath = "ACE-BASE.sys"; - const char *s32DriverPath = "C:\\windows\\system32\\drivers\\ACE-BASE.sys"; - - HANDLE wdDriverFile = CreateFileA(wdDriverPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (!wdDriverFile) { - msg_err_a("Could not create driver file: %s", wdDriverPath); - } + _create_driver_file("ACE-BASE.sys"); // Just in case - HANDLE s32DriverFile = CreateFileA(s32DriverPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (!s32DriverFile) { - msg_err_a("Could not create driver file: %s", s32DriverPath); + _create_driver_file("C:\\windows\\system32\\drivers\\ACE-BASE.sys"); +} + +HMODULE _load_module_patched(wchar_t *path) { + // Get filename from the path + wchar_t *name = wcsrchr(path, '\\'); + name = name ? name + 1 : path; + + void *cookie; + LdrRegisterDllNotification(0, &_dll_notification, name, &cookie); + + HMODULE module = LoadLibraryW(path); + if (!module) { + msg_err_w(L"Could not load module: %ls", path); } - CloseHandle(wdDriverFile); - CloseHandle(s32DriverFile); + // LoadLibraryW is synchronous; the notification function has already finished executing + LdrUnregisterDllNotification(cookie); + + return module; } HMODULE ace_load_base_module(const char *exeName) { wchar_t baseModuleName[MAX_PATH]; - swprintf(baseModuleName, MAX_PATH, L"%sbase.dll", exeName); + swprintf(baseModuleName, MAX_PATH, L"%sBase.dll", exeName); wcslwr(baseModuleName); - void *cookie; - LdrRegisterDllNotification(0, &_dll_notification, baseModuleName, &cookie); - - HMODULE baseModule = LoadLibraryW(baseModuleName); - if (!baseModule) { - msg_err_w(L"Could not load base module: %ls", baseModuleName); - } - - // LoadLibraryA is synchronous; the notification function has already finished executing - LdrUnregisterDllNotification(cookie); - - return baseModule; + return _load_module_patched(baseModuleName); } HMODULE ace_load_driver_module() { - const char *driverModulePath = "AntiCheatExpert/InGame/x64/ACE-DRV64.dll"; - - void *cookie; - LdrRegisterDllNotification(0, &_dll_notification, L"ace-drv64.dll", &cookie); - - HMODULE driverModule = LoadLibraryA(driverModulePath); - if (!driverModule) { - msg_err_a("Could not load driver module: %s", driverModulePath); - } - - // LoadLibraryA is synchronous; the notification function has already finished executing - LdrUnregisterDllNotification(cookie); - - return driverModule; + return _load_module_patched(L"AntiCheatExpert\\InGame\\x64\\ACE-DRV64.dll"); }