Я лучше тебя
-
Автор темы
- #1
Шалам валейкум.
Смоделируем ситуацию: представим что есть некая игра, у которой есть античит с собственным драйвером, который не дает вам получить хендлы игры для своих манипуляций, а свой драйвер, написать вы не можете, по тому что хлебушки, да и тратится на цифровую подпись не охота.
Так как же нам модифицировать процесс в таком случае, если в клиенте после инициализации прилетают горы хуков под WinAPI? Как загрузить длл? или сделать запись в память?
Есть два пути объебать драйвер из ring3, одним я пользуюсь сейчас с приваткой рупб (там система защиты Frost), а второй для меня не актуален, по тому солью.
Суть очень проста: нужно ставить хук на CreateProcessW.
Для этого нам понадобится >>
МинХук это наиболее маленькая аптечка для хуков. Обертку "hook.h" которую мы будем юзать писал Крайслер для другого форума.
И таки начнем.
Создаем новый проект -> Win32 -> Dll, пустой проект.
Добавляем в него класс Base:
Смоделируем ситуацию: представим что есть некая игра, у которой есть античит с собственным драйвером, который не дает вам получить хендлы игры для своих манипуляций, а свой драйвер, написать вы не можете, по тому что хлебушки, да и тратится на цифровую подпись не охота.
Так как же нам модифицировать процесс в таком случае, если в клиенте после инициализации прилетают горы хуков под WinAPI? Как загрузить длл? или сделать запись в память?
Есть два пути объебать драйвер из ring3, одним я пользуюсь сейчас с приваткой рупб (там система защиты Frost), а второй для меня не актуален, по тому солью.
Суть очень проста: нужно ставить хук на CreateProcessW.
Для этого нам понадобится >>
Пожалуйста, авторизуйтесь для просмотра ссылки.
(Кликабельно) << (только исходный код, а если кому то взбредет в голову требовать вт на архив без исполняемых файлов пошел нахуй заранее)МинХук это наиболее маленькая аптечка для хуков. Обертку "hook.h" которую мы будем юзать писал Крайслер для другого форума.
И таки начнем.
Создаем новый проект -> Win32 -> Dll, пустой проект.
Добавляем в него класс Base:
Код:
#include <Windows.h>
//Подключаем обертку для MinHook
#include "hook.h"
//прототип функции
typedef BOOL (WINAPI* _CreateProcessW)(_In_opt_ LPCWSTR, _Inout_opt_ LPWSTR, _In_opt_ LPSECURITY_ATTRIBUTES, _In_opt_ LPSECURITY_ATTRIBUTES, _In_ BOOL, _In_ DWORD, _In_opt_ LPVOID, _In_opt_ LPCWSTR, _In_ LPSTARTUPINFOW, _Out_ LPPROCESS_INFORMATION);
//наш детур с обертки минхук
cDetour<_CreateProcessW>* t_CreateProcessW;
//Дубликат функции которую мы хукнем, наш аналог CreateProcessW
BOOL WINAPI my_CreateProcessW(
_In_opt_ LPCWSTR lpApplicationName,
_Inout_opt_ LPWSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCWSTR lpCurrentDirectory,
_In_ LPSTARTUPINFOW lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInformation)
{
//Пропускаем выполнение функции, но добавляем в крейчафлаг заморозку процесса
//чтобы он не проинициализировался без нас любимых и чтобы защита не вьебала хуки прежде чем мы провернем свои штучки
auto hReturn = t_CreateProcessW->GetTrampoline()(
lpApplicationName,
lpCommandLine,
lpProcessAttributes,
lpThreadAttributes,
bInheritHandles,
dwCreationFlags | CREATE_SUSPENDED,
lpEnvironment,
lpCurrentDirectory,
lpStartupInfo,
lpProcessInformation);
//Все, вы выполнили оригинальную функцию создания процесса, и у вас уже есть хендл процесса.
//По нему мы можем хоть в жопу ебатся, это промежуточный хендл, 99% программ планеты земля сразу его закрывают.
//И его приемущество в том, что у него полный доступ, дальше вы тут можете припаять инжект, патч память,
//да хоть хуй собачий. все что вам взбредет в голову.
HANDLE hCreateProcessHandle = lpProcessInformation->hProcess;
//Дальше вы можете делать с этим что угодно, просто чтобы игра, или нужный вам процесс, продолжил загрузку
//после, нужно разморозить поток приложения, это сделать очено просто
//просто разкоментируйте код ниже:
/*
ResumeThread(lpProcessInformation->hThread);
*/
//Записочка: лучше не закрывайте хендлы из хука, ведь конечное приложение, которое вызовет эту функцию
//расчитывает их получить и закрыть сомостоятельно, а лишний раз выдавать себя, не стоит.
return hReturn;
}
void Install() {
//Получаем кернель
HMODULE hKernel = GetModuleHandleA("kernel32.dll");
if (hKernel) {
//Дергаем синглтон
auto& pContext = cContext::GetInstance();
//получаем адресс функции в модуле
auto dwAdress_CreateProcessW = GetProcAddress(hKernel, "CreateProcessW");
//ставим наш хук
pContext.ApplyDetour<_CreateProcessW>(
reinterpret_cast<_CreateProcessW>(dwAdress_CreateProcessW),
reinterpret_cast<_CreateProcessW>(my_CreateProcessW),
&t_CreateProcessW);
}
}
Ну и точка входа:
Код:
#include "Base.h"
BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved) {
if (dwReason == DLL_PROCESS_ATTACH) {
//Ставим хук
Install();
return 1;
}
if (dwReason == DLL_PROCESS_DETACH) {
//снимаем хук на выходе.
if (t_CreateProcessW)
t_CreateProcessW->Remove();
}
return 1;
}
Как видно, все предельно просто. Стоит лишь сказать, что это сработает не везде. На пример так можно заставить стим, заинжектить ваш чит при запуске кс го, но это не поможет выиграть в лотерею с тем же растом, там надо чуть чуть больше усилий.