Модератор форума
-
Автор темы
- #1
Привет, маюсь хуйней снова
Сегодня мы будем инжектить ваши dll в кс
В конце будут приготовленные мною файлы (дампы kernelbase.dll, gameoverlayrenderer.dll, дамп региона с хуками, оригинальная kernelbase.dll из SysWOW64)
Как выглядит LoadLibraryExW в kernelBase.dll в кс:
Перейдем в 758F010A (регион с хуками):
Идем в 68646B90 (gameoverlayrenderer.dll):
dword_68713DFC является вызовом оригинальной LoadLibraryExW
Перейдем по этому адресу (758F0100) в дамп региона с хуками:
Дальше на 77811185 в kernelbase.dll:
А теперь посмотрим на LoadLibraryExW в оригинальной kernelbase.dll в SysWOW64:
А теперь гляньте еще раз на последние 3 скрина - код с 1 и 2 = код с 3 -> оригинальная LoadLibraryExW
То есть для вызова оригинальной LoadLibraryExW нам нужен лишь адрес dword_68713DFC
Для этого просто просканируем gameoverlayrenderer.dll на нужный нам паттерн, найдем инструкцию с вызовом оригинальной функции, получим адрес и создадим поток в игре
Открыть процесс ксго сможете и без меня
Найдем сам адрес:
Как будет выглядеть наша функция и структура аргумента:
Воспользуемся https://yougame.biz/threads/127132/ и не будем выделять память, а лишь найдем, запишем поменяем протект и запустим, после чего дождемся окончания потока, обнулим участки памяти, использованные под аргумент и функцию, и поставим протект обратно:
Скомпилим и запустим, результат:
Для теста использовал https://yougame.biz/threads/113815/ от xnxkzeu
Все файлы (в т.ч. исходник инжектора) -
Сегодня мы будем инжектить ваши dll в кс
В конце будут приготовленные мною файлы (дампы kernelbase.dll, gameoverlayrenderer.dll, дамп региона с хуками, оригинальная kernelbase.dll из SysWOW64)
Как выглядит LoadLibraryExW в kernelBase.dll в кс:
Перейдем в 758F010A (регион с хуками):
jmp near ptr 68646B90
Идем в 68646B90 (gameoverlayrenderer.dll):
dword_68713DFC является вызовом оригинальной LoadLibraryExW
Перейдем по этому адресу (758F0100) в дамп региона с хуками:
Дальше на 77811185 в kernelbase.dll:
А теперь посмотрим на LoadLibraryExW в оригинальной kernelbase.dll в SysWOW64:
А теперь гляньте еще раз на последние 3 скрина - код с 1 и 2 = код с 3 -> оригинальная LoadLibraryExW
То есть для вызова оригинальной LoadLibraryExW нам нужен лишь адрес dword_68713DFC
Для этого просто просканируем gameoverlayrenderer.dll на нужный нам паттерн, найдем инструкцию с вызовом оригинальной функции, получим адрес и создадим поток в игре
Открыть процесс ксго сможете и без меня
Найдем сам адрес:
C++:
DWORD Instr = FindPattern(hProc, gameoverlayrenderer, (BYTE*)"\xFF\x15\x00\x00\x00\x00\x8B\xF8\xFF\x15\x00\x00\x00\x00\x8B", (char*)"xx????xxxx????x") + 2;
if (Instr == 1)
{
CloseHandle(hProc);
equit("Signature scanning failed");
}
DWORD oLoadLibraryExW = 0;
ReadProcessMemory(hProc, (LPCVOID)Instr, &oLoadLibraryExW, 4, nullptr);
ReadProcessMemory(hProc, (LPCVOID)oLoadLibraryExW, &oLoadLibraryExW, 4, nullptr);
if (!oLoadLibraryExW)
{
CloseHandle(hProc);
equit("Failed to get original address");
}
C++:
typedef HMODULE(__stdcall* fnLoadLibraryExW)(LPCWSTR, HANDLE, DWORD);
struct InjectInfo
{
WCHAR Path[260];
fnLoadLibraryExW pLoadLibraryExW;
};
void LoadLibraryExW_Thread(InjectInfo* info)
{
info->pLoadLibraryExW(info->Path, 0, 0);
}
C++:
PVOID pFunc = (PVOID)FreeSpaceInModule(hProc, gameoverlayrenderer, 0x1000);
PVOID pArg = (PVOID)FreeSpaceInModule(hProc, gameoverlayrenderer, sizeof(InjectInfo));
if (!pFunc || !pArg)
{
CloseHandle(hProc);
equit("Failed to find free space in memory");
}
DWORD OldProtectFunc = 0;
DWORD OldProtectArg = 0;
VirtualProtectEx(hProc, pFunc, 0x1000, PAGE_EXECUTE_READWRITE, &OldProtectFunc);
VirtualProtectEx(hProc, pArg, sizeof(InjectInfo), PAGE_EXECUTE_READWRITE, &OldProtectArg);
InjectInfo info;
info.pLoadLibraryExW = (fnLoadLibraryExW)oLoadLibraryExW;
wcscpy_s(info.Path, wszDllName);
WriteProcessMemory(hProc, pFunc, &LoadLibraryExW_Thread, 0x1000, nullptr);
WriteProcessMemory(hProc, pArg, &info, sizeof(InjectInfo), nullptr);
HANDLE hThread = CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)pFunc, pArg, 0, 0);
if (!hThread || hThread == INVALID_HANDLE_VALUE)
{
error("Failed to find free space in memory");
goto dontwait;
}
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
dontwait:
BYTE* Zeros = new BYTE[0x1000];
ZeroMemory(Zeros, 0x1000);
ZeroMemory(&info, sizeof(InjectInfo));
WriteProcessMemory(hProc, pFunc, Zeros, 0x1000, nullptr);
WriteProcessMemory(hProc, pArg, &info, sizeof(InjectInfo), nullptr);
VirtualProtectEx(hProc, pFunc, 0x1000, OldProtectFunc, &OldProtectFunc);
VirtualProtectEx(hProc, pArg, sizeof(InjectInfo), OldProtectArg, &OldProtectArg);
delete[] Zeros;
CloseHandle(hProc);
Для теста использовал https://yougame.biz/threads/113815/ от xnxkzeu
Все файлы (в т.ч. исходник инжектора) -
Пожалуйста, авторизуйтесь для просмотра ссылки.