Problem mit ReadProcessMemory
-
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
-
ich habe mal versucht
for(start; start<end; start = start+32)
bei start 32 zu addieren weil int ja 32 bits hat. Aber dann findet er nicht mehr viele Addressen
-
Da Dir der Unterscheid zwischen Bits und Bytes nicht mal klar ist, werde ich mich aus diesem Thread verabschieden...
-
Markus20, versuchs mal mit 4
weil int nämlich 4 buchstaben hat
(wenn man den unbekannten unsichtbaren bonusbuchstaben mitzählt, was man natürlich tun sollte)
-
ach ich hab verwechselt dass an einer Speicherstelle 8 Bits stehen und nicht 1er.
Sorry und thx
-
es geht zwar schneller aber ich finde auch nur 200 Addressen statt 600...
dafür ist der Preis zu hoch
-
ist ja auch logisch du MUSST jedes byte durchlaufen um die meisten addressen zu erhalten sonst überspringst du die ja
-
wie mache ich es dann schneller
-
Indem du dir einen grösseren Block, sagen wir 64KB oder sowas, mit ReadProcessMemory holst, und in dem Block dann "direkt" suchst.
-
DWORD read = 0; LPBYTE buffer = new BYTE[end - start]; ReadProcessMemory(hackProcess, (LPVOID)start, &buffer, end-start, &read); delete[] buffer;
das würde ich ja gerne, nur das Programm beendet sich nachdem ReadProcessMemory ausgeführt wurde. (auch ohne delete)
-
mittlerweile habe ich das Problem behoben nur wie kann ich dann aus diesem rießen array die werte wie früher finden? wäre für code dankbar
-
ach mist das ist zwar sehr schnell aber ich kann es trotzdem nicht so machen -.-
ich muss ja die addresse wissen an der dieser wert gefunden wurde
-
Markus20 schrieb:
ach mist das ist zwar sehr schnell aber ich kann es trotzdem nicht so machen -.-
ich muss ja die addresse wissen an der dieser wert gefunden wurdeund wo ist das problem?
-
wenn ich gleich nen ganzen block einlese weiß ich ja nicht wo was gefunden wurde
-
so schätze ich dich auch ein, ja
-
Markus20 schrieb:
ach mist das ist zwar sehr schnell aber ich kann es trotzdem nicht so machen -.-
ich muss ja die addresse wissen an der dieser wert gefunden wurde1.Du merkst die die Adresse die du ReadProcessMemory übergibst (damit ist die Adresse gemeint wo ReadProcessMemory im Prozess anfängt die Daten auszulesen).
2.Jetzt suchst du im Array (welches du von ReadProcessMemory bekommst) nach deinen Gewünschten Daten, wenn es ein char ist, überprüfst du immer 1 byte und gehst dann 1 byte weiter (bei doubel byte character set immer 2 bytes überprüfen und 1 weiter gehen).
3. Wenn du den Wert gefunden hast, merkst du dir an welcher Stelle im Array zb. 42.
Jetzt addierst du dazu die Adresse die du ReadProcessMemory übergeben hast, und schon hast du die Adresse im Speicher.
-
ich habe es jetzt so gemacht, aber er findet damit viel mehr addressen als eigentlich da sind. ( er findet 500 andere 50)
hier mal mein Code:void ScanMem(DWORD start, DWORD end, LPVOID value) { DWORD read = 0; LPBYTE buffer = new BYTE[end-start]; TCHAR foundet[200]; int address; ReadProcessMemory(hackProcess, (void*)start, buffer, end - start, &read); for(int i = 0; i < (end-start); ++i) { if(buffer[i] == (int)value) { address = start + i; _stprintf(foundet, TEXT("Address: %.8X Value: %d"), address, value); SendMessage(GetDlgItem(hwndMainDlg, IDC_LIST2), LB_ADDSTRING, 0, (LPARAM)foundet); ++zaehler; } } delete[] buffer; }