2013-10-17 3 views
5

Ich habe ein Programm in den Speicher geladen. Jetzt möchte ich direkt auf den Speicher zugreifen und den OPCODE und DATA im Speicher für dieses Programm ändern. Dazu muss ich ein Java-Programm schreiben.Zugriff auf Speicher mit Java

Können Sie mir bitte sagen, ob das machbar ist? Wenn ja, lass mich bitte wissen, wie man ein solches Programm schreibt.

Vielen Dank im Voraus!

+2

sollten Sie c/C++ dafür verwenden. – Sorter

Antwort

6

Java ist nicht dafür ausgelegt.
Das Hauptziel von Java ist es, die JVM den Speicher für Sie verwalten zu lassen. Daher sind Ihre Programme Sandboxed.

Es scheint jedoch ein Backdoor in HotSpot JVM zu sein:

Java zunächst als sichere, verwaltete Umgebung entwickelt wurde. Dennoch enthält Java HotSpot VM eine "Hintertür", die eine Anzahl von Low-Level-Operationen bietet, um Speicher und Threads direkt zu manipulieren. Diese Backdoor - sun.misc.Unsafe - wird häufig von JDK selbst in den Paketen java.nio oder java.util.concurrent verwendet. Es ist schwer, sich einen Java-Entwickler vorzustellen, der diese Hintertür in jeder normalen -Entwicklung verwendet, weil diese API extrem gefährlich, nicht portabel und flüchtig ist. Nichtsdestotrotz bietet Unsafe eine einfache Möglichkeit, in die HotSpot JVM Interna hineinzuschauen und ein paar Tricks zu machen. Manchmal ist es einfach lustig, manchmal kann es verwendet werden, um VM Interna ohne C++ Code Debugging zu studieren, manchmal kann es für Profiling und Entwicklung Werkzeuge genutzt werden.

Quelle: http://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/

Die Unsafe Klasse ist jedoch nicht dokumentiert. Sie können SO einen Blick auf diese, um weitere Informationen zu beantworten haben wollen: https://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafe

Unoffical Docs: http://mishadoff.github.io/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/
Absolute Beginners' Guidehttp://java-performance.info/string-packing-converting-characters-to-bytes/
http://javapapers.com/core-java/address-of-a-java-object/

P. S. Ich bin mir bewusst, dass ich hier etwas von dem Inhalt des Link posten müssen, aber da die Artikel wirklich sehr detailliert sind, habe ich das Teil

+1

Danke für Ihre Antwort. Ich habe die oben genannten Artikel auf UnSafe angeschaut. Was ich verstanden habe, ist, dass es verwendet werden kann, um Variablenwerte zu ändern und nicht auf der OPCODE-Ebene zuzugreifen und zu ändern. Bitte lassen Sie mich wissen, ob ich auf dem richtigen Weg bin? Vielen Dank. – kajarigd

+0

@kajarigd Es wäre irreführend zu sagen, dass ich weiß. Ich habe 'Asafe' nie selbst benutzt, da ich noch ein Neuling bin. Hoffentlich können einige erfahrene Stacker Ihnen besser helfen =) –

+0

Hier ist noch etwas StackOver ** laden **: http: // javapapers.com/core-java/adresse eines-java-objekts/ –

0

Sie übersprungen kann nicht direkt Referenzspeicher in Java, da sie kein Konzept von Zeigern ist in java wie c/C++

Sie diese durch referencing memory address

Hoffe, es hilft gehen müssen.

+0

Vielen Dank für Ihre Antwort. Ich würde gerne wissen, ob ich mit unSafe auf irgendeinen Teil des Speichers oder nur auf die variablen Werte zugreifen kann? Wenn ein Programm in den Speicher geladen wird, haben wir es im OPCODE, DATA-Format. Ich möchte auf den OPCODE zugreifen und ihn ändern. Ist das möglich? – kajarigd

+0

Ich denke, deine erste Frage sollte sein. Kannst du irgendeinen Adressstandort mit Java direkt ändern? Tut mir leid, ich habe es noch nie probiert. wahrscheinlich müssen Sie es selbst suchen. teilen Sie es, wenn Sie irgendeine Lösung erhalten. – Ashish