2016-07-27 3 views
0

Ich muss auf die Programm-Header-Tabellen (oder alternativ zu den Abschnitts-Headern) eines Prozesses vom Kernel zugreifen, um die Adressen von .eh_frame- und .eh_frame_hdr-Abschnitten von einem Linux-Kernel-Modul zu finden. In Userspace würde ich dl_iterate_phdr() verwenden, aber ich brauche eine Kernel-Space-Lösung. Wenn möglich, müsste es nicht durch die Elf-Dateien gehen.Wie findet man den PHDR von dynamisch verknüpften/geladenen Bibliotheken von einem Kernelmodul?

Der Hilfsvektor hat das AT_PHDR-Feld, aber es hilft nicht, die PHDRs dynamisch verknüpfter/geladener Bibliotheken zu finden.

Meine andere Idee war es, auf den vm_areas zu iterieren, um die PHDR-Adresse von jeder Datei zu finden, die eine ausführbare mmap im Speicher der Aufgabe hat. Das Problem mit dieser Lösung ist, dass die Elf-Datei nach dem Laden geändert oder gelöscht werden kann.

Gibt es eine Möglichkeit, dies zu tun, die nur auf Speicher und nicht auf der Elf-Datei beruht?

Antwort

0

Es sieht so aus, als ob der Elf-Header (der den Datei-Offset zur phdr-Tabelle hat - oft der gleiche wie der Offset im Speicher) immer am Anfang von ausführbaren mmaps steht. Es scheint nicht wirklich zuverlässig zu sein, da ich keine Dokumentation über das Erscheinen des Ehdr finden konnte, aber es scheint in der Praxis vorhanden zu sein. Dies könnte daran liegen, dass es am Anfang von Elf-Dateien stehen muss und dass die Seitengröße und -ausrichtung das ausführbare Segment mit dem Offset 0x0 startet.

Wir können überprüfen, dass ausführbare Zuordnungen bei Offset 0x0 für alle laufenden Prozesse zu starten und geladene Objekt mit dieser bash Linie geteilt:

sudo cat /proc/*/maps | awk '{ print $2 " " $3 " " $6;}' | egrep '^..x.' | grep -vE '.... 0{8}' 

Es gibt alle ausführbaren Zuordnungen, die bei Offset 0x0 nicht gestartet werden, so dass keine Ausgabe bedeutet, dass die Ehdrs am Anfang ausführbarer vm_areas stehen.

Verwandte Themen