Fehler beim Auslesen einer Speicheradresse eines anderen Programms



  • Hallo zusammen,

    und zwar versuche ich momentan den Wert einer Speicheradresse aus einem anderen Programm auszulesen.
    Bei Programmen wie Paint oder Minesweeper klappt das wunderbar.
    Bei dem jetzigem Programm funktioniert das leider nicht.
    Ich habe dann etwas über Accesstoken gefunden und es damit versucht. Klappt leider im moment auch nicht.

    Mit dem unten stehenden Code gibt er mir folgendes aus: "AdjustTokenPrivileges Fehler: 6". Mit 6 wird soweit ich weis ein ungültiges Handle bezeichnet.

    Ich hoffe ihr könnt mir helfen. Vielen Dank für eure Mühen.

    LG
    aimheld

    #include <iostream>
    #include <windows.h>
    using namespace std;
    
    BOOL EnablePrivilege(HANDLE, LPCTSTR);
    
    int main(){
    
        HWND hWnd       = FindWindow(0,TEXT("Warcraft III"));                  
    
        DWORD processId;
        GetWindowThreadProcessId(hWnd,&processId);                             
    
        HANDLE hProcess = OpenProcess(READ_CONTROL, false, processId);         
    
        HANDLE hToken;
        OpenProcessToken(hWnd, TOKEN_ADJUST_PRIVILEGES, &hToken);
        EnablePrivilege(hToken, SE_DEBUG_NAME);
    
        !hWnd      ? cout << "Programm finden:      Fehler: " << GetLastError() << endl           : cout << "Programm finden:      OK"   << endl;
        !hProcess  ? cout << "Prozess oeffnen:      Fehler: " << GetLastError() << endl           : cout << "Prozess oeffnen:      OK"   << endl;
        !processId ? cout << "Prozess-ID erstellen: Fehler: " << GetLastError() << endl << endl   : cout << "Prozess-ID erstellen: OK"   << endl << endl;
    
        char Value[255];    for(int j = 0;  j != (sizeof(Value) - 1);  ++j) Value[j] = 0; // Array mit 0en füllen
    
        ReadProcessMemory(hProcess, (LPVOID) 0x5151C50, &Value, sizeof(Value), 0);
    
        for(int j = 0;  j != (sizeof(Value) - 1);  ++j)
            cout << Value[j];
    
        CloseHandle(hProcess);
        CloseHandle(hToken);
        return 0;
    }
    
    // Diese Funktion habe ich aus MSDN genommen und ein bisschen verändert
    // http://msdn.microsoft.com/en-us/library/aa446619%28VS.85%29.aspx
    
    BOOL EnablePrivilege(
        HANDLE hToken,          // access token handle
        LPCTSTR lpszPrivilege   // name of privilege to enable/disable
        )
    {
    	TOKEN_PRIVILEGES tp;
    	LUID luid;
    
    	tp.PrivilegeCount = 1;
    	tp.Privileges[0].Luid = luid;
    	tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    	!LookupPrivilegeValue(NULL, lpszPrivilege, &luid )   ?   cout << "LookupPrivilegeValue  Fehler: " << GetLastError() << endl   :   cout << "LookupPrivilegeValue  OK" << endl;
    	!AdjustTokenPrivileges(hToken, FALSE, &tp, 0,0,0)    ?   cout << "AdjustTokenPrivileges Fehler: " << GetLastError() << endl   :   cout << "AdjustTokenPrivileges OK" << endl;
    
        CloseHandle(hToken);
    	return TRUE;
    }
    


  • Moderne Software ist geschützt, da kannste das knicken.



  • Danke, aber als Beispiel CheatEngine schafft es doch auch, den Wert aus dem Speicher zu holen.



  • Vielleicht würde eine anständige Fehlerbehandlung etwas nützen?

    OpenProcessToken() liefert nicht umsonst einen BOOL, um Fehler anzuzeigen. Den ignorierst du aber. Deine Verwendung von GetLastError() in main() ist jedenfalls nicht korrekt, soweit ich das sehe. Und theoretisch könnte auch schon FindWindow() fehlgeschlagen sein, ohne dass du das merkst.

    Stefan.



  • Hi und danke für deine Antwort.
    Dass ich GetLastError() falsch ausführe wusste ich nicht.

    Wenn ich OpenProcessToken überprüfe, erhalte ich 0 und GetLastError() gibt 6 zurück.

    HANDLE hToken;
    if(! OpenProcessToken(hWnd, TOKEN_ADJUST_PRIVILEGES, &hToken))
        cout << GetLastError() << endl;
    


  • Sorry für Doppelpost ! Möchte kurz etwas nachtragen.

    Habe jetzt die Rückgabewerte von FindWindow, GetWindowThreadProcessId und OpenProcess getestet. FindWindow gibt 1 , GetWindowThreadProcessId 848 und OpenProcess 0x3c zurück. Müsste doch in Ordnung sein denke ich.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten