PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Speicherzugriff in Java und C# ?


Gast
2007-06-27, 16:48:23
Hallo.

Also ich bin vor über einem Jahr wegen diesem kleinen aber feinen Forum hier auf den Geschmack des Programmierens gekommen und habeangefangen, mich mit Delphi zu beschäftigen. Mittlerweile kann ich damit für meine Verhältnisse ganz schön viel anstellen, mein letztes Projekt war ein Spieletrainer für GTA:SA.

Jetzt wollte ich aber mal über den Tellerrand hinausblicken und eine "höhere" Sprache anschauen, C# und Java kamen da in die engere Auswahl. Ich habe mir nun eine Woche lang beide Sprachen parallel angesehen und konnte enorm viel Gemeinsamkeiten feststellen.

Nun, als ich mich dann etwas produktiv betätigen wollte und zum testen meinen Spieletrainer "portieren" wollte (sprich in c# bzw. Java nachschreiben) bin ich bei dieser Gelegenheit auf ein paar Kurzerläuterungen im Netz gestoßen und musste feststellen, dass man garnich so einfach (oder überhaupt nicht?) auf Speicherbereiche zugreifen/diese modifizieren kann.

Erzähle ich hier gerade Müll, oder is tdas unter C#/Java wirklich so?

Danke

Monger
2007-06-27, 16:51:32
Wenn ich dich jetzt richtig verstehe, hast du völlig recht: weder unter C# noch unter Java kannst du direkt auf den Speicher schreiben, schon aus Sicherheitsgründen. Der Speicher wird ausschließlich durch die Runtime bzw. das Framework verwaltet.

Gast
2007-06-27, 17:12:51
was genau meinst du denn mit "auf Speicherbereiche zugreifen"? Du greifst immer auf einen Speicherbereich zu und veränderst seinen Inhalt, wenn du z.B. den Wert einer Variablen veränderst. Redest du vielleicht von Pointern? Die gibt es in C# und Java tatsächlich nicht. Es gibt lediglich Verweise (auch Referenzen genannt), mit denen kann man aber bei weitem nicht so viel anstellen.

Gnafoo
2007-06-27, 17:41:52
Natürlich kann C# Pointer. Allerdings muss man dazu den entsprechenden Codeblock mit einem unsafe-Block umschließen und afair den Compiler umstellen. Habe ich allerdings noch nie gemacht und im Allgemeinen ist davon auch abzuraten (außer in Spezialfällen vielleicht).

In C# würde ich mich zum Thema unsafe-Block informieren und in der Dokumentation der System.Runtime.InteropServices.Marshal-Klasse nachsehen, die denke ich Speicherzugriffe außerhalb des verwalteten Speichers ermöglicht.

Bei Java kenne ich mich nicht aus, aber ich nehme an hier wird es schwieriger, wegen der Java-VM.

Shink
2007-06-27, 18:05:38
In Java gehts natürlich nicht ganz einfach; höchstens man findet Libraries, die so etwas ermöglichen (und selbst in einer anderen Sprache geschrieben sind).

Man WILL ja gar nicht in fremden Speicherbereichen herumspielen, oder? ;)

Gnafoo
2007-06-27, 18:19:36
Naja es gibt schon einige Fälle, in denen es sinnvoll sein mag. Echtzeitanwendungen, externe Bibliotheken, die Pointer brauchen, Debugging-Zwecke, Speicherabbilder, Profiler etc. pp. Aber das ist natürlich alles recht exotisch und in 99% der Fälle kann man auf Pointer verzichten.

Trotzdem finde ich es recht gut, dass einem C# zumindest die Möglichkeiten einräumt. Man sollte allerdings auch vernünftig damit umgehen, wenn man einmal dazu gezwungen sein sollte, auf Pointer zurückzugreifen.

In diesem Falle kann man natürlich über die Sinnhaftigkeit der Anwendung streiten X-D aber möglich dürfte es schon sein.

Edit: Ich vermute mal hiermit könnte man so etwas auch in Java machen:
https://rtsj.dev.java.net/nonav/source/browse/*checkout*/rtsj/www/doc/index.html

(aber das ist nur gegoogelt, von Java habe ich eigentlich keine Ahnung.)

Gast
2007-06-27, 19:10:12
Danke schonmal :)

Habe mich vllt etwas ungenau ausgedrückt, ich meinte das manuelle verändern des Inhalts einer Speicheradresse, wie es bei Trainiern üblich ist. Zum Beispiel das neuschreiben oder "freezen" von Healthpoints oder Ammo, was eben gewünscht ist (in Delphi stellte dies kein Problem dar).

