Problem mit ReadProcessMemory



  • hallo, bei der Funktion ReadProcessMemory kann man ja nach allen typen suchen int float double usw.
    Bei meinem Programm kann man den Typ in der Console eingeben. Mein Problem ist jetzt das ist nicht 100 mal int buffer, float buffer, double buffer und für jeden Typ die selbe Funktion erstellen will. Kann ich da nicht einen void zeiger übergeben und dann diesen wieder einer int variable zuweißen oder muss ich jeden typ abfragen und die Funktion in jedem if("int") neu machen?



  • ReadProcessMemory hat nichts mit dem Typ zu tun. ReadProcessMemoryReadProcessMemory kriegt schon einen void* (bzw. PVOID in Microsoft-Sprech), also genau das, was Du willst.



  • aber ich kann ja diesen Typ nicht z.b. einer int variable zuweißen oder ausgeben? Also void*



  • casten?



  • ich habe noch ein anderes Problem:
    mein Code sieht so aus:

    unsigned Address = 0x00000000
    while(Address <= 0xFFFFFFFF)
    {
    ReadProcessMemory(handleProc, (LPCVOID)fromAddress , &buff, sizeof(buff), 0);
    
    ++Address;
    }
    

    Warum dauert es so ewig lange, bis der Speicher durchsucht wird? Das wundert mich sehr, ich kenne Programme die durchsuchen von 00000000 zu FFFFFFFF in 20 Sekunden. Ich habe für buff schon void*, int usw probiert. Es ist immer so langsam.



  • VirtualQueryEx usw.


  • Mod

    Markus20 schrieb:

    ich habe noch ein anderes Problem:
    mein Code sieht so aus:

    unsigned Address = 0x00000000
    while(Address <= 0xFFFFFFFF)
    {
    ReadProcessMemory(handleProc, (LPCVOID)fromAddress , &buff, sizeof(buff), 0);
    
    ++Address;
    }
    

    Warum dauert es so ewig lange, bis der Speicher durchsucht wird? Das wundert mich sehr, ich kenne Programme die durchsuchen von 00000000 zu FFFFFFFF in 20 Sekunden. Ich habe für buff schon void*, int usw probiert. Es ist immer so langsam.

    1. Warum machst Du es Byteweise?
    2. Warum prüfst Du nicht vorher auf die Boundaries mit VirtualQueryEx wie es Melan schreibt?



  • das heißt ich kann gleich +8 machen wenn ich nach einem char suche? aber nicht dass z.b. Address grade bei 50 ist und der char ist bei 55 dann mache ich +8 = 58 und überspringe den char.
    Und wegen VirtualQueryEx... ich dachte da erhält man die baseaddress aber welche addresse muss man dann der Funktion übergeben?



  • MSDN lesen, dann fragen.



  • ich habe sie bereits gelesen du vollhorst
    A pointer to the base address of the region of pages to be queried
    toll ich will die base address aber erhalten


  • Mod

    Markus20 schrieb:

    ich habe sie bereits gelesen du vollhorst

    Du hast nichts gelesen.
    http://msdn.microsoft.com/en-us/library/aa366907(VS.85).aspx

    MSDN schrieb:

    lpAddress [in, optional]
    A pointer to the base address of the region of pages to be queried. This value is rounded down to the next page boundary. To determine the size of a page on the host computer, use the GetSystemInfo function.

    Also verwende GetSystemInfo und springe pageweise!



  • *hängt dem TE Bleichgewichte an die Füße* Immer schön auf dem Teppich bleiben!

    Wenn jemand schreibt du sollst nochmal lesen, dann wirst du wohl etwas übersehen haben ...

    Also lesen wir nochmal:

    Da steht:

    lpAddress [in, optional]
    
        A pointer to the base address of the region of pages to be queried. This value is rounded down to the next page boundary. To determine the size of a page on the host computer, use the GetSystemInfo function.
    

    Jetzt darfst du mal raten was 'optional' heißt.

    Dann lesen wir weiter und sehen:

    lpBuffer [out]
    
        A pointer to a MEMORY_BASIC_INFORMATION structure in which information about the specified page range is returned.
    

    Aha, wir bekommen also Informationen über die Struktur. Was sagt denn die MSDN zum Aufbau:

    BaseAddress
    
        A pointer to the base address of the region of pages.
    
    RegionSize
    
        The size of the region beginning at the base address in which all pages have identical attributes, in bytes.
    

    Wenn du es jetzt nicht verstanden hast kann dir hier wohl keiner mehr helfen.



  • ok, thx, ich rufe also GetSystemInfo auf in dieser ist DWORD dwPageSize;.
    ich verstehe nicht ganz was page(seite) mit dem Speicher zu tun hat aber mal sehen. Noch eine andere Frage: Warum muss man in so Programmen die den Speicher durchsuchen immer die Rage(Welche Addressen durchsucht werden) angeben, wenn man mit VirtualQueryEx den Addressraum des Prozesses bekommt? Sorry falls euch die Fragen irgendwie noobig erscheinen, aber ich kenne mich da noch nicht so gut aus.



  • Erst selbstständig recherchieren und dann fragen.

    http://de.wikipedia.org/wiki/Speicherseite 👎



  • Markus20 schrieb:

    ok, thx, ich rufe also GetSystemInfo auf in dieser ist DWORD dwPageSize;.
    ich verstehe nicht ganz was page(seite) mit dem Speicher zu tun hat aber mal sehen. Noch eine andere Frage: Warum muss man in so Programmen die den Speicher durchsuchen immer die Rage(Welche Addressen durchsucht werden) angeben, wenn man mit VirtualQueryEx den Addressraum des Prozesses bekommt? Sorry falls euch die Fragen irgendwie noobig erscheinen, aber ich kenne mich da noch nicht so gut aus.

    Warum, warum, warum...
    Warum ist die Welt schlecht? Warum haben Fische keine Haare?

    Ich würde aber mal tippen: man muss garnix, man *kann*, wenn man möchte.



  • so, ich habe jetzt mal angefangen.
    Nur leider unterscheidet sich mein Programm total von anderen "Searchern":
    siehe Bild: http://img84.imageshack.us/img84/5029/unbenannteh0.png
    das linke ist von anderen (die geben alle dass aus) und das rechte mein Test.
    Man erkennt dass paar Addressen stimmen aber dann ändert es sich total ab. (00 davordenken). Ich frage mich jetzt schon seit Tagen woher das kommt aber ich komme zu keiner Lösung. Hier mal mein Code:

    void Search(int value)
    {
        MEMORY_BASIC_INFORMATION mbi;
        unsigned int start, end;
        do
        {
            VirtualQueryEx(Process, (void*)fromAddress, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
    	    if((mbi.State == MEM_COMMIT) && (mbi.Protect == PAGE_READWRITE) && (mbi.Type == MEM_PRIVATE))
            {
                start = (unsigned)mbi.BaseAddress;
                end = (unsigned)mbi.BaseAddress+mbi.RegionSize;
    			ScanMem(start, end, value);
    			SendMessage(GetDlgItem(FindWindow(0, TEXT("Searching")), IDC_PROGRESS1),  PBM_DELTAPOS, 1, 0);
            }
    
            fromAddress += mbi.RegionSize;
        } while(fromAddress < toAddress);
    } 
    
    void ScanMem(DWORD start, DWORD end, int value)
    {
        DWORD read = 0;
        int buffer = 0;
    	TCHAR foundet[200];
    
        for(start; start<end; start++)
        {
            ReadProcessMemory(hackProcess, (void*)start, &buffer, sizeof(int), &read);
            if(buffer == value)
            {
    			_stprintf(foundet, TEXT("Addresse: %X Value: %d"), start, value);
    			SendMessage(GetDlgItem(hwndMainDlg, IDC_LIST2), LB_ADDSTRING, 0, (LPARAM)foundet);
    			start++;
            }
        } 
    
    }
    

    Der Code ist denke ich richtig aber ich frage mich woher dann diese unterschiede kommen und nur paar Addressen richtig sind.



  • Der Code sieht ok aus



  • warum braucht mein Programm dann Jahr bis es 00000000 bis FFFFFFFF durchsucht und andere Programme machen das in 10 Sekunden?
    Auch wenn ich address+32 mache ist es langsam



  • Du rufst für jedes einzelne Byte im "hackProcess" ReadProcessMemory auf. 😮

    Probier mal lieber mit ReadProcessMemory einen ganzen Block einzulesen und durchsuche den Block dann nach "value".



  • wie ließt man denn einen Block


Log in to reply