Обход GameGuard

На выходных попросили сделать безоткатку BM3-скиллов, wallhack (хождение сквозь препятствия) и обход защиты от кликеров для официального сервера
cabal.zzima.com, т.к. все текущие версии волхака и все кликеры палились их защитой gameguard и собственно она вышибала клиента из игры после 1 минуты беготни с WH. А кликеры вообще не могут аттачиться к игре. Беспалевный волхак и дамагхак я реализовал,
подробнее тут и
тут - из игры не вышибает. Обход защиты кликеров тоже сделал, за этим в скайп - rfcheats. Параллельно сделал пару бесплатных примочек, которые помогут вам лучше изучить защиту "
nProtect gameguard" и собственно обойти её. Обход (или взлом) gameguard актуален для игр
Карос онлайн,
Кабал онлайн,
Седьмой элемент,
Forsaken World, MU Online и думаю многих других.
Начну с того, что в Windows 7 GameGuard аттачит свой модуль
npggNT.des (Usermode Filtering Library Rev 738) ко всем процессам системы, который в свою очередь хукает ряд функций в целевых программах не давая им видеть процесс игры и аттачиться к ней. В Windows XP это реализовано драйвером и снимается легко тем же самым
RKU unhooker. Тут ничего интересного нет, для обхода в Windows 7/8 я сделал следующие вещи:
- Total DLL Injector 1.4 - новая версия видит в списке задач игровой клиент. То есть позволяет инжектить в игру свои DLL-ки в любой момент, даже после входа в игру.
- nProtect gameguard unhider - до запуска игры вы можете приаттачить эту DLL к любой программе, которой требуется видеть процесс игры. Это может быть Cheat Engine, OllyDbg, ArtMoney, API-шпионы, Proccess Explorer, кликеры и так далее. После загрузки игры, она будет видна нужной вам программе. При этом ваша программа сможет к ней аттачиться.
Всё это для Windows 7.
Теперь о вещах посложнее. Почитав забугорные форумы, я понял, что иностранцы сами до сих пор не научились снимать внутри-игровые хуки GG. О них и поговорим. GameGuard хукает следующий ряд функций:
- SendMessageA
- DispatchMessageW
- SendInput
- PostMessageA
- PostMessageW
- GetPixel
- GetWindowThreadProcessId
- ZwQuerySystemInformation
- CreateProcessInernalW
- ReadProcessMemory
- OpenProcess
- ZwDeviceIoControlFile
- ZwSuspendThread
- ZwTerminateProcess
- VirtualProtect
- WriteProcessMemory
- ReadProcessMemory
И это вероятно даже не всё. При этом, хукаются также функции уровнем ниже (Native API), что весьма напрягает. Целью хуков является не допущение их использования внедрёнными DLL, а также тупо палево подгружаемых читов. Кстати, о палеве. Некоторые функции (например, ReadProcessMemory) отрабатывают, но инфа об этом оседает в логах GG, которые лежат по пути: Cabal\Data\UserData
Для их расшифровки можете
скачать этот файл, поместить в эту же папку и запустить. После чего появится файл
decrypted_dlog.txt, в котором лежит список палевных DLL. Кстати, в нём только названия и среди них оказался drweb32.dll

