Frage

Da ich keine Antwort auf die gestellte Frage vorher hier gefunden ich versuche, einen anderen Ansatz.

Gibt es eine Möglichkeit Speicher zwischen zwei Prozessen zu teilen?

Der zweite Prozess erhält die Informationen von einer Injektion, da es ein Vermächtnis-Programm ist, dass es nicht mehr unterstützt wird.

Meine Idee ist, einen Code gibt, in der Struktur zu injizieren, die ich auf das injizierte Programm am Passieren der Adresse übergeben (oder was auch immer) an den gemeinsamen Speicher, wo die Daten, die ich ausführen müssen befindet. Sobald ich die Daten erhalten werde ich meine eigenen Variablen innerhalb des injizierten Thread füllen.

Ist das möglich? Wie?

-Code wird geschätzt.

EDIT:

Ich denke, es ist nicht klar, so dass ich klären werde. Ich weiß, wie zu injizieren. Ich tue es bereits. Das Problem hierbei ist, dynamische Daten an die Injektion zu übergeben.

War es hilfreich?

Lösung

Sie können versuchen, eine Memory-Mapped-Datei .

Diese gibt ein bisschen mehr Schritt-für-Schritt Detail.

Andere Tipps

Obwohl Windows-Speicher durch seinen Dateizuordnungs API unterstützt Shared , können Sie nicht einfach ein Shared-Memory-Mapping in einen anderen Prozess direkt, wie MapViewOfFileEx keinen Prozess Argument.

Sie können jedoch einige Daten injizieren von Speichern in einem anderen Prozess Zuweisung mit VirtualAllocEx und Write . Wenn Sie sind in einem Griff kopieren Sie mit DuplicateHandle injizieren, dann einen Stub, die MapViewOfFileEx , Sie könnte ein Shared Memory Mapping in einem anderen Prozess herzustellen. Da es klingt wie Sie Code sowieso Injektion werde, dies sollte auch für Sie arbeiten.

Um es zusammenzufassen, müssen Sie an:

  • Erstellen Sie einen anonymen Shared-Memory-Segment Griff durch den Aufruf Create mit INVALID_HANDLE_VALUE für hFile und NULL für lpName.
  • Kopieren Sie diesen Griff in den Zielprozess mit DuplicateHandle
  • Weisen Sie etwas Speicher für Code VirtualAllocEx mit flAllocationType = MEM_COMMIT | MEM_RESERVE und flProtect = PAGE_EXECUTE_READWRITE
  • Schreiben Sie eine Stub-Code in diesen Speicher, mit Write . Dieser Stummel müssen wahrscheinlich in Assembler geschrieben werden. Übergeben Sie den Griff von DuplicateHandle indem sie sie in hier irgendwo zu schreiben.
  • Führen Sie Ihre Stub mit Create . Der Stutzen muss dann den GRIFF verwenden Sie es erhalten MapViewOfFileEx . Die Prozesse werden dann ein gemeinsames Shared-Memory-Segment haben.

Sie können es ein bisschen leichter fällt, wenn Ihre Stub Lasten eine externe Bibliothek - das heißt, haben sie rufen Sie einfach Loadlibrary (die Adresse von Loadlibrary zu finden als eine Übung bleibt dem Leser) und tun Sie Ihre Arbeit aus der DllMain Eintrag Bibliothek Punkt. In diesem Fall namens Shared-Memory ist wahrscheinlich einfacher als mit DuplicateHandle futzing um. Finden Sie im MSDN-Artikel auf Create , um weitere Informationen, aber im wesentlichen passieren INVALID_HANDLE_VALUE für hFile und einen Namen für lpName.

Bearbeiten : Da Ihr Problem Daten ist vorbei und nicht unbedingt die Code-Injektion, hier sind ein paar Optionen

.
  1. Verwenden variabler Größe Shared Memory. Ihre Stummel erhalten die Größe und entweder den Namen oder einen Griff an den gemeinsamen Speicher. Dies ist sinnvoll, wenn Sie nur einmal Daten austauschen müssen. Beachten Sie, dass die Größe eines Shared-Memory-Segment kann nicht einfach nach der Erstellung geändert werden.
  2. Verwenden Sie ein Rohr benannt. Ihre Stummel bekommt den Namen oder einen Griff auf das Rohr. Sie können dann ein entsprechendes Protokoll zum Austausch von variabler Größe Blöcke verwenden - zum Beispiel eines size_t für Länge, gefolgt von der eigentlichen Nachricht schreiben. Oder nutzen Sie PIPE_TYPE_MESSAGE und PIPE_READMODE_MESSAGE, und achten Sie auf ERROR_MORE_DATA, wo ich bestimmenssages Ende. Dies ist angemessen, wenn Sie Daten müssen mehrfach ausgetauscht werden.

Edit 2 : Hier ist eine Skizze, wie Sie Griff oder Zeigerspeicher für Ihre Stub implementieren könnte:

.db B8            ;; mov eax, imm32
.dl handle_value  ;; fill this in (located at the start of the image + one byte)
;; handle value is now in eax, do with it as you will
;; more code follows...

Sie können auch nur einen festen Namen verwenden, die wahrscheinlich einfacher ist.

Haben Sie versucht, Rohre zu verwenden (Speicher) oder sogar Serialisierung (für Ihre Objekte)? Sie können Dateien verwenden, um Speicher zwischen Prozessen zu verwalten. Sockets sind auch eine gute Kommunikation zwischen Prozessen zu erhalten.

Memory Mapping ist der Weg zu gehen, Sie brauchen nicht einmal einen permanenten Speicherplatz zu schaffen, geht der Speichersektor außerhalb des Bereichs, wenn alle Prozesse teilen sie Shutdown sind. Es gibt auch andere Möglichkeiten. Eine schnelle und schmutzige Art und Weise Daten von einer C Anwendung zu einer anderen der Weitergabe ist nur das Betriebssystem zu verwenden. Bei Befehlszeile Typ app1 | app2. Dies bewirkt, dass app2 das Ausgabeziel von app1 sein oder einen printf Befehl von app1 IOW es app2 senden würde (diese Rohrleitung genannt).

Sie können versuchen, mit Boost.Interprocess zwischen zwei Prozessen zu kommunizieren. Aber injizieren Code in eine bereits vorhandene, nicht unterstützte Software, werden Sie wahrscheinlich @ bdonlan Weg benutzen müssen mit Write .

Wenn Sie über Windows sprechen sind, ist die Haupt Straßensperre dass jede Prozesse leben in ihrer eigenen virtuellen Adressraum. Sie können leider nicht normale Speicheradressen laufen um von Verfahren, die Ergebnisse zu verarbeiten und bekommen Sie erwarten würden. (Themen, auf der anderen Seite, alle leben in dem gleichen Adressraum, weshalb Fäden Speicher in der gleichen Art und Weise sehen.)

Fenster der Fall ist, haben jedoch einen gemeinsam genutzten Speicherraum, die Sie müssen sehr vorsichtig sein, richtig zu verwalten. Jeder Prozess, der Raum, in dem gemeinsam genutzten Speicherraum reserviert ist verantwortlich für diesen Speicher explizit zu befreien. Dies steht im Gegensatz zu den lokalen Speicher, der mehr oder weniger verschwindet, wenn der Prozess stirbt.

Siehe dieser MSDN Probe Artikel für einige Ideen, wie Sie den freigegebenen Speicherplatz verwenden können über die Welt zu erobern. Er, Schnittstelle mit Legacy-Software. Oder was auch immer :) Viel Glück, was Sie am Ende tun!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top