Von anderem Programm Variable ändern

Hallo!

Ich habe ein kleines Programm geschrieben, dass von einem anderen Programm einen Wert ändert:

Code:
int main(void)
{
    HWND hWnd;
    HANDLE hproc;
    DWORD procid;
    DWORD rw = 0;

    unsigned adress = 0x00409040;
    int buffer = 0;

    hWnd = FindWindow(0,"Opfer");
    if(!hWnd)
        return 0;

    GetWindowThreadProcessId(hWnd, &procid);

    hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);

    if(ReadProcessMemory(hproc,(LPCVOID)adress,&buffer,
                    sizeof(buffer),&rw))
    {
        cout << "Lesen erfolgreich\n";
        cout << buffer << endl;
    }
    buffer++;

    if(WriteProcessMemory(hproc,(LPVOID)adress,&buffer,
                    sizeof(buffer),&rw))
    {
        cout << "Schreiben erfolgreich\n";
    }

    CloseHandle(hproc);//<-- Wichtig!
    return 0;
}


Nur das gefällt mir nicht:
unsigned adress = 0x00409040;
weil an jedem computer die adresse wo anders ist...

kann mir jemand eine funktion machen (in c++) mit dem man einen wert finden kann?
z.b. 100 (punkte)

und noch was:
hWnd = FindWindow(0,"Opfer");

Wie soll sowas funktionieren mit einem Spiel, was im Titel die Zeit anzeigt?
Da der Titel sich bei jeder Seite ändert...

Danke schon mal im Voraus
 
Dein "Problem" lautet DMA dynamic memory allocation.

Und zwar alloiziert der Prozess den Speicher während der Laufzeit wenn er Ihn braucht.
In Spielen wo es immer an der selben Adresse ist heißt es SMA (Static Memory Allocation).

Jedenfalls lässt sich das ganz einfach "umgehen". Die Funktionen die auf die dynamisch alloizierten Variablen zugreifen stehen immernoch an der selben adressen, so kannst du zB die Funktion kaput machen (NOPen) die das Geld oder die Lebensenergie runterzählt.

oder du machst von da aus einen Jmp zu einen CodeCave (freier Speicher im Prozess) da legst du eigenen Code hin der zB die Lebensenergie/Munnition immer auf einen hohen Wert setzt. nach deinem eigenem Code im Codecave kommt dann der Code den du für den Jump vernichtet hast. also den musst du widerherstellen. danach springst du wieder zurück wo du hergekommen bist (an die Adresse der Instruktion eins unter dem Jmp)

Das ganze nennt sich dann "Code Injection", kannst dir ja mal diese Tutorials dazu durchlesen:

http://www.gghz.eu/downloads.php?view=detail&df_id=218
http://www.gghz.eu/downloads.php?view=detail&df_id=124

Und zu dem Problem mit dem Fensternamen, das hatte ich damals auch, aber naja man kann die Prozesse auch anhand ihres Namens öffnen (kA Tombraider.exe zB)

dafür nutze ich folgende Funktion:

EDIT: Wenn du mehrere Prozesse mit dem selben Namen hast, nimmt er immer den ersten den er findet, von daher keine perfekte Lösung!

Code:
unsigned long getpid(char* procname) {
    HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    PROCESSENTRY32 procinfo = { sizeof(PROCESSENTRY32) };
    while(Process32Next(handle, &procinfo)) {
        if(!strcmp(procinfo.szExeFile, procname)) {
            CloseHandle(handle);
            return procinfo.th32ProcessID;
        }
    }
    CloseHandle(handle);
    return 0;
}
Viel Spaß beim lernen!

MfG zaibl
 
Zurück
Oben