Unter Linux (oder Solaris) gibt es einen besseren Weg als Hand /proc/self/maps
wiederholt zu analysieren, ob Sie lesen, schreiben oder ausführen können, was an einer oder mehreren Adressen im Speicher gespeichert ist?Gibt es einen besseren Weg als das Analysieren von/proc/self/maps, um den Speicherschutz herauszufinden?
Zum Beispiel haben Sie in Windows VirtualQuery
.
In Linux kann ich mprotect
diese Werte ändern, aber ich kann sie nicht zurück lesen.
Darüber hinaus ist es eine Möglichkeit, zu wissen, wann diese Berechtigungen ändern (zB wenn jemand mmap
auf eine Datei hinter meinem Rücken verwendet) als etwas schrecklich invasive und mit ptrace
auf alle Threads im Prozess zu tun und das Abfangen jeden Versuch zu machen a syscall
, die die Speicherabbildung beeinträchtigen könnte?
Update:
Leider bin ich mit diesen innerhalb eines JIT, die sehr wenig Informationen über den Code hat es ausgeführt wird eine Annäherung zu bekommen, was konstant ist. Ja, ich weiß, dass ich eine konstante Karte veränderbarer Daten haben könnte, wie die von Linux verwendete vsyscall-Seite. I kann sicher auf eine Annahme zurückfallen, dass alles, was nicht in der ersten Analyse enthalten ist, veränderlich und gefährlich ist, aber ich bin nicht ganz glücklich mit dieser Option.
Gerade jetzt, was ich tue, lese ich /proc/self/maps
und baue eine Struktur, die ich für den Schutz einer gegebenen Adresse binär durchsuchen kann. Jedes Mal, wenn ich etwas über eine Seite wissen muss, die nicht in meiner Struktur ist, lese ich/proc/self/maps erneut, vorausgesetzt, dass es in der Zwischenzeit hinzugefügt wurde, oder ich würde sowieso segfault werden.
Es scheint nur, dass das Parsen von Text, um an diese Informationen zu gelangen und nicht zu wissen, wann es sich ändert, schrecklich ist. (/dev/inotify
funktioniert nicht auf so ziemlich alles in)
Zu der Zeit, Ich bekomme eine SIGSEGV es ist zu spät. Ich muss wissen, ob einige Daten konstant sind, um zu wissen, dass ich "sicher" konstant durch sie falten kann. Mit geeigneten Hacks für konstante mmap'ed nicht konstante Daten und die vsyscall Seite. –