Так что читы можно скрывать под видом антивирей.
Вернёмся к хукам. Тут начинается самое интересное, GameGuard устанавливает для всех загруженных системных и защитных DLL-ок права доступа PAGE_EXECUTE_WRITECOPY на секцию кода, соответственно не сменив права обратно на PAGE_EXECUTE_READWRITE, при попытке снятия хука ваш процесс потухнет. Соль в том, что при этом игра хукает следующие функции:
- VirtualProtect
- ZwProtectVirtualMemory
- NtProtectVirtualMemory
Таким образом получается замкнутый круг - вы не можете снять хук с VirtualProtect, потому что нет соответствующих прав, которые вы не можете изменить из-за хука VirtualProtect :) Я сварганил вот такой вариант:
Код:
bool UnsetProtection(void* addr) {
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery((void*)addr, &mbi, sizeof( mbi ) );
DWORD ZwProtectVirtualMemoryAddr = (DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwProtectVirtualMemory");
DWORD CurProcHandle = (DWORD)GetCurrentProcess();
if(ZwProtectVirtualMemoryAddr == 0) {
MessageBox(0, "ZwProtectVirtualMemory address not found", "Error", MB_ICONERROR);
return false;
}
_asm
{
mov esi, ZwProtectVirtualMemoryAddr
add esi, 5
push [mbi.Protect]
push 0x40
push mbi.RegionSize
push mbi.BaseAddress
push CurProcHandle
mov eax,4d
call esi
}
return true;
}
Он выполняет затёртую хуком инструкцию, после чего вызывает ZwProtectVirtualMemory+5, тем самым перепрыгивая через хук геймгварда.
Если не хочется ковыряться со снятием защиты с остальных функций, могу предложить вариант попроще, где за вас уже всё сделали.
Итак, готовый способ снятия защиты памяти в играх, защищённых nProtect gameguard.
Total DLL Injector 1.4 - запускаете от админа последнюю версию программы, причём желательно перед запуском игры. Данная версия создаёт пайп: "
\\\\.\\pipe\\RF-Cheats.ru.pipe". Далее подгружаете свою собственную DLL к любой игре с GG (в частности к Cabal) и из неё в выше-указанный пайп записываете структуру в следующем виде:
Код:
typedef struct {
DWORD pid;
DWORD addr;
BOOL isDebug;
} packet;
То есть по сути передаёте в пайп PID процесса и адрес, по которому нужно снять защиту. Ну и "isDebug":
1 - после снятия защиты, Тotal Injector сообщит вам о результате
0 - silent mode
Разумеется всё в бинарном виде, т.е. посылка должна получится 9 байт.
Единственное, хочу отметить, что защита снимается не мгновенно, поэтому когда защита будет снята, в пайп вы получите ответ "OK".
Всё. Причём защита будет снята не только с этого адреса, а во всём промежутке между BaseAddress и BaseAddress+RegionSize. После этого можете снимать хуки GG, ставить свои, в общем делать что угодно. Но обращаю ваше внимание на то, что GG через некоторое время (пару минут) вернёт свои хуки обратно. От этого защититься можно кучей способов, например, воспользоваться их же оружием с VirtualProtect

Хукаете VirtualProtect чем-нибудь типа:
Код:
BOOL WINAPI MyVirtualProtect(LPVOID lpAddress,SIZE_T dwSize,DWORD flNewProtect,PDWORD lpflOldProtect) {
if(dwSize == 31337)
return OrigVirtualProtect(lpAddress,dwSize,flNewProtect,lpflOldProtect);
return TRUE; // :D
}
После чего ставите права 0x80 на секцию кода Kernel32.dll, KernelBase.dll, ntdll.dll
Ну а если серьёзно, то хорошим вариантом было бы патчить код функций-перехватчиков. Тогда и хуки снимать не нужно будет, т.е. без лишнего палева. Кстати, о палеве. Все выше-описанные вещи были реализованы средствами DLL. И ни один из представленных методов не палился GG и не оседал в его логах. Проверено.
Итог: аттачится к игре вы теперь можете и дебаггером, и чем угодно. Аттачить к ней свои DLL тоже можете. Снимать защиту памяти можете, а соответственно снимать/ставить хуки тоже. Карты в руки :) Осталось дело за малым. С такими возможностями
взлом nProtect gameguard становится гораздо более простым и приятным занятием.
Рабочий волхак, безоткатку скиллов для кабала и обход защиты от кликеров в GameGuard распространятся бесплатно не будут, т.к. пофиксят добавив мне геморроя) За ними можете обратиться ко мне в скайп "rfcheats".