Speicher Freezen ? la cheat engine

Hi,

ich wollte mal fragen wie die cheat engine eigentlich speicher freezt ( ich weiß sie is open source aber ich find mich in dem delphi gewirr net zurecht ^^ )

ich habs mal so probiert mit virtualqueryex den zugriff zu limitieren von pagereadwrite auf pageread etc. jedoch sind die programme da etwas anfällig und stürzen ab ^^
 
Ich habe es mal in C++ unter Windows gemacht (kurz freezen und wieder weiterlaufen lassen, um Prozesse abzubremsen), möglich war das aber nur über undokumentierte Windows-Funktionen: http://keksa.de/?q=proslo
 
hmm nein so war das nicht gemeint, ich will einen speicherbereich von lediglich ein paar bytes vor veränderung "schützen" ohne das darauf zugreifende programm zu killen/verlangsamen etc.
 
Meinst du etwa so etwas?
Das Programm ließt den Wert einer Adresse im Speicher ein und überschreibt in daraufhin ständig, um ihn vor Veränderung zu schützen.
Code:
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#define EXCEPTION 1
using namespace std;

char *winName = "Beispielfenster";
HANDLE handle = NULL;

void Open()
{
    HWND hwnd;
    DWORD pid, byte;

    while (1) {
        try {
            hwnd = FindWindow(0, winName);
            if (hwnd == 0) {
                cout << "Programmfenster nicht gefunden!" << endl;
                throw EXCEPTION;
            }

            GetWindowThreadProcessId(hwnd, (unsigned long *)&pid);

            handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
            if (handle == 0) {
                cout << "Prozess konnte nicht geoeffnet werden!" << endl;
                throw EXCEPTION;
            }
            break;
        } catch (int i) {
        Sleep(1000);
        }
    }
}

DWORD Read(DWORD address)
{
    DWORD byte;
    if (!ReadProcessMemory(handle, (void *)address, &byte, 4, NULL)) {
        cout << "Lesevorgang fehlgeschlagen!" << endl;
        throw EXCEPTION;
    }

    return byte;
}

void Write(DWORD address, DWORD value)
{
    if (!WriteProcessMemory(handle, (void *)address, &value, 4, NULL)) {
        cout << "Schreibvorgang fehlgeschlagen!" << endl;
        throw EXCEPTION;
    }
}

int main()
{
    Open();
    long wert = Read(0x295BBB4);

    while (1) {
        try {
            Write(0x295BBB4, wert);
            Sleep(100);
        } catch (int i) {
        Open();
        }
    }
}

Edit: der erweiterte Editor, hat das Layout zerstört :P
 
@HKA: Der Code kommt mir bekannt vor ;)

Cheat Engine macht das mit dem Freezen genau so, wie oben in dem Code demonstriert, indem es immer wieder die Speicherstelle überschreibt, unabhängig davon, ob sie sich geändert hat, oder nicht.

Dieses Verfahren ist einfach das einfachste, und heutige Computer bremst es nicht spürbar aus, 50x pro Sekunde die WriteProcessMemory-Funktion aufzurufen.

Alternativ könntest du dir natürlich einen Debugger schreiben, der wirklich verhindert, dass sich die Speicherstelle ändert (vermutlich recht kompliziert), oder du patchst einfach sämtliche Befehle weg, die an die Adresse schreiben.
 
hm, mal eine Frage die etwas Off-Topic ist:
Der Speicherbereich von Programm A ist doch gegen Veränderungen von Programm B geschützt, oder?
Aber Sekunde, ich seh gerade dass hier ja nicht mit Pointern sondern mit API gearbeitet wird - ist das soweit richtig?

Darf unter Windows jeder Prozess jedem anderen im Speicher rumeditieren oder muss man dazu root sein?
 
über die Windows-Api ist das Schreiben in Prozesse, die unter der gleichen Benutzerkennung laufen, prinzipiell möglich. Als Admin darf man sogar in die Prozesse von anderen Benutzern schreiben, mit Ausnahme von speziell geschützten, wie den Prozessen des Benutzers SYSTEM.

Direkt kann man allerdings nicht mehr in andere Prozesse schreiben, wie das bei frühen Windows-Systemen der Fall war.
 
Zurück
Oben