Habe aber schon vermutet, dass es etwas mit den unsafe-Blöcken zu tun hat udn werde mich da mal informieren.

Gnafoo
2007-06-27, 20:04:33
Wie gesagt, probier es einmal mit der Marshal-Klasse.
http://msdn2.microsoft.com/en-us/library/system.runtime.interopservices.marshal_members.aspx

Die Methoden
ReadByte/ReadInt16/ReadInt32...
WriteByte/WriteInt16/WriteInt32...

scheinen mir das zu sein, was du suchst.

Monger
2007-06-27, 22:34:23
Danke schonmal :)

Habe mich vllt etwas ungenau ausgedrückt, ich meinte das manuelle verändern des Inhalts einer Speicheradresse, wie es bei Trainiern üblich ist.

Wie gesagt: ist eigentlich ne Sicherheitslücke, und afaik unter Java nicht machbar. Das fängt schon damit an, dass man gar nicht weiß, wo sich denn physikalisch ein anderes Programm überhaupt aufhält.
Fremdcode in eine laufende Anwendung einzuspeisen, riecht ja auch schon arg nach Virus.

Shink
2007-06-28, 08:20:20
Edit: Ich vermute mal hiermit könnte man so etwas auch in Java machen:
https://rtsj.dev.java.net/nonav/source/browse/*checkout*/rtsj/www/doc/index.html

(aber das ist nur gegoogelt, von Java habe ich eigentlich keine Ahnung.)
Öhm... naja; rtsj hätt ich jetzt nicht gemeint... wenn es damit funktionieren sollte, würde mich das schon sehr wundern.

Arokh
2007-06-28, 15:18:58
Wie gesagt: ist eigentlich ne Sicherheitslücke, und afaik unter Java nicht machbar. Das fängt schon damit an, dass man gar nicht weiß, wo sich denn physikalisch ein anderes Programm überhaupt aufhält.wie kommst du denn jetzt auf ein anderes Programm?

Monger
2007-06-28, 15:53:01
wie kommst du denn jetzt auf ein anderes Programm?
Wenn ich den Threadersteller richtig verstanden habe, will er ja gezielt Speicheradressen überwachen und manipulieren, die außerhalb des eigenen Kontextes liegen. Wie eben ein Trainer, der bei einem Spiel da und dort eine bestimmte Lebensenergie reinschreibt.

Der_Donnervogel
2007-06-28, 16:09:20
Das Posting des Gastes geht eindeutig in diese Richtung:
Habe mich vllt etwas ungenau ausgedrückt, ich meinte das manuelle verändern des Inhalts einer Speicheradresse, wie es bei Trainiern üblich ist. Zum Beispiel das neuschreiben oder "freezen" von Healthpoints oder Ammo, was eben gewünscht ist (in Delphi stellte dies kein Problem dar).
Ich hab zwar schon ewig keine Trainer verwendet (seit dem Amiga), und bin da nicht ganz auf dem laufenden. Es gibt aber doch prinzipiell zwei Möglichkeiten, entweder man manipuliert direkt die exe des Spiels und hängt den Trainer da rein, oder aber man nimmt ein externes Programm, das dann on-the-fly die Daten im Spiel manipuliert.

Aber egal welche der Varianten es ist, Java ist für so etwas denkbar ungeeignet. Auszuschließen ist es aber nicht, daß man es mit Tricks hinbekommt. Man kann ja auch in VB6 Assembler-Code einbinden. Aber auch C# ist für Sachen wie Trainer schreiben ungünstig, da es bei so etwas keinen Sinn macht, den Overhead der .Net-Runtime mitzuschleppen.

Gast
2007-06-28, 18:50:12
Ok danke Leute.

Wenn ich das richtig verstanden habe, kann man das mit Java ganz vergessen und mit C# wärs auch nur suboptimal. Werde mir letztes trotzdem mal anschauen.

Mir ging es übrigens um den Zugriff auf Speicherbereiche fremder Programme, in diesem Fall eben auf den von Spielen.

@Der_Donnervogel:

Teils Teils. Also zum einen handelt es sich zwar um in externes Programm, welches on-the-fly arbeitet, andererseits muss trotzdem die .exe angegeben werden, da der Speicherbereich des betreffenden Spiels ja nach jedem Start variiert und somit dynamisch ist. Wenn man nun aber die "Startadresse" des Speicherbereiches kennt, kann man allgemeingültige Regeln aufstellen, da die Daten innerhalb des Bereiches immer an selbiger Stelle zu finden sind.