[C] Système de plugins "simpliste"
|
30-08-2012, 13h29
(Modification du message : 30-08-2012, 13h31 par supersnail.)
Message : #1
|
|
supersnail
Éleveur d'ornithorynques Messages : 1,614 Sujets : 72 Points: 466 Inscription : Jan 2012 |
[C] Système de plugins "simpliste"
Bonjour,
Je partage ici une petit système de "plugins" que j'ai développé en bidouillant un peu avec le C. Cependant avant de balancer directement le code, quelques petites explications s'imposent. I - Fonctionnement général Le plugin est ici une bibliothèque "liée dynamiquement", c'est-à-dire une DLL sous Windows, ou un .so sous GNU/Linux, qui sera chargée dynamiquement par le programme (via les fonctions LoadLibrary/GetProcAddress sous Windows, ou dlopen/dlsym sous GNU/Linux). Ce programme appelle ensuite la fonction plugin_init, qui prend pour argument une structure nommée plugin_interface. Cette structure est comparable à une interface C++, c'est-à-dire des pointeurs vers des fonctions. Pour mon programme de test, ma structure ressemble à ceci: Code : typedef struct _plugin_int { Maintenant, pourquoi tout ce bazar fonctionne ? La réponse est relativement simple. En réalité, le plugin est chargé dans l'espace mémoire du processus, ainsi il peut accéder à la mémoire de celui-ci (et par le fait, manipuler ses données). Le code (machine) résidant lui aussi en mémoire, notre plugin y a aussi accès, et il peut ainsi exécuter les fonctions de notre programme hôte (qui sera traduit en assembleur par un "call eax", eax contenant l'adresse de la fonction à appeler). II - Le code Le fichier "def.h" (à inclure dans chacun des plugins) Code : #ifndef _DEF_H Le code du programme (program.c) Code : #include <stdio.h> Le code du plugin de test (wtf.c) Code : #include "def.h" Le Makefile Code : all: program.o wtf.o Edit: le code fonctionne juste pour GNU/Linux, pour les windowsiens, renseignez-vous sur les fonctions "LoadLibrary" et "GetProcAddress" (la MSDN est votre amie)
Mon blog
Code : push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp "VIM est merveilleux" © supersnail |
|
30-08-2012, 13h50
Message : #2
|
|
ark
Psyckomodo! Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
RE: [C] Système de plugins "simpliste"
C'est très intéressant tout ça, le fonctionnement est facile a mettre en place, c'est pas mal.
Par contre le "void main()" c'est crade... |
|
30-08-2012, 13h51
Message : #3
|
|
supersnail
Éleveur d'ornithorynques Messages : 1,614 Sujets : 72 Points: 466 Inscription : Jan 2012 |
RE: [C] Système de plugins "simpliste"
Je sais, mais c'est juste un PoC que j'ai pondu là :p (le code "en l'état" est dégueulasse et j'en assume l'entière responsabilité ^^)
Mon blog
Code : push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp "VIM est merveilleux" © supersnail |
|
30-08-2012, 13h55
Message : #4
|
|
ark
Psyckomodo! Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
RE: [C] Système de plugins "simpliste"
s'pece de sale porc! :p
Bon, faut vraiment que je code un truc intéressant a poster moi x] |
|
30-08-2012, 14h31
Message : #5
|
|
b0fh
Membre actif Messages : 210 Sujets : 17 Points: 309 Inscription : Jul 2012 |
RE: [C] Système de plugins "simpliste"
Il manque un mécanisme pour permettre au programme principal d'appeler des fonctions du plugin (ce qui est peut-être plus fréquent que l'inverse.)
On pourrait répéter les dlopen() pour obtenir plusieurs symboles, mais autant ajouter un 2e struct pour les appels dans l'autre sens ! |
|
30-08-2012, 14h39
Message : #6
|
|
supersnail
Éleveur d'ornithorynques Messages : 1,614 Sujets : 72 Points: 466 Inscription : Jan 2012 |
RE: [C] Système de plugins "simpliste"
En effet, mais comme je l'ai dit, c'est plus un bout de code expérimental qu'un gestionnaire de plugin fiable
Enfin, on peut laisser des fonctions dans l'API qui permet d'enregistrer des "hooks" si besoin (ce qui évite de devoir concevoir une deuxième structure de données), que le programme principal appellera
Mon blog
Code : push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp "VIM est merveilleux" © supersnail |
|
« Sujet précédent | Sujet suivant »
|
Utilisateur(s) parcourant ce sujet : 1 visiteur(s)