4 votes

Pourquoi LD_PRELOAD fonctionne-t-il avec les appels de service ?

L'idée de LD_PRELOAD est de charger une bibliothèque partagée avant la bibliothèque partagée d'origine. mylib.so pour le charger avant libc.so Ainsi, lorsque le processus veut utiliser printf il recherche dans le so qui a été chargé un par un et le trouve dans mylib.so (parce que cette so a été chargé en premier) au lieu de libc.so Il utilise donc l'option printf en mylib.so au lieu de printf en libc.so .

Je comprends pourquoi cela fonctionne pour les fonctions qui sont mises en œuvre dans une so comme printf en libc.so .

Mais quand je veux m'accrocher write ou une autre fonction syscall pourquoi cela fonctionne-t-il ? Le processus ne recherche pas la fonction dans le so il va directement au noyau.

  1. Fait LD_PRELOAD fonctionne sur un binaire compilé statiquement ? Pourquoi ? Dans cette rediffusion https://stackoverflow.com/a/13866611 a mentionné que LD PRELOAD Ne fonctionne pas sur les systèmes binaires statiques.

  2. Pourquoi les LD_PRELOAD fonctionne sur un binaire compilé dynamiquement pour faire des crochets sur les appels de service ?

L'architecture est ARM.

7voto

Marco Bonelli Points 4003

Le processus ne recherche pas la fonction dans le so il va directement au noyau.

Faux, les fonctions syscall que vous utilisez ( read() , write() , ...) sont tous des libc enveloppes autour des véritables appels de service, même les appels génériques. syscall() fonction. Voici le code pour les write() par exemple. La seule façon d'entrer directement dans le noyau à partir de votre programme est de lancer manuellement un appel de système (voir comment ci-dessous).

Fait LD_PRELOAD fonctionne-t-il sur un binaire compilé statiquement ? Pourquoi ?

Non, ce n'est pas le cas. Un binaire statique n'a pas besoin de résoudre un symbole dynamiquement, et le chargeur dynamique n'est donc pas invoqué pour résoudre les symboles habituels des fonctions de la bibliothèque.

Pourquoi les LD_PRELOAD fonctionne sur un binaire compilé dynamiquement pour faire des crochets sur les appels de service ?

Parce que ce sont des fonctions normales de libc, ni plus ni moins.


La seule façon d'appeler manuellement un syscall sans passer par la bibliothèque C (et donc sans faire de résolution de symboles) autre que la compilation statique est d'utiliser l'option assemblage en ligne . Vous pouvez consulter man 2 syscall pour connaître les registres et les instructions à utiliser. Sur ARM AArch64 par exemple, vous pouvez invoquer un syscall en chargeant le numéro du syscall dans le registre x8 , les paramètres dans x0 à travers x5 puis en exécutant la commande svc #0 l'instruction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X