Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

Хелп с мемори ридером плз!!!!

Пользователь
Пользователь
Статус
Оффлайн
Регистрация
24 Июл 2018
Сообщения
721
Реакции
78
Мемори ридер не работает правильно
в консоли выводит -
dwSize: 0
dsBase: 0
C++:
Expand Collapse Copy
#include <iostream>
#include "Memory.h"
using namespace std;
memory mem;
PModule bClient;
int main()
{
    while (!mem.Attach("csgo.exe", PROCESS_ALL_ACCESS)) {}
    bClient = mem.GetModule("client.dll");

    cout << "dwBase: " << bClient.dwBase << endl;
    cout << "dwSize: " << bClient.dwSize << endl;

    mem.Exit();
    system("pause");

    return 0;
}
C++:
Expand Collapse Copy
#pragma once
#include <Windows.h>
#include <TlHelp32.h>
#include <comdef.h>

struct PModule
{
    DWORD dwBase;
    DWORD dwSize;
};

class memory
{
public:
    inline bool Attach(const char* pName, DWORD dwAccess)
    {
        HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

        PROCESSENTRY32 entry;
        entry.dwSize = sizeof(entry);

        do
            if (!strcmp(_bstr_t(entry.szExeFile), pName))
            {
                _pId = entry.th32ProcessID;
                CloseHandle(handle);
                _process = OpenProcess(dwAccess, false, _pId);
                return true;
            }
        while (Process32Next(handle, &entry));
        return false;
    }

    inline PModule GetModule(const char* pModule)
    {
        HANDLE module = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, _pId);
        MODULEENTRY32 entry;
        entry.dwSize = sizeof(entry);

        do
            if (!strcmp(_bstr_t(entry.szModule), pModule))
            {
                CloseHandle(module);
                return PModule{ reinterpret_cast<DWORD>(entry.hModule), entry.modBaseSize };
            }
        while (Module32Next(module, &entry));

        return PModule{ 0, 0 };
    }
    template <class T>
    T Read(const DWORD dwAddress)
    {
        T _read;
        ReadProcessMemory(_process, LPVOID(dwAddress), &_read, sizeof(T), NULL);
        return _read;
    }

    template <class T>
    void Write(const DWORD dwAdress, const T value)
    {
        WriteProcessMemory(_process, LPVOID(dwAdress), &value, sizeof(T), NULL);
    }

    void Exit()
    {
        CloseHandle(_process);
    }
private:
    HANDLE _process;
    DWORD _pId;
};
 
Проблема по-видимому в том, что не находится модуль игры, но вообще тут много проблем...
1. используй регистронезависмые сравнения, чтобы наверняка stricmp.
2. после CreateToolhelp32Snapshot с TH32CS_SNAPMODULE ты не вызываешь Module32First, возможно проблема в этом, хотя при итерации процессов у тебя тоже нет этого, но у тебя как то это прокатывает
3. ты не проверяешь возвращаемое значение из CreateToolhelp32Snapshot на INVALID_HANDLE_VALUE, и вообще нигде не проверяешь, например если в Read в ReadProcessMemory ошибка, то _read не инициализирована и будет давать рандомные значения из стека, гудлак такое дебажить
4. ты закрываешь хэндл от CreateToolhelp32Snapshot только если модуль/процесс найден, нужно в любом случае
5. в Exit ты закрываешь хэндл процесса, а вдруг он не был вообще открыт, плюс не инициализируешь значения в конструкторе вообще
6. используешь DWORD для адресов, на X64 будет шляпа, раз уж пишешь сам то сразу делай портабельно
7. добавь задержку при ожидании процесса, у тебя тупо процесс жжет цпу пока ждет его, проверяя каждую итерацию
 
Назад
Сверху Снизу