No_BreaK - 32
Fortgeschrittener
(offline)
Dabei seit 02.2010
47
Beiträge
|
|
Geschrieben am: 04.08.2011 um 16:19 Uhr
|
|
So, da ich im Forum keinen einzigen Beitrag dazu gefunden habe, ich im Internet nicht so richtig fündig geworden bin und sich mir immer noch die Frage stellt: "Wie lese ich bestimmte Adressen in C# aus?" möchte ich mich hier nun kundig machen: Kennt sich da jemand aus?
Ich vermute mal nein, da dieser Bereich größtenteils für Nonsens missbraucht wird.
Würde mich über Erklärungen freuen.
C oder C++ wären auch OK.
Mit freundlichen Grüßen,
No_Break.
|
|
bredator - 41
Champion
(offline)
Dabei seit 03.2008
5319
Beiträge
|
|
Geschrieben am: 04.08.2011 um 16:23 Uhr
|
|
Schau dir mal den folgenden Artikel auf Codeproject an, dort wird einiges dazu erläutert, wie man die WinAPI-Funktionen nutzen kann:
Codeproject
Lache nicht über jemanden, der einen Schritt zurück macht. Er könnte Anlauf nehmen.
|
|
Bon_Scott - 37
Halbprofi
(offline)
Dabei seit 05.2005
386
Beiträge
|
|
Geschrieben am: 04.08.2011 um 16:35 Uhr
|
|
Vielleicht hilft dir ja diese Seite weiter:
c-sharpcorner.com
Nur weil du nicht Paranoid bist, heißt das nicht, dass du nicht verfolgt wirst!
|
|
No_BreaK - 32
Fortgeschrittener
(offline)
Dabei seit 02.2010
47
Beiträge
|
|
Geschrieben am: 04.08.2011 um 16:40 Uhr
|
|
Ach ist das toll. So viele Antworten. 
@Bredator:
Danke, hat mir etwas geholfen. 
@Bon_Scott
Pointer zu deklarieren und auf Variablen innerhalb des eigenen Codes ist ja noch einfach.
Nur wie setze ich den dann auf eine Adresse im RAM?
So?
int* Handle = (int*) 0x0001;
|
|
Bon_Scott - 37
Halbprofi
(offline)
Dabei seit 05.2005
386
Beiträge
|
|
Geschrieben am: 04.08.2011 um 16:43 Uhr
|
|
schau hier ... das müsste das sein, was du meinst:
mikrocontroller.net
Nur weil du nicht Paranoid bist, heißt das nicht, dass du nicht verfolgt wirst!
|
|
No_BreaK - 32
Fortgeschrittener
(offline)
Dabei seit 02.2010
47
Beiträge
|
|
Geschrieben am: 04.08.2011 um 16:52 Uhr
|
|
Danke!
Und jetzt nochmal für ganz Dumme wie mich:
Ich suche eine Adresse, nehme die Base weg und erhalte das Offset. Base wäre dann der Windowhandle, also ein IntPtr?
Um dann die spezielle Adresse zu erhalten nehme ich aus der Process-Klasse den Handle und addiere auf den Handle die Adresse.
Also so:
IntPtr Base = process.Handle;
int* HealthOffSet = (int*) 0x01998;
int Health = (int) (Base + HealthOffSet);
Oder halt per API-Call. 
Liege ich da jetzt richtig? ^^
|
|
bredator - 41
Champion
(offline)
Dabei seit 03.2008
5319
Beiträge
|
|
Geschrieben am: 04.08.2011 um 16:58 Uhr
|
|
Im Wesentlichen ja.
Lache nicht über jemanden, der einen Schritt zurück macht. Er könnte Anlauf nehmen.
|
|
Bon_Scott - 37
Halbprofi
(offline)
Dabei seit 05.2005
386
Beiträge
|
|
Geschrieben am: 04.08.2011 um 16:59 Uhr
|
|
Nur weil du nicht Paranoid bist, heißt das nicht, dass du nicht verfolgt wirst!
|
|
No_BreaK - 32
Fortgeschrittener
(offline)
Dabei seit 02.2010
47
Beiträge
|
|
Geschrieben am: 04.08.2011 um 17:05 Uhr
|
|
Dann bedanke ich mich bei euch beiden und übergebe den Thread den Weiten des Internets!
|
|
McPommes - 51
Experte
(offline)
Dabei seit 09.2006
1422
Beiträge
|
|
Geschrieben am: 04.08.2011 um 19:05 Uhr
|
|
Ich würd sagen das gehört noch gescheit gecastet. Und ein Pointer addiert meines Wissens so viele Speicherplätze wie der Typ belegt, auf den er zeigt. Also ein Pointer auf int plus eins erhöht den Pointer dann eigentlich um 4, weil ein int 4 Bytes belegt.
Musst ein bisschen damit rumspielen.
*** diese Fusszeile verschwendet 45 Bytes ***
|
|
No_BreaK - 32
Fortgeschrittener
(offline)
Dabei seit 02.2010
47
Beiträge
|
|
Geschrieben am: 04.08.2011 um 19:43 Uhr
|
|
Zitat von McPommes: Ich würd sagen das gehört noch gescheit gecastet. Und ein Pointer addiert meines Wissens so viele Speicherplätze wie der Typ belegt, auf den er zeigt. Also ein Pointer auf int plus eins erhöht den Pointer dann eigentlich um 4, weil ein int 4 Bytes belegt.
Musst ein bisschen damit rumspielen.
Und wo habe ich das nun nicht gemacht?
Beim API-Call ist mir das schon klar.
|
|
McPommes - 51
Experte
(offline)
Dabei seit 09.2006
1422
Beiträge
|
Geschrieben am: 04.08.2011 um 21:16 Uhr
Zuletzt editiert am: 04.08.2011 um 21:16 Uhr
|
|
Gecastet ist nicht ganz der richtige Ausdruck. Du berechnest bisher die Speicheradresse als int, aber du liest sie noch nicht aus.
Du musst noch auf die Speicheradresse zugreifen und das lesen was da drin steht.
So etwa
int* HealthPtr = Base + HealthOffSet;
int Health = *HealthPtr;
*** diese Fusszeile verschwendet 45 Bytes ***
|
|
No_BreaK - 32
Fortgeschrittener
(offline)
Dabei seit 02.2010
47
Beiträge
|
|
Geschrieben am: 04.08.2011 um 22:14 Uhr
|
|
Zitat von McPommes: Gecastet ist nicht ganz der richtige Ausdruck. Du berechnest bisher die Speicheradresse als int, aber du liest sie noch nicht aus.
Du musst noch auf die Speicheradresse zugreifen und das lesen was da drin steht.
So etwa
int* HealthPtr = Base + HealthOffSet;
int Health = *HealthPtr;
Oder kurz:
int Health = (int) (int*) (Base + HealthOffSet); //Wobei er mir hier sagte, er könne Operator + nicht auf int* und int* ausführen könne.
int Health = (int) (int*) ((int) Base + (int) HealthOffSet); //Hier ging es lustigerweise. ^^
|
|
McPommes - 51
Experte
(offline)
Dabei seit 09.2006
1422
Beiträge
|
|
Geschrieben am: 07.08.2011 um 16:05 Uhr
|
|
Wie du schon am Fehler merkst, gehts eben doch nicht so kurz 
Zitat: int Health = (int) (int*) ((int) Base + (int) HealthOffSet); //Hier ging es lustigerweise. ^^
Du baust da auch alles ein paar mal hin und her um. Auf einen Pointer kann man wahrscheinlich nur einen int addieren, macht ja auch Sinn. Der Offset müsste also nur ein int sein, dann gehts.
Aber auch hier fehlt dir noch ein * um den Inhalt der Speicherstelle zu lesen. Bisher kopierst du nur den Pointer als int.
Wenn schon kurz, dann so
int xyz = *(Base + HealthOffSet);
*** diese Fusszeile verschwendet 45 Bytes ***
|
|