MemoryScanner

08/02/2009 00:25 geograman#1
Huhu,

Ich hab ne kleine frage zu ein paar Mamorscannern wie T-Search, Cheat-Engine oder ArtMoney.

Wenn ich mit diesen Programmen den Ram eines bestimmten Programmes druchscanne geht das scannen von int werten wesentlich schneller als das von float werten .

Des weiteren sind diese Scanner extrem schnell und liefern Ergebnisse binnen sekunden.

Ich habe mir schon meinen eigenen MemoryScanner geschrieben und bediene mich dabei den WINAPI funktion read/writeprocessmemory , ich habe schon mehrere multithreads am laufen und laste auch bereits den gesamten prozessor damit aus komme aber nicht annähernd an die geschwindigkeit einen solchen oben beschriebenen tools ran...

Woran liegt das ??? verwenden diese ein bestimmte technik um den ram eine programms schneller zu durchsuchen das sie zumal das system kaum belasten oder steckt das etwas ganz anderes dahinter ...
08/02/2009 01:06 Akorn#2
Durchsucht den dein memory searcher den auch nur den teil wo die variablen abgelegt werden oder lässt du den kompletten speicherbereich des programms durchsuchen?
08/02/2009 01:52 ms​#3
Wahrscheinlich rufst du ReadProcessMemory() in einer Schleife auf. Du solltest ReadProcessMemory() jedoch nur einmal aufrufen und damit dann den gesamten Teil des Zielprozesses, den du nach Werten durchsuchen willst, in den Buffer laden.
08/02/2009 13:19 geograman#4
Ja richtig ich gehe alle variablen mit einer schleife durch , das sieht dann so aus ->


unsigned long int GU = 0x000000000;
unsigned long int o=0;

for(int z=0;z<0x90000000;z++){

GU += z;

ReadProcessMemory(hGame, (LPVOID)GU, &o, 8, 0);
printf("Objektinhalt: Adresse %p, Inhalt %d\n",GU,o);

}

Was meinst du mit nur einmal aufrufen ? ich habe mir einige tuts durchgelesen und da wurde es jedesmal so angewendet ...
08/02/2009 13:52 Akorn#5
Quote:
Was meinst du mit nur einmal aufrufen ? ich habe mir einige tuts durchgelesen und da wurde es jedesmal so angewendet ...
Du liest bei jedem schleifendurchlauf immer nur 8bytes aus dem prozessaus. Lies mit nur einem ReadProcessMemory den gesamten aus.
08/02/2009 16:08 Ende!#6
Ich bin mir nicht ganz sicher, aber ich glaube, dass Cheat Engine schon bei der Suche DLL- oder Code-Injection benutzt und eigenen Code injiziert welcher dann aus dem Zielprozess direkt den Memory dumpt. Bin mir aber nicht ganz sicher ^^
08/02/2009 17:16 geograman#7
Also ich hab jetzt mal ne ganze Menge rumprobiert und am Ende kahm das hier raus ...

Mein Versuch war es, einen bereich mit malloc dynamisch zu erzueugen der groß genug ist um darin die 50 Byte der read funktion zu speichern und dann in einer file zu sichern.

Leider stimmt da irgendwas ganz und garnicht :/

Code:

int *erg;

erg = (int *)malloc(sizeof(int)*100);

ReadProcessMemory(hGame, (LPVOID)0x00000000, erg, 50, 0);

pFile = fopen ("MB.txt","a");

for(int z2=0;z2<100;z2++){

if(erg[z2]!=0){
fprintf (pFile, "%d\n",erg[z2]);
}
}


fclose (pFile);
08/02/2009 21:14 Assass1n#8
Vielleicht solltest Du dein (hoffentlich vorhandenes) Programmiergrundkenntnisse-Buch nochmal in die Hand nehmen und dir dazu die Dokumentation der WinAPI anschauen...
08/02/2009 21:31 link#9
Du solltest erst ab 400000h anfangen zu lesen (wobei es auch passieren kann, dass kurz davor Speicher alloziiert wird), da der Bereich darunter von Win32 benötigt wird und dir somit keine relevanten Informationen liefert.
Außerdem hast du auf [0x0] überhaupt keine Zugriffsrechte.

Code:
int WriteBytesToFile(HANDLE hProcess, DWORD dwStartAddress, DWORD dwSize, BYTE *byFileName, DWORD dwOutput)
{
	FILE		*fp = fopen(byFileName, "wb");
	DWORD		i, size = dwSize * sizeof(int);
	PDWORD		*bytes = (PDWORD)GlobalAlloc(GPTR, size);

	ReadProcessMemory(hProcess, (LPVOID)dwStartAddress, bytes, size, NULL);

	for (i = 0; i < dwSize; ++i)
		fprintf(fp, (dwOutput) ? (dwOutput == 2) ? "%X\n" : "%u\n" : "%d\n", bytes[i]);

	fclose(fp);
	GlobalFree((HGLOBAL)bytes);
	return 0;
}

WriteBytesToFile(GetCurrentProcess(), 0x400000, 100, "C:\\proc.txt", 2);
08/15/2009 00:59 nimrod316#10
du sagst, dass du auch writememory benutzt. kommt zufaellig in deiner schleife ein virtualprotect vor? wenn du nur lesen willst, lass den befehl weg.
08/15/2009 20:50 schlurmann#11
CheatEngine ist OpenSource, los meine fleißigen Bienchen, fliegt!