ReadProcessMemory, C++ Problem

08/07/2010 20:59 ●ROBBY●#1
Hi, ich mach mich gerade ans Memory editing in C++ aber habe nen Problem mit ReadProcessMemory.
Hier mal mein Code:
PHP Code:
#include <iostream>
#include <limits>
#include <windows.h>

using namespace std;

int main()
{
    
HWND hwnd;
    
hwnd FindWindow (0,"METIN2");
    
DWORD id;
    
HANDLE processhandle;
    
int value;
    
unsigned adress 0x0061BFEC;

    if (!
hwnd)
    {
        
cout << "Metin2 nicht gefunden.";
    }

    else
    {
    
GetWindowThreadProcessId(hwnd,&id);
    
processhandle OpenProcess(PROCESS_ALL_ACCESS ,false,id);


    
ReadProcessMemory (processhandle,(LPCVOID)adress,&value,sizeof (value),NULL);

    
CloseHandle (processhandle);

    
cout << &value << "\n";
    }


    
cin.clear();
    
cin.ignore(numeric_limits<streamsize>::max(), '\n');
    
cin.get();

Leider wird mir immer 0x27fefc (dez. 2.621.180) ausgegeben und das ist nicht das richtige Egebniss. (Als Admin starten bringt auch nichts)

(Wenn ihr den Sinn des Codes nicht versteht, liegt das dadran das er noch nicht fertig ist, ich wollte nur erstmal prüfen ob das mit ReadProcessMemory klappt)
08/07/2010 21:50 Shadowz75#2
Quote:
cout << &value << "\n";
zu

Quote:
cout << value << "\n";
sonst gibst du die adresse deiner variable aus nicht den wert
08/07/2010 22:27 MrSm!th#3
Du stellst die Frage nochmal hier obwohl ich dir das gleiche, wie mein Vorposter per PM geantwortet habe? o.ô
08/08/2010 10:22 ●ROBBY●#4
Achso hatte nen kleinen Denkfehler ich dachte wenn ich & davor setze wandelt er es in Hex um :(

Jetzt funktioniert es, aber ich brauch den Wert aus der Adresse in Hex kennt jemand nen Befehl mit dem ich das umwandeln kann?
08/08/2010 13:42 ms​#5
Code:
cout << hex << value << "\n";
08/08/2010 14:42 ●ROBBY●#6
Quote:
Originally Posted by Disconnect View Post
Code:
cout << hex << value << "\n";
Ich will es aber in ner Variable speichern und nicht einfach ausgeben lassen.
08/08/2010 15:43 ●ROBBY●#7
Dass ich nicht weiß wie ich nen dez. Wert in nen Hex umwandeln kann und das Ergebniss in ner Variable speichere.

Hab jetzt erstmal ne Behelfsmäßige Lösung gefunden. Hier mal mein Code:
PHP Code:
#include <iostream>
#include <limits>
#include <windows.h>

using namespace std;

int readfirstadress(DWORD id)
{
    
HANDLE handle;
    
int value;
    
unsigned int adress 0x0061BFEC;
    
unsigned int adress2;

    
handle OpenProcess(PROCESS_ALL_ACCESS ,false,id);

    
ReadProcessMemory (handle,(LPCVOID)adress,&value,sizeof (value),NULL);

    
CloseHandle (handle);

    
value value 60;
    
cout << hex << value << endl;
    
cin >> adress2;

    return 
adress2;
}

int readsecondadress(int adressDWORD id)
{
    
HANDLE handle;
    
int value;
    
unsigned int adress2;

    
handle OpenProcess(PROCESS_ALL_ACCESS ,false,id);

    
ReadProcessMemory (handle,(LPCVOID)adress,&value,sizeof (value),NULL);

    
CloseHandle (handle);

    
cout << hex << value << endl;
    
cin >> adress2;

    return 
adress2;
}


int main()
{
    
HWND hwnd;
    
hwnd FindWindow (0,"METIN2");
    
DWORD id;
    
unsigned adress;
    
unsigned adress2;

    if (!
hwnd)
    {
        
cout << "Metin2 nicht gefunden.";

        
cin.clear();
        
cin.ignore(numeric_limits<streamsize>::max(), '\n');
        
cin.get();
    }

    else
    {
        
GetWindowThreadProcessId(hwnd,&id);

        
adress readfirstadress(id);
        
adress2 readsecondadress (adressid);

        
cin.clear();
        
cin.ignore(numeric_limits<streamsize>::max(), '\n');
        
cin.get();

    }


Leider funktioniert das zweite ReadProcessMemory nicht, es giebt immer den falschen Wert aus.
08/08/2010 17:30 MrSm!th#8
Int ist int.
Hex/Dez/Oct ist nur wichtig, wenn du es als string ausgeben willst, es ist wirklich total egal, wenn du es in ner variable hast, da es sowieso alles binär gespeichert ist.

also
Code:
return value;
und fertig
08/08/2010 20:11 ●ROBBY●#9
Aber ich brauch es ja als Hex um ReadProcessMemory zu machen oder geht das etwa auch mit ner dez. Zahl?

Edit: Vielen Dank Smith habs jetzt infach mal ausprobiert und es klappt super :)

Edit2: WriteProcessMemory funktioniert auch einwandfrei.
Für diejenigen die es interessiert, hier mal mein Code.
08/08/2010 20:13 mydoom#10
Klar geht das.

EDIT// Was willst du denn mit Readprocessmemory und der Zahl?
EDIT2// Ok, hat sich anscheinend erledigt
08/08/2010 20:47 ●ROBBY●#11
Meintest du
PHP Code:
value value 60
Da addiere ich das Offset (3C) zu der Adresse.
08/09/2010 03:51 MrSm!th#12
Quote:
Originally Posted by ●ROBBY● View Post
Aber ich brauch es ja als Hex um ReadProcessMemory zu machen oder geht das etwa auch mit ner dez. Zahl?
Warum liest denn meinen Post nicht richtig?
Zahl ist Zahl.

Hex/Binär/Oktal/Dezimal sind alles einfach nur Darstellungsweisen in Strings, also die wir zb. in Texten lesen können.
Diese Strings sind aber nicht das gleiche, wie die Zahl.
Das sind selbst ASCII Zeichen!
Eine Zahl ist ganz normal binär im Arbeitspeicher/auf der Festplatte/in den Registern gespeichert, da gibts keine Verschiedenen Darstellungsweisen, da gibts nur 1 und 0.
Und das heißt nicht, dass du alles erst zu 1 und 0 konvertieren musst, es ist schon so.
Würdest du eine Zahl ausgeben wollen, käme da auch nicht der String (zb. beim Wert 1 kommt der String "1"), sondern irgendwelche Sonderzeichen, die diesen Wert haben, weil eben zb. die 1 nicht den ASCII Wert 1 hat, also würde man es konvertieren, käme das Zeichen, mit dem Wert 1 raus!
Und wie gesagt, logischerweise gibt es nur in Strings unterschiedliche Darstellungsformen, für den PC ist Zahl = Zahl, nix mit konvertieren in Hex/Dezimal/whatever; das sind keine Verschiedenen Typen, sondern nur unterschiedliche Darstellungsformen in Strings.

Quote:
Originally Posted by ●ROBBY● View Post
Meintest du
PHP Code:
value value 60
Da addiere ich das Offset (3C) zu der Adresse.
wie wäre es mit

Code:
value = value + 0x3C;
? :rolleyes:

Dann musst du nicht immer alles mit dem Taschenrechner umrechnen.
08/09/2010 17:35 ●ROBBY●#13
Code:
value = value + 60;
Das hatte ich einfach von meinem vorherigen Code übernommen da ich da ja noch dachte ich müsste alles in Hex umwandeln.

Und mit C++ beschäftige ich mich noch nicht sehr lange und intensiv mit Memoryediting erst seid ca. drei Tagen :o bin halt noch etwas unerfahren in dem Gebiet.