Всем привет дорогие читатели, сегодня я покажу вам как выглядит хук на бхоп в кс2, для начала поскольку я не умею нормально выкладывать посты, я разберу что надо понимать , а потом скину код целиком. Для начала чтобы написать профессональный хук вам надо знать как работают библиотеки psapi.h и minhook.h без этого вы далеко не уедете. Также примечание паттерн скан выполнен максимально просто для лучшего понимания как пробежаться по битам бинарного файла.
Далее вы должны знать хотябы основы ida и classinformer тк на функцию createmove без этих знаний выйти будет очень сложно ведь она сама располагается шестой по счету в классе csgoinput. Ну , вроде все сказал, если есть вопросы по коду спрашивайте, отвечу на все. Вот сам код
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Далее вы должны знать хотябы основы ida и classinformer тк на функцию createmove без этих знаний выйти будет очень сложно ведь она сама располагается шестой по счету в классе csgoinput. Ну , вроде все сказал, если есть вопросы по коду спрашивайте, отвечу на все. Вот сам код
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
hook:
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <Psapi.h>
#include <iostream>
#include "MinHook.h"
uintptr_t client = 0;
namespace offsets {
constexpr uintptr_t dwLocalPlayerPawn = 0x20546A0;
constexpr uintptr_t m_fFlags = 0x3F8;
}
void CreateConsole() {
AllocConsole();
FILE* f;
freopen_s(&f, "CONOUT$", "w", stdout);
}
//создаем typedef функции
using CreateMoveFn = __int64(__fastcall*)(void* a1, void* a2);
CreateMoveFn oMove = nullptr;
__int64 __fastcall hkMove(void* a1, void* a2) {
if (client == 0) {
printf("\nclient is 0");
return oMove(a1, a2);
}
uintptr_t localplayer = *(uintptr_t*)(client + offsets::dwLocalPlayerPawn);
if (localplayer != 0) {
uint64_t* pButtonSubTick = (uint64_t*)((uintptr_t)a2 + 0x68);
uint64_t* pButtons = (uint64_t*)((uintptr_t)a2 + 0x60);
int OnGorund = *(int*)(localplayer + offsets::m_fFlags);
if (*pButtons & (1 << 1)) {
if (!(OnGorund & (1 << 0))){
*pButtons &= ~(1 << 1);
*pButtonSubTick &= ~(1 << 1);
*pButtons &= ~(1 << 3);
}
}
}
return oMove(a1,a2);
}
DWORD WINAPI MainThread(LPCVOID plParam) {
Sleep(500);
CreateConsole();
printf("dll inject");
client = reinterpret_cast<uintptr_t>(GetModuleHandleA("client.dll"));
if (client == 0) {
return 0;
}
printf("\nclient get!");
MODULEINFO mi = { 0 };
uintptr_t found_nachalo_address = 0;
GetModuleInformation(GetCurrentProcess(), (HMODULE)client, &mi, sizeof(mi));
//createmove - 48 89 5C 24 10 48 89 74 24 18 4C 89 74 24 20 55
BYTE* current_byte = (BYTE*)client;
for (uintptr_t i = 0; i < mi.SizeOfImage - 16; i++) {
if (current_byte == 0x48) {
if (current_byte[i + 1] == 0x89 && current_byte[i + 2] == 0x5C && current_byte[i + 3] == 0x24 && current_byte[i + 4] == 0X10) {
if (current_byte[i + 5] == 0x48 && current_byte[i + 6] == 0x89 && current_byte[i + 7] == 0x74 && current_byte[i + 8] == 0x24) {
if (current_byte[i + 9] == 0x18 && current_byte[i + 10] == 0x4C && current_byte[i + 11] == 0x89 && current_byte[i + 12] == 0x74) {
if (current_byte[i + 13] == 0x24 && current_byte[i + 14] == 0x20 && current_byte[i + 15] == 0x55) {
if (current_byte[i + 24] == 0x20 && current_byte[i + 25] == 0x01) {
found_nachalo_address = (uintptr_t)¤t_byte;
break;
}
}
}
}
}
}
}
//НАША ФУНКЦИЯ ИЗ ИДА
uintptr_t func_bhop = (uintptr_t)(client + 0xC46EA0);
if (found_nachalo_address == 0) {
printf("\nfound_nachalo_address: 0");
}
else {
uintptr_t current_offset = found_nachalo_address - client;
// %p выведет полный адрес (0x7FF...), %llX выведет офсет в HEX (C46EA0)
printf("\n[+] Pattern found!");
printf("\n Full Address: %p", (void*)found_nachalo_address);
printf("\n Your Offset: 0x%llX", current_offset);
printf("\n IDA Offset: 0xC46EA0");
}
//minhook
auto a = MH_Initialize();
if (a == MH_OK) {
printf("\nminhook enabled");
MH_CreateHook((LPVOID)found_nachalo_address, &hkMove, reinterpret_cast<LPVOID*>(&oMove));
MH_EnableHook(MH_ALL_HOOKS);
}
while (true) {
if (GetAsyncKeyState(VK_F1) & 1) {
FreeConsole();
MH_DisableHook(MH_ALL_HOOKS);
MH_Uninitialize();
FreeLibraryAndExitThread((HMODULE)plParam, 0);
return TRUE;
}
Sleep(1000);
}
return TRUE;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hModule);
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)MainThread, hModule, 0, 0);
break;
case DLL_PROCESS_DETACH:
MH_DisableHook(MH_ALL_HOOKS);
MH_Uninitialize();
break;
}
return TRUE;
}
Последнее редактирование: