2016-12-18 3 views
3

Je souhaite créer une interface dans un programme c qui s'exécute sur un système embarqué. Cela devrait accepter un bytecode qui représente une fonction c. Ce code sera ensuite chargé dans la mémoire et exécuté. Ce sera alors quelque chose comme injecter à distance le code dans une application en cours d'exécution. La seule différence ici est que je peux implémenter, ou changer le code courant et fournir une interface. Le tout devrait être utilisé pour injecter du code de test sur un système cible.Comment puis-je injecter ou charger dynamiquement une fonction c dans un autre programme c?

Mon problème actuel est que je ne sais pas comment construire un tel code octet à partir d'une fonction c existante. Mapper et exécuter ce n'est pas un problème si je connaissais l'adresse de début de la fonction.

Actuellement, je travaille avec Ubuntu à des fins de test, cela me permet d'essayer certaines techniques qui ne sont pas possibles dans le système embarqué (selon les librairies manquantes du système d'exploitation).

  • Je construis un objet partagé et utilisé dlopen() et dlsym() pour exécuter cette fonction. Cela fonctionne bien, le problème est que je n'ai pas de telles fonctions dans le système embarqué. J'ai lu quelque chose sur le chargement d'un objet partagé dans la mémoire et l'exécuter, mais je n'ai pas pu trouver d'exemples pour cela. (voir http://www.nologin.org/Downloads/Papers/remote-library-injection.pdf)

  • J'ai également pris un code simple octet qui vient d'imprimer bonjour monde dans stdout. J'ai stocké ce code dans la mémoire en utilisant mmap() et l'exécuter. Cela a également bien fonctionné. Ici, le problème est que je ne sais pas comment créer un tel code d'octet, je viens d'utiliser un exemple de bonjour à travers Internet. J'ai également trouvé quelque chose ici: https://stackoverflow.com/a/12139145/2479996 qui a très bien fonctionné. Mais ici, j'ai besoin d'un script d'éditeur de liens supplémentaire, déjà pour un programme aussi simple.

  • En outre j'ai regardé cet article: https://stackoverflow.com/a/9016439/2479996 Selon cette réponse mon problème serait résolu avec le "projet X11". Mais je n'ai pas vraiment trouvé grand-chose à ce sujet, peut-être que certains d'entre vous peuvent me fournir un lien.

Existe-t-il une autre solution pour faire cela? Ai-je manqué quelque chose? Ou quelqu'un peut-il me fournir une autre solution à cela? J'espère que je n'ai pas manqué quelque chose.

Merci d'avance

+2

C'est extrêmement compliqué à faire, et les détails dépendront du système embarqué que vous utilisez. –

+0

Trop large et une très mauvaise idée. Vous voulez rendre les bot-nets des appareils IoT encore plus faciles? – Olaf

+0

Je ne comprends pas comment ce que vous voulez faire est différent d'un bootloader. Pourquoi votre code d'octet ne peut-il pas être simplement le code compilé lui-même? Vous pouvez extraire une fonction compilée à partir d'un fichier .o. –

Répondre

1

Je ne vois pas de solution facile. Le plus proche que je sache est GCC's JIT backend (libgccjit). Here est un article de blog à ce sujet. Comme alternative, vous pouvez utiliser un langage de script pour ce code qui doit être injecté. Par exemple, ChaiScript ou Lua. Dans this question, il y a un résumé des options. Comme vous utilisez un périphérique intégré, les frais généraux peuvent être importants.

Si l'utilisation d'un backend basé sur LLVM au lieu de GCC est possible, vous pouvez jeter un oeil à Cling. C'est un interpréteur C++ basé sur LLVM et Clang. Dans mon expérience personnelle, ce n'était pas toujours stable, mais il est utilisé dans la production au CERN. Je voudrais sauf que les fonctionnalités de compilation dynamique sont plus avancées dans LLVM que dans GCC.