Перейти к содержанию
Авторизация  
mefasm

Урок 3. Получение процесса и чтение памяти

Рекомендуемые сообщения

f469557b3b8c68b23189d9dec2336612.jpg

Написал код по этому уроку, количество патронов выводит не правильно.

Убился нафик, сто раз уже проверил ((

Подскажите что не так!


#include <TlHelp32.h>
#include <gdiplus.h>
#pragma comment (lib, "gdiplus.lib")
using namespace Gdiplus;
#define width 640
#define height 480
WCHAR buffer[32];
VOID OnPaint(HDC hdc)
{
Graphics graphics(hdc);
SolidBrush brush(Color::Red);
FontFamily fontFamily(L"Arial");
Font font(&fontFamily, 24, FontStyleRegular, UnitPixel);
PointF pointF(10.0f, 20.0f);

graphics.DrawString(buffer, -1, &font, pointF, &brush);
}
DWORD GetProceesByName(char* pName)
{
DWORD pID = 0;
HANDLE snapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pInfo;
pInfo.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(snapShot, &pInfo))
{
while(Process32Next(snapShot, &pInfo))
{
if (_stricmp(pName, pInfo.szExeFile) == 0)
{
pID = pInfo.th32ParentProcessID;
CloseHandle(snapShot);
return pID;
}
}
}
CloseHandle(snapShot);
return 0;
}
byte* ReadMemory(DWORD address, DWORD size, DWORD pID)
{
static byte* bytes = new byte[size];
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
ReadProcessMemory(hProcess, (void*)address, bytes, size, NULL);
CloseHandle(hProcess);
return bytes;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX windowClass;
HWND hWnd;
MSG uMsg;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
memset(&windowClass, 0, sizeof(WNDCLASSEX));
windowClass.cbSize = sizeof(WNDCLASSEX);
windowClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
windowClass.hInstance = hInstance;
windowClass.lpfnWndProc = WindowProc;
windowClass.lpszClassName = "Simple Window";
RegisterClassEx(&windowClass);
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
hWnd = CreateWindow(windowClass.lpszClassName, "My First C++ Trainer", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
(GetSystemMetrics(SM_CXSCREEN) - width) / 2, (GetSystemMetrics(SM_CYSCREEN) - height) / 2, width, height, NULL, NULL, NULL, NULL);
ShowWindow(hWnd, nCmdShow);
while (GetMessage(&uMsg, hWnd, NULL, NULL))
{
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
GdiplusShutdown(gdiplusToken);
return uMsg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
switch (uMsg)
{
case WM_CREATE:
CreateWindow("BUTTON", "Click me!", WS_CHILD | WS_VISIBLE, 40, 200, 100, 40, hWnd, (HMENU)1, NULL, NULL);
break;
case WM_COMMAND:
switch (wParam)
{
case 1:
{
DWORD pID = GetProceesByName("farcry.exe");
DWORD ammo = 0;
byte* ammoBytes = ReadMemory(0x1A719184, sizeof(DWORD), pID);
memcpy(&ammo, ammoBytes, sizeof(DWORD));
wsprintfW(buffer, L"Procees ID = 0x%X\nAmmo: %d", pID, ammo);
InvalidateRect(hWnd, NULL, true);
}
break;
}
break;
case WM_CLOSE:
ExitProcess(0);
break;
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
OnPaint(hDC);
EndPaint(hWnd, &ps);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}
#include <Windows.h>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Адрес в функции ReadMemory ты тоже взял из готового кода, или подставил свой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

mefasm

1A719184 статичний адрес патронов?

По ходу нет, из за этого такие значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Адрес не статический, по уроку в Cheat Engine находишь число патронов и подставляешь для демонстрации.

48e138174f6bc8badc14f91577bb8e8c.jpeg

Этот код не готовый, я писал его по уроку. Где-то "очепятка", не могу найти, в уроке то все нормально

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел ошибку, вот правильный код:


#include <TlHelp32.h>
#include <gdiplus.h>
#pragma comment (lib, "gdiplus.lib")
using namespace Gdiplus;
#define width 640
#define height 480
WCHAR buffer[32];
VOID OnPaint(HDC hdc)
{
Graphics graphics(hdc);
SolidBrush brush(Color::Red);
FontFamily fontFamily(L"Arial");
Font font(&fontFamily, 24, FontStyleRegular, UnitPixel);
PointF pointF(10.0f, 20.0f);

graphics.DrawString(buffer, -1, &font, pointF, &brush);
}
DWORD GetProceesByName(char* pName)
{
DWORD pID = 0;
HANDLE snapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pInfo;
pInfo.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(snapShot, &pInfo))
{
while(Process32Next(snapShot, &pInfo))
{
if (_stricmp(pName, pInfo.szExeFile) == 0)
{
pID = pInfo.th32ProcessID;
CloseHandle(snapShot);
return pID;
}
}
}
CloseHandle(snapShot);
return 0;
}
byte* ReadMemory(DWORD address, DWORD size, DWORD pID)
{
static byte* bytes = new byte[size];
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
ReadProcessMemory(hProcess, (void*)address, bytes, size, NULL);
CloseHandle(hProcess);
return bytes;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX windowClass;
HWND hWnd;
MSG uMsg;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
memset(&windowClass, 0, sizeof(WNDCLASSEX));
windowClass.cbSize = sizeof(WNDCLASSEX);
windowClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
windowClass.hInstance = hInstance;
windowClass.lpfnWndProc = WindowProc;
windowClass.lpszClassName = "Simple Window";
RegisterClassEx(&windowClass);
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
hWnd = CreateWindow(windowClass.lpszClassName, "My First C++ Trainer", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
(GetSystemMetrics(SM_CXSCREEN) - width) / 2, (GetSystemMetrics(SM_CYSCREEN) - height) / 2, width, height, NULL, NULL, NULL, NULL);
ShowWindow(hWnd, nCmdShow);
while (GetMessage(&uMsg, hWnd, NULL, NULL))
{
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
GdiplusShutdown(gdiplusToken);
return uMsg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
switch (uMsg)
{
case WM_CREATE:
CreateWindow("BUTTON", "Click me!", WS_CHILD | WS_VISIBLE, 40, 200, 100, 40, hWnd, (HMENU)1, NULL, NULL);
break;
case WM_COMMAND:
switch (wParam)
{
case 1:
{
DWORD pID = GetProceesByName("farcry.exe");
DWORD ammo = 0;
byte* ammoBytes = ReadMemory(0x1B2DF184, sizeof(DWORD), pID);
memcpy(&ammo, ammoBytes, sizeof(DWORD));
wsprintfW(buffer, L"Procees ID = 0x%X\nAmmo: %d", pID, ammo);
InvalidateRect(hWnd, NULL, true);
}
break;
}
break;
case WM_CLOSE:
ExitProcess(0);
break;
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
OnPaint(hDC);
EndPaint(hWnd, &ps);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}
#include <Windows.h>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.