|
You last visited: Today at 07:10
Advertisement
MemoryScanner
Discussion on MemoryScanner within the General Coding forum part of the Coders Den category.
08/02/2009, 00:25
|
#1
|
elite*gold: 0
Join Date: Jul 2008
Posts: 10
Received Thanks: 0
|
MemoryScanner
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
|
#2
|
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
|
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
|
#3
|
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,345
|
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
|
#4
|
elite*gold: 0
Join Date: Jul 2008
Posts: 10
Received Thanks: 0
|
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
|
#5
|
elite*gold: 0
Join Date: Mar 2008
Posts: 747
Received Thanks: 245
|
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
|
#6
|
elite*gold: 1
Join Date: Feb 2009
Posts: 6,378
Received Thanks: 7,996
|
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
|
#7
|
elite*gold: 0
Join Date: Jul 2008
Posts: 10
Received Thanks: 0
|
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
|
#8
|
elite*gold: 20
Join Date: Dec 2006
Posts: 839
Received Thanks: 91
|
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
|
#9
|
elite*gold: 1
Join Date: Jul 2005
Posts: 553
Received Thanks: 454
|
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
|
#10
|
elite*gold: 0
Join Date: Mar 2009
Posts: 62
Received Thanks: 8
|
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
|
#11
|
elite*gold: 0
Join Date: May 2008
Posts: 489
Received Thanks: 210
|
CheatEngine ist OpenSource, los meine fleißigen Bienchen, fliegt!
|
|
|
All times are GMT +1. The time now is 07:12.
|
|