Existe-t-il un meilleur moyen que d’parsingr / proc / self / maps pour déterminer la protection de la mémoire?

Sous Linux (ou Solaris), y a-t-il un meilleur moyen que l’parsing syntaxique /proc/self/maps plusieurs resockets pour savoir si vous pouvez lire, écrire ou exécuter tout ce qui est stocké dans une ou plusieurs adresses en mémoire?

Par exemple, dans Windows, vous avez VirtualQuery .

Sous Linux, je peux mprotect pour changer ces valeurs, mais je ne peux pas les lire.

En outre, existe-t-il un moyen de savoir quand ces permissions changent (par exemple, si quelqu’un utilise mmap sur un fichier derrière mon dos), en utilisant ptrace sur tous les threads du processus et en interceptant toute tentative de rendre un syscall affecter la carte mémoire?

Mettre à jour:

Malheureusement, j’utilise ceci dans un JIT qui contient très peu d’informations sur le code qu’il exécute pour obtenir une approximation de ce qui est constant. Oui, je me rends compte que je pourrais avoir une carte constante de données mutables, comme la page vsyscall utilisée par Linux. Je peux me fier à l’hypothèse que tout ce qui n’est pas inclus dans l’parsing initiale est mutable et dangereux, mais je ne suis pas entièrement satisfait de cette option.

En ce moment, je lis /proc/self/maps et construis une structure que je peux rechercher binary pour la protection d’une adresse donnée. Chaque fois que j’ai besoin de savoir quelque chose à propos d’une page qui n’est pas dans ma structure, je relis / proc / self / maps en supposant qu’il a été ajouté entre-temps ou je suis sur le sharepoint commettre une erreur de toute façon.

Il semble juste que l’parsing du texte pour obtenir cette information et ne pas savoir quand elle change est extrêmement pénible. ( /dev/inotify ne fonctionne pratiquement pas dans /proc )

    Je ne connais pas l’équivalent de VirtualQuery sous Linux. Mais d’autres façons de le faire, qui peuvent ou non fonctionner, sont les suivantes:

    • vous configurez un gestionnaire de signal qui intercepte SIGBUS / SIGSEGV et vous continuez à lire ou à écrire. Si la mémoire est protégée, votre code de capture de signal sera appelé. Si ce n’est pas votre code de piégeage de signal n’est pas appelé. De toute façon, vous gagnez.

    • vous pouvez suivre chaque fois que vous appelez mprotect et créer une structure de données correspondante qui vous aide à savoir si une région est protégée en lecture ou en écriture. C’est bien si vous avez access à tout le code qui utilise mprotect .

    • vous pouvez surveiller tous les appels mprotect dans votre processus en liant votre code à une bibliothèque redéfinissant la fonction mprotect . Vous pouvez ensuite créer la structure de données nécessaire pour savoir si une région est protégée en lecture ou en écriture, puis appeler le système de protection pour définir réellement la protection.

    • vous pouvez essayer d’utiliser /dev/inotify et surveiller le fichier /proc/self/maps pour toute modification. Je suppose que celui-ci ne fonctionne pas, mais devrait en valoir la peine.

    Il y a une sorte de / was / proc / [pid | self] / pagemap, de la documentation dans le kernel, des mises en garde ici: https://lkml.org/lkml/2015/7/14/477 Donc ce n’est pas complètement inoffensif .. .