Pamięć innego procesu

0

Witam to mój pierwszy post na tym forum i proszę o wyrozumiałość. Mam następujący problem. Zacząłem się bawić pamięcią innych procesów za pomocą funkcji z WinApi. Na Początek napisałem programik, który ma za zadanie zczytać ilość punktów z Windows'owej gierki Pinball. Programem Cheat Engine znalazłem miejsce w pamięci gdzie są punkty, lecz na innym komputerze jest to w innym miejscu, jak więc mam ujednolicić swój program, aby działał na innych komputerach niż mój.

Oto kod programu:

#include <iostream>
#include <windows.h>
using namespace std;
 
HWND hwnd;
DWORD dword;
HANDLE handle;

int main()
{
    SetConsoleTitle("Ginghaku - Pinball odczytywanie punktow");
    hwnd = FindWindow(NULL, "3D Pinball dla Windows - Space Cadet");
    GetWindowThreadProcessId(hwnd, &dword);
    handle = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dword);
    if(hwnd != NULL && handle)
    {
        int value;
        DWORD adres = 0x0C5AEBA;
        ReadProcessMemory(handle, reinterpret_cast<void*>(adres), &value, 4, 0);
        cout << "Liczba punktow: " << value << endl;
    }
    else
    {
        cout << "Nie mozna znalesc okna gry!";
        return 0;
    }
    getchar();
    return 0;
}

Z góry thx za pomoc

0

zle zle zle

zeby odczytac pamiec innego procesu musisz:

  • zablokowac zapis pod ten adres, czyli zamrozic caly proces
  • upewnic sie ze w momencie czytania pod tym adresem jest wlasnie to co chcesz odczytac - tego sie nie da zrobic
  • odczytac wartosc
  • odblokowac proces

Write/ReadProcessMemory sa TYLKO do debugowania, nie mozesz polegac na tym co odczytaja, nie mozesz tych danych wiazac z logicznym kontextem programu! to tylko dane ktore nic nie znacza, nie masz mozliwosci sprawdzenia czy to rzeczywiscie wynik czy kawalek stosu!

if(hwnd != NULL && handle)
po co sprawdzasz hwnd?

i uzywaj funkcji UNICODE (FindWindowW, wszsytkie *W nie *A). Funkcje ANSI zakladaja ze wyzszy bajt = 0 i to prowadzi do problemow. uwiez mi to dobry nawyk. string utf 16 (bo z tego kozysta windows) deklarujesz L"asd4353"

DWORD adres = 0x0C5AEBA;
po co ta zmienna? i lepiej je deklarowac przed kodem - latwiej czytac pozniej.

    cout << "Nie mozna znalesc okna gry!";

raczej nie mozna uzyskac handla do procesu, daj to po
hwnd = FindWindow(NULL, "3D Pinball dla Windows - Space Cadet");

getchar();
po co to, programy konsolowe dzialaja i musza zakonczyc dzialanie. taki standard, getchar bedzie wusuec na stdin i okno zostanie...

0

Na podstawie tego co wygooglowałem zrobiłem ten program, więc jeśli mógłbyś mi dać jakiś przykładowy kod pokazujący pobieranie informacji z innego procesu lub jakieś linki PL - a getchar użyłem tylko dlatego że wygodniej mi jest to testować (kompilator nie kończy mi od razu działania programu).

0

Więc nikt nie umie mi pomóc ? Cóż trudno nie pogrzebie sobie w procesach...

0

http://lmgtfy.com/?q=other+process+memory

Uwaga. Myla Ci sie aplikacje strumieniowe i konsolowe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1