pages virtuelles protégées en écriture, intercepte l'écriture
-
03-07-2019 - |
Question
Existe-t-il un moyen d’attraper une écriture dans une page protégée en écriture?
Je prévois de créer un système d’objets semblable à celui de l’autre, où vous copiez l’objet pour l’instancier. (parce que cela semble simple et compact comparé au reste) Évidemment, les objets créés à cet effet doivent être protégés en écriture d'une manière ou d'une autre. J'ai vu qu'il y avait un moyen de signaler quelque chose de protégé en écriture à partir des en-têtes de programme dans le fichier ELF. (Drapeaux RE, RWE, RW)
Est-ce que cela fournit une protection en écriture? Je me souviens qu'il devrait y avoir une erreur de segmentation, est-ce vrai? Comment attraper l'écriture dans une page protégée en écriture. Est-ce un bon moyen de mettre en œuvre ce que je veux et existe-t-il un meilleur moyen?
La solution
Oui, vous pouvez utiliser mprotect .
Oui, une écriture dans une mémoire protégée provoquera une erreur de segmentation. Vous pouvez installer un gestionnaire, par exemple en C ++:
std::signal(SIGSEGV, my_segv_handler_func);
C’est une façon plausible de faire ce que vous voulez, bien que vous deviez ajouter beaucoup de ressources de gestion supplémentaires pour que cela fonctionne. Par exemple, ce type de détection d'écriture se fait dans le matériel, et sur les architectures x86, vous avez une taille de page de 4 ko. Ainsi, vous pouvez protéger des éléments 4k à la fois, alignés sur des limites de 4k - et non d’un générique "commencez à l’adresse X et passez à N octets". Je crois que tu devrais soit
- mapper des objets sur des pages de sorte que vous puissiez identifier si un écrire sur une page est une écriture sur un objet protégé particulier, ou
- rouler votre propre malloc qui toujours alloue sur 4k limites, ce qui vous obligerait à utiliser un taille de bloc d'allocation minimale de 4k
Je ne sais pas par coeur s'il y a une meilleure façon, mais ça a l'air amusant de jouer avec. :)