F
Vicious Falcon schrieb:
Ich habe mich jetzt auch einmal registriert.
Zeig doch mal den entsprechenden Code. Wenn ich einen Wert suche, dann habe ich auch nach ganz kurzer Zeit die Adressen; ich glaube, irgendetwas machst du falsch.
Und wenn du den Wert an einer bereits gefundenen Speicherstelle auslesen möchtest, dann musst du natürlich nicht den kompletten Suchvorgang wiederholen. Dafür hast du ja die Adressen in einem Container gespeichert. Du kannst jetzt also direkt ReadProcessMemory mit der Adresse aufrufen.
Hihi das war auch mein erster Gedanke, ABER ich kenne ja nicht die Adresse, sondern habe nur die vorgänger-Adresse, die der Wert ist
D.h. ist habe zwar eine Adresse, aber die ist nur ein Wert, dessen Adresse ich wieder suche.
Wie gesagt der Code ist nicht der Beste und ich musste vieles Ändern, da es sonst Fehlermeldungen in meinem System gab
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <Tlhelp32.h>
#include <string>
using namespace std;
int main()
{
HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, getPID("plugin-container.exe"));
MEMORY_BASIC_INFORMATION mbi;
SYSTEM_INFO sinfo;
memset(&sinfo, 0, sizeof(sinfo));
GetSystemInfo(&sinfo);
unsigned int adresse = (unsigned int) sinfo.lpMinimumApplicationAddress;
unsigned int start = NULL, end = NULL;
char buffer[9];
char suchWort[9];
suchWort[0] = '_'; suchWort[4] = 'e';
suchWort[1] = 'l'; suchWort[5] = 'l';
suchWort[2] = 'e'; suchWort[6] = '0';
suchWort[3] = 'v'; suchWort[7] = '/';
suchWort[8] = ':';
DWORD read = 0;
bool found = true;
do
{
VirtualQueryEx(hproc, (LPCVOID) adresse, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
if (mbi.State == MEM_COMMIT && mbi.Protect == PAGE_READWRITE && mbi.Type == MEM_PRIVATE)
{
start = (unsigned int) mbi.BaseAddress;
end = (unsigned int) mbi.BaseAddress + mbi.RegionSize;
cout << hex << start << " - " << end << endl;
for (start; start < end; start++)
{
ReadProcessMemory(hproc, (LPCVOID) start, &buffer, sizeof(buffer), &read);
found = true;
for (size_t j = 0; j < sizeof(suchWort); j++)
{
if (buffer[j] != suchWort[j])
{
found = false;
break;
}
}
if (found)
{
char buchstabe = 'a';
string variablenName = "";
unsigned int adresse = start + 9;
while (buchstabe)
{
ReadProcessMemory(hproc, (LPCVOID) adresse, &buchstabe, sizeof(buchstabe), &read);
adresse++;
if (buchstabe) variablenName += buchstabe;
}
cout << "\tVariable gefunden: " << variablenName << endl;
}
}
}
adresse += mbi.RegionSize;
}
while (adresse < (unsigned int)sinfo.lpMaximumApplicationAddress);
CloseHandle(hproc);
}
Wenn ich das Programm ausführe, crashed es am Ende (wenn ein sehr hoher Speicherbereich erreicht wurde)
Frag dich nicht warum ich bei suchWort extra so primitiv vorgegangen bin, ein Vergleich war sonst nicht möglich, strcmp lieferte mir obgleich 2 identischer char-arrays nie eine 0 ...
Der obige Code sucht nur die String-Adressen die ich benötige, doch für die nächsten Suchanfragen müsste ich im Grunde das Gleiche machen, nur mit anderen Suchwerten.