Problem mit ReadProcessMemory
-
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
-
Markus20 schrieb:
ich habe sie bereits gelesen du vollhorst
Du hast nichts gelesen.
http://msdn.microsoft.com/en-us/library/aa366907(VS.85).aspxMSDN 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.
-
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
-
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