Вопрос [C++] Как получить доступ к client.dll?

Начинающий
Статус
Оффлайн
Регистрация
12 Мар 2021
Сообщения
59
Реакции[?]
6
Поинты[?]
2K
Привет! Постараюсь кратко объяснить свою проблему!

Вопрос: Как вообщем сделать чит на CS2?

Лично я это представляю так:
1. Получаем доступ к процессу
2. Коннектимся к client.dll
3. С помощью офссетов которые мы нашли через дебаггер (спи$дили с гитхаба) осуществляем наш чит
Возможно я ошибаюсь, так что поправьте пожалуйста!

У меня вышла ПРОБЛЕМА

Получить доступ к client.dll у меня не выходит. Может я неправильно ввожу его базовый адрес (Использовал System Informer, x64dbg, свой говнокод - не помогло), если это правда так - скиньте пожалуйста рабочий адрес client.dll.

По КД выдаёт: Ошибка чтения памяти: 299
Проще говоря, это:
Пожалуйста, авторизуйтесь для просмотра ссылки.
(Это значит, что возможно, мы не подключились к процессу игры. Но это глупо, ведь иначе выдало бы другую ошибку, а мне после перезапуска игры и изменением PID'а уже её выдавало - значит дело не в процессе. Также, это может значить недостаточные права доступа, что тоже довольно глупо, ибо я тестил всяко как только мог, либо в hProcess какая-то проблема)

Также, хотелось бы найти ссылочку на актуальные офссеты на CS2.

Вообщем, буду благодарен если поможете!
 
ппоршень
Пользователь
Статус
Оффлайн
Регистрация
15 Фев 2020
Сообщения
294
Реакции[?]
46
Поинты[?]
32K
1. Получаем доступ к процессу
опустим тот факт, что ты используешь простой WinAPI для открытия хендлов, записи и чтения в память, за такое тебя забанят.
2. Коннектимся к client.dll

Может я неправильно ввожу его базовый адрес
ну во-первых client.dll это модуль, а архитектура так устроена что их адреса обычно разные при каждом запуске процесса.
найти адрес можно используя эту функцию:

C++:
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>

void *get_module_handle_ex( HANDLE process_handle, const wchar_t *module_name )
{
    auto snap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, GetProcessId( process_handle ) );
    if ( snap != INVALID_HANDLE_VALUE )
    {
        MODULEENTRY32 entry = { };
        entry.dwSize = sizeof( entry );
        if ( Module32First( snap, &entry ) )
        {
            do
            {
                if ( !_wcsicmp( entry.szModule, module_name ) )
                {
                    CloseHandle( snap );
                    return ( void * )( entry.modBaseAddr );
                }
            } while ( Module32Next( snap, &entry ) );
        }
    }

    CloseHandle( snap );
    return nullptr;
}

// example:
HANDLE cs2_handle = OpenProcess( PROCESS_ALL_ACCESS, FALSE, 0x1337 );
if ( cs2_handle == INVALID_HANDLE_VALUE )
{
   // error hadling
}
void *client_dll = get_module_handle_ex( cs2_handle, L"client.dll" );
if ( !client_dll )
{
    // error handling
}
имей ввиду что использовать такое в настоящих читах нельзя, но ты только учишься.
Проще говоря, это:
Пожалуйста, авторизуйтесь для просмотра ссылки.
возможно проблема также в самом открытии хендла, посмотри GetLastError() у OpenProcess
 
Последнее редактирование:
Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,421
Реакции[?]
661
Поинты[?]
20K
C++:
#pragma once


namespace Process
{
    HANDLE Process;
    HWND Handle;

    uintptr_t ID;
    uintptr_t Client, Server;


    uintptr_t GetLibAddres(const char* Name, DWORD ProcessID) {
        HANDLE Shapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, ProcessID);

        if (Shapshot != INVALID_HANDLE_VALUE) {
            MODULEENTRY32 ModuleEntry;
            ModuleEntry.dwSize = sizeof(ModuleEntry);

            if (Module32First(Shapshot, &ModuleEntry)) {
                do {
                    if (!strcmp(ModuleEntry.szModule, Name)) {
                        CloseHandle(Shapshot);
                            return (uintptr_t)ModuleEntry.modBaseAddr;
                    }
                }

                while (Module32Next(Shapshot, &ModuleEntry));
            }
        }

        CloseHandle(Shapshot);
        return 0;
    }


    uintptr_t GetProcessID(const char* ProcessName) {
        HANDLE Shanshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

        PROCESSENTRY32 ProcessInfo = { 0 };
        ProcessInfo.dwSize = sizeof(PROCESSENTRY32);

        while (Process32Next(Shanshot, &ProcessInfo)) {
            if (_stricmp(ProcessName, ProcessInfo.szExeFile) == 0) {
                CloseHandle(Shanshot);
                return ProcessInfo.th32ProcessID;
            }
        }

        CloseHandle(Shanshot);
        return 0;
    }


    void GetProcess(const char* ProcessName, const char* ProcessWindowName) {
        Process::ID = GetProcessID(ProcessName);

        if (Process::ID) {
            Process::Handle = FindWindowA(0, ProcessWindowName);

            Process::Client = GetLibAddres("client.dll", Process::ID);
            Process::Server = GetLibAddres("server.dll", Process::ID);

            Process::Process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Process::ID);
        }

        else {
            MessageBox(0, "Could not find process.", ProcessName, 0);
            exit(0);
        }
    }


    bool WindowIsOpen() {
        return (GetForegroundWindow() == Process::Handle);
    }


    bool KeyStatus(int VirtualKeyboard) {
        return (GetAsyncKeyState(VirtualKeyboard) || VirtualKeyboard == 0) && WindowIsOpen() ? true : false;
    }
}
 
Сверху Снизу