ReadProcessMemory - Problem



  • Hi ! 😉
    Da es kein Unterforum für C++-Nichtkönner gibt, poste ich mal hier, hat ja etwas mit einer WinAPI-Funktion zu tun.

    Also, ich wollte mal versuchen die Y-Koordinate des Spielercharakters in WoW auszulesen. Dafür habe ich 4 Stellen im Speicher gefunden, die ganz klar den aktuellen Punkt als Float-Variable zeigen.

    Das sieht mit einem Hilfsprogramm so aus (korrekt wie es sein soll):

    http://i39.tinypic.com/10fat51.jpg

    Diesen Wert wollte ich jetzt per C++-Funktion zur Verarbeitung auslesen. Habe mir erstmal zum Test ein Dummy-Programm gemacht und es funktioniert einfach nicht, der einzige Output ist:

    19065760: 7.80083e+033

    Bitte grobe C++-Fehler/Holzfällerstil entschuldigen, 7 Monate lang C++ nicht angefasst. :>

    Hier ist das Programm, was habe ich falsch gemacht ?

    #include <iostream>
    #include <windows.h>
    using namespace std;
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
        unsigned offset = 0x122EBA0;
    
        HWND wow_window;
        DWORD wow_process_id;
        DWORD number_of_read_bytes = 0;
        HANDLE wow_process_handle;
    
        float received_bytes ;
    
        wow_window = FindWindow(NULL, "World of Warcraft");
    
        if(!wow_window)
        {
                       cout << "\nCouldn't find window \n";
                       return -1;
        }
    
        GetWindowThreadProcessId(wow_window, &wow_process_id);
    
        wow_process_handle = OpenProcess(PROCESS_ALL_ACCESS, false, wow_process_id);
    
        while(true)
        {
                           ReadProcessMemory(wow_process_handle, (LPCVOID)offset, &received_bytes, sizeof(received_bytes), &number_of_read_bytes);
                           cout << "\n" << offset << ": " << received_bytes;
                           Sleep(2000);
        }
    
        return 0;
    }
    

    Danke schon mal !

    Grüße,
    Flo



  • Du brauchst die Prozess-ID und nicht eine Thread-ID...



  • Halbwissen schrieb:

    Du brauchst die Prozess-ID und nicht eine Thread-ID...

    Hmm, bei Testprogrammen die ich selber gemacht habe hat es mit dem oben von mir geposteten Code tadellos geklappt den Wert von Variablen zu lesen.

    Deswegen würde es mich wundern warum es jetzt anders sein sollte.

    Aber ich kann es gerne anders probieren.

    Welche Funktion würdest du mir vorschlagen?

    Grüße,
    Flo



  • kA, vielleicht hängt es mit den Thread-Basisadressen zusammen. Dein Programm hat wohl nur den Hauptthread gehabt, aber kA.

    Versuch's mal damit:

    unsigned long GetProcessIdByName(const std::string& name)
    {
    	void* snapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	PROCESSENTRY32 processEntry = { sizeof(PROCESSENTRY32) };
    
    	if(Process32First(snapshotHandle, &processEntry))
    	{
    		do
    		{
    			std::string tempName = processEntry.szExeFile;
    			std::transform(tempName.begin(), tempName.end(), tempName.begin(), tolower);
    
    			if(tempName == name)
    			{
    				CloseHandle(snapshotHandle);
    				return processEntry.th32ProcessID;
    			}
    		}
    		while(Process32Next(snapshotHandle, &processEntry));
    	}
    
    	return 0;
    }
    


  • Blöd von mir.
    Hab nicht bedacht dass WoW als Systemprogramm läuft. Hab eben mit dem Tool permedit mein Programm auch als Systemprogramm laufen lassen und voila - es klappt. 🙂

    Kann geclosed/gelöscht werden.



  • Oh, GetWindowThreadProcessId 😮 ich Depp...



  • Halbwissen schrieb:

    Oh, GetWindowThreadProcessId 😮 ich Depp...

    Hehe.
    Das mit dem extra zum Systemprozess ändern mit Permedit ist echt lästig.

    Wie kann man ein Programm dauerhaft als Systemprogramm definieren ?

    Grüße,
    Flo.



  • Was meinst du genau 😕



  • Halbwissen schrieb:

    Was meinst du genau 😕

    Der Grund, warum davor nichts ging.
    WoW.exe läuft als Systemprozess und lässt sich deswegen nicht den Speicher lesen. Mit dem Tool "permedit" habe ich meinem Programm diese Rechte gegeben und es hat geklappt.
    Deswegen habe ich gefragt, wie man ein Programm unter Windows standardmäßig als Systemprozess benutzen kann.



  • Such mal hier im WinAPI-Forum nach "SE_DEBUG_PRIVILEGE" und wie man es seinem Programm verpassen kann.



  • Irgendwie so zB

    void* tokenHandle;
    	OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tokenHandle);
    	TOKEN_PRIVILEGES privilegeToken;
    	LookupPrivilegeValue(0, SE_DEBUG_NAME, &privilegeToken.Privileges[0].Luid);
    	privilegeToken.PrivilegeCount = 1;
    	privilegeToken.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    	AdjustTokenPrivileges(tokenHandle, 0, &privilegeToken, sizeof(TOKEN_PRIVILEGES), 0, 0);
    	CloseHandle(tokenHandle);
    


  • Super, danke Halbwissen.
    Klappt so genau wie ich es haben will 😉

    Grüße,
    Flo


Anmelden zum Antworten