Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Гайд Банихоп чуть посложнее

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
24 Окт 2021
Сообщения
10
Реакции
1
Всем привет дорогие читатели, сегодня я покажу вам как выглядит хук на бхоп в кс2, для начала поскольку я не умею нормально выкладывать посты, я разберу что надо понимать , а потом скину код целиком. Для начала чтобы написать профессональный хук вам надо знать как работают библиотеки psapi.h и minhook.h без этого вы далеко не уедете. Также примечание паттерн скан выполнен максимально просто для лучшего понимания как пробежаться по битам бинарного файла.
Далее вы должны знать хотябы основы ida и classinformer тк на функцию createmove без этих знаний выйти будет очень сложно ведь она сама располагается шестой по счету в классе csgoinput. Ну , вроде все сказал, если есть вопросы по коду спрашивайте, отвечу на все. Вот сам код
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

hook:
Expand Collapse Copy
#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)&current_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;

}
 
Последнее редактирование:
Всем привет дорогие читатели, сегодня я покажу вам как выглядит хук на бхоп в кс2, для начала поскольку я не умею нормально выкладывать посты, я разберу что надо понимать , а потом скину код целиком. Для начала чтобы написать профессональный хук вам надо знать как работают библиотеки psapi.h и minhook.h без этого вы далеко не уедете. Также примечание паттерн скан выполнен максимально просто для лучшего понимания как пробежаться по битам бинарного файла.
Далее вы должны знать хотябы основы ida и classinformer тк на функцию createmove без этих знаний выйти будет очень сложно ведь она сама располагается шестой по счету в классе csgoinput. Ну , вроде все сказал, если есть вопросы по коду спрашивайте, отвечу на все. Вот сам код
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#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)&current_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;
}

1777811940701.png

1777811963762.png
 
Назад
Сверху Снизу