Перейти к содержанию

Урок 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>

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

Адрес не статический, по уроку в 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>

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

×
×
  • Создать...

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

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