Frage

Also alles einfach ich will, ist zu tun, ein Ruby-Programm, das einige Werte aus bekannter Speicheradresse liest in einem anderen virtuellen Speichern des Prozesses. Durch meine Forschung und Grundkenntnisse in der hex eines laufenden Prozesses des x86-Baugruppe im Speicher bearbeitet, habe ich die Basisadresse und Offsets für die Werte im Speicher Ich mag gefunden. Ich will nicht, um sie ändern; Ich will nur, um sie zu lesen. Ich bat um einen Entwickler eines Speicher Editor wie diese abstrakte Sprache zu nähern und eine Windows-Plattform übernehmen. Er sagte mir, die Win32API fordert Open, Createprocess, Readprocessmemory und Write waren die Art und Weise unter Verwendung von entweder C oder C ++ zu gehen. Ich denke, dass die Art und Weise wäre zu gehen, nur die Win32API-Klasse und die Abbildung zwei Instanzen davon; Eine entweder für Open oder Createprocess, je nachdem, ob der Benutzer bereits ten Prozeß läuft oder nicht, und eine andere Instanz wird Readprocessmemory abgebildet werden. Ich wahrscheinlich immer noch die Funktion für das Erhalten der Liste der laufenden Prozesse finden müssen, damit ich weiß, welcher Prozess läuft derjenige ist, ich will, wenn es bereits ausgeführt wird.

Dies würde einige Arbeit alle zusammen zu stellen, aber ich bin Bezifferung es nicht so schlimm bis zu Code wäre. Es ist nur ein neuer Bereich für mich zu programmieren, da ich noch nie dieses niedrige Niveau von einer Hochsprache gearbeitet (na ja, höheres Niveau als C sowieso). Ich frage mich nur an den Möglichkeiten, dies zu nähern. Ich konnte nur ein paar oder Win32API Anrufe verwenden, aber das Mittel mit einem Bündel von String und Array-Pack beschäftigen und Auspacken das ist systemabhängig Ich möchte schließlich diese Arbeit Cross-Plattform machen, da den Prozess, den ich aus lese aus produziert eine ausführbare Datei, die mehrere Plattform hat aufbaut, (ich die Speicheradresse ändert sich von System zu System kennen. die Idee ist, eine flache Datei zu haben, die alle Zuordnungen Speicher enthält so das Ruby-Programm kann nur die aktuelle Plattform-Umgebung an die entsprechende Speicherzuordnung entsprechen. ), aber von den Blicken der Dinge werde ich nur eine Klasse machen müssen, dass Wraps, was auch immer die aktuelle Plattform des Systems ist Bibliotheksspeicher bezogene Funktionsaufrufe geteilt.

Für alles, was ich weiß, könnte es existiert bereits ein Ruby-Juwel, das für mich kümmert all dies nimmt, dass ich einfach nicht finden. Ich könnte auch versuchen, für jeden Build die ausführbaren Dateien der Bearbeitung, um es so, wenn die Speicherwerte I aus lesen möchten durch den Prozess geschrieben, sondern auch eine Kopie des neuen Wertes in einen Raum in dem gemeinsamen Speicher schreibt, dass ich irgendwie haben Ruby macht eine Instanz einer Klasse, die ein Zeiger unter der Haube auf die freigegebenen Speicheradresse ist und irgendwie mit dem Ruby-Programm signalisieren, dass der Wert wurde aktualisiert und neu geladen werden soll. Im Grunde ein Interrupt-basierte System wäre schön, aber da der Zweck diesen Wertes des Lesens nur zu einer Anzeigetafel von einem zentralen Server übertragen zu senden, konnte ich nur Stick auf eine Abfrage basierten System, das Updates in festen Zeitintervallen sendet. Ich könnte auch einfach im Stich lassen Rubin zusammen und gehen für C oder C ++, aber ich weiß nicht, diese ebenfalls fast. Ich weiß eigentlich mehr x86 als C ++ und ich weiß nur, C, soweit systemunabhängige ANSI C und noch nie mit gemeinsamen Systembibliotheken behandelt.

So ist es ein Juwel oder weniger bekannte Modul zur Verfügung, die dies bereits getan hat? Wenn nicht, dann alle zusätzlichen Informationen, wie dies zu erreichen, wäre schön. Ich denke, lange Geschichte kurz, wie mache ich das alles?

Vielen Dank im Voraus, Grg

PS:. Auch eine Bestätigung, dass diese Win32API Anrufe an der kernel32.dll Bibliothek ausgerichtet sein sollten wäre schön

War es hilfreich?

Lösung

Hier finden Sie aktuelle win32utils . Ich denke, dass zumindest sollten Sie auf die Füße bekommen, und geben Sie Beispiele dafür, wie in den api selbst zu graben, wenn die Edelsteine ??sich für Sie nicht funktionieren. Möglicherweise müssen Sie den sauren Apfel beißen und ein Modul in C schreiben.

Andere Tipps

Verwenden Rubin-FFI:

Wenn Sie C und die Win32-API kennen, dann Sie finden es möglicherweise einfacher zu bedienen Ruby-FFI gem. Ruby-FFI wickelt C-Funktionen transparent, so dass Sie jede Win32-Funktion verwenden.

Für namens Shared Memory bietet Win32 CreateFileMapping( ) und MapViewOfFile( ).

Diese haben die Header

# WINBASEAPI HANDLE WINAPI CreateFileMappingA(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR);
# WINBASEAPI PVOID WINAPI MapViewOfFile(HANDLE,DWORD,DWORD,DWORD,DWORD);

Mit dem in einer ungültigen Datei-Handle 0xFFFFFFFF in CreateFileMapping geben, können Sie mit Dateien überhaupt vermeiden tun haben, und einfach gemeinsam genutzten Speicher definieren Arrays und Zeiger verwendet wird.

Im Folgenden ist ein vereinfachtes Beispiel, das aus dem gemeinsamen Speicher liest. (A Fertigungsqualität Version verwenden würde Semaphore in dem Leser und Schreiber, und ein Ringpuffer, beiden Prozesse zu ermöglichen, asynchron ablaufen, während nach wie vor gewährleistet, dass der Autor nicht einen Puffer nicht überschreibt, bis der Leser beendet hat es zu lesen.)

Simplified Ruby-Beispiel:

require 'ffi'

module Win32
   extend FFI::Library
   ffi_lib 'kernel32'  # see winbase.h
   attach_function :CreateFileMapping, 
            :CreateFileMappingA,[ :uint, :pointer, :long, :long, :long, :pointer ], :pointer   
            # suffix A indicates the ASCII version
   attach_function :MapViewOfFile, 
            :MapViewOfFile,[ :pointer, :long, :long, :long, :long ], :pointer  
end

memoryName = "Share Memory Name"
sz_buf = 1000  # bytes  (250 ints, 4 bytes each)
num_ints = sz_buf / 4

# Windows constants
PAGE_READWRITE = 0x0004
FILE_MAP_WRITE = 2

# Get handle to shared memory
hMemory = Win32.CreateFileMapping(0xFFFFFFFF, nil, PAGE_READWRITE, 0, sz_buf, memoryName)

# Create pointer into shared memory in the reader's memory space 
pMemory = FFI::MemoryPointer.new(:int, num_ints )
pMemory = Win32.MapViewOfFile(hMemory, FILE_MAP_WRITE, 0, 0, sz_buf)

# Read from shared memory buffer
puts pMemory.read_array_of_int(sz_buf).join(" ")  

Einige nützliche Informationen:

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