2009-02-27 10 views
3

Ich versuche, mprotect API auf MacOSX 10.4 (Tiger) zu verwenden, habe ich versucht, jede mögliche Weise, die ich weiß, gibt immer -1, mit errno 13, was "Erlaubnis verweigert" bedeutet, während ich Ich versuche, die Schreibberechtigung zu einem ausführbaren Code hinzuzufügen.mprotect API unter OS X Tiger

Der gleiche Code funktioniert genau auf MacOS X 10.5 (Leopard).

der Code ist ziemlich einfach

int ret = mprotect((void*)pFunc, 4096, PROT_WRITE | PROT_EXEC); 

pFunc wo die Adresse von jeder Funktion in dem Prozessadressraum geladen wird. Ich habe versucht, die PROT_EXEC vor dem Hinzufügen des Zugriffsrechts PROT_WRITE zu entfernen, aber kein Glück. Ich versuchte auch, pFunc mit der Speicherseitengröße auszurichten, kein Glück weder ..

Irgendeine Idee, wie man das funktioniert?

+0

+1, hatte ich das gleiche genaue Problem und schließlich nur OSX aus meiner Liste der unterstützten. –

+0

Zeigen Sie das vollständige Programm, das ein Problem verursacht. – stepancheg

Antwort

0

Ich weiß nichts über OSX. Das heißt, können Sie die Mach-Funktion verwenden vm_protect?

+0

vm_protect gibt KERN_PROTECTION_FAILURE zurück, da der neue Schutz den maximalen Schutz über den vorhandenen maximalen Schutz hinaus erhöht hat. Ich weiß nicht, wie ich den "Standard" -Maximumschutz ändern soll. –

+0

durch vmmap zu verarbeiten, sehe ich, dass die virtuelle Speicher-Seite, die pFunc enthält r-x maximale Berechtigung, während ich andere ausführbare virtuelle Speicherseiten haben rwx Erlaubnis, jede Idee, wie dies für meine ausführbaren Seiten zu ändern? Danke für den Fortschritt –

0

Sie sind nicht berechtigt, in ausführbare Bereiche zu schreiben. Wie auch immer, warum solltest du?

Ich bin mir sicher, dass dies auf einigen Plattformen funktioniert, aber nicht alle. Was versuchst du zu machen?

+0

Ich habe die Erlaubnis, in ausführbare Regionen auf Leopard (das ist sicherer, .. etc) zu schreiben. Ich versuche etwas zu tun, was Microsoft-Umleitungen auf Windows tun. –

1

Ist der Speicher, den Sie versuchen, mmap'd von der ausführbaren Datei zu ändern? Die Manpage für mprotect (unter Linux) scheint anzuzeigen, dass dies verhindern würde, dass Sie den Speicherort ändern (PROT_WRITE).

0

Hier ist eine andere Idee. Markieren Sie EXEC ohne WRITE. Ich denke, dass das Ablehnen von Write + Exec ein Sicherheitsmerkmal sein kann.

Um es dann zu schreiben, markieren Sie es als WRITE, aber nicht als EXEC.