• STATISTIQUES
  • Il y a eu un total de 2 membres et 13214 visiteurs sur le site dans les dernières 24h pour un total de 13 216 personnes!


    Membres: 2 433
    Discussions: 3 585
    Messages: 32 832
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] hax.tor
    50 level de challenges mélangés
    Challenges
    [EN] CS Tutoring Center
    Site de challenge spécialisé dans les challenges de programmation C++ et java cependant, d'autres langages pe...
    Challenges
    [FR] Developpez.net
    Un forum communautaire qui se veut pour les développeurs en générale. Avec presque 500 000 membr...
    Programmation
    [EN] Net Force
    Javascript: 9, Java Applets: 6, Cryptography: 16, Exploits: 7, Cracking: 14, Programming: 13, Internet: 15, Steganograph...
    Challenges
    [EN] Security Traps
    Site de challenge qui prétend être construit non pas dans le but de parfaire vos connaissances, mais plutôt dan...
    Challenges
    [FR] Microcontest
    Cryptographie: 7, Mathématiques: 8, Image Son Vidéo: 5, Intelligence artificielle: 3, Réseau: 2, Divers: 7, Phy...
    Challenges
    [FR] µContest
    µContest est un site de challenges de programmation, c'est à dire qu'il propose des épreu...
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C] Système de plugins "simpliste"
30-08-2012, 13h29 (Modification du message : 30-08-2012, 13h31 par supersnail.)
Message : #1
supersnail En ligne
É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 {
    int (*SumFunction) (int a, int b);
    void (*saySomething) (char *toSay);
} plugin_interface;
, mais libre à vous de rajouter d'autres fonctions (qu'il vous faudra malgré tout implémenter dans votre programme). L'initialisation de la structure devra se faire avant l'appel aux plugins (logique me direz-vous :p).

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
#define _DEF_H

typedef struct _plugin_int {
    int (*SumFunction) (int a, int b);
    void (*saySomething) (char *toSay);
} plugin_interface;

#endif

Le code du programme (program.c)

Code :
#include <stdio.h>
#include <dlfcn.h>

#include "def.h"

int sum (int a, int b) {
    printf ("Sum invoked by plugin : %d\n", (a + b));
    return a+b;
}

void saySomething ( char *something) {
    printf ("Plugin says: %s\n", something);
}

void main() {
    // Initialise les fonctions à emmener dans le plugin
    plugin_interface myFunc;
    myFunc.SumFunction = sum;
    myFunc.saySomething = saySomething;
    
    int handle = (int) dlopen("./wtf.so", RTLD_LAZY);
    printf ("Handle is %x\n", handle);
    int (*initPtr) (plugin_interface plug);
    initPtr = dlsym (handle, "plugin_init");
    if(!initPtr) {
        printf ("Plugin load failed\n");
    }
    else {
        initPtr(myFunc);
    }
}

Le code du plugin de test (wtf.c)

Code :
#include "def.h"

int plugin_init (plugin_interface plug) {
    plug.saySomething ("Hello from the what the fuck !");
    plug.SumFunction (21, 21);
    return 1;
}

Le Makefile

Code :
all: program.o wtf.o
    gcc -o program program.o -ldl
    gcc -o wtf.so -shared wtf.o
    
program.o: program.c
    gcc -c -o program.o program.c
    
wtf.o: wtf.c
    gcc -c -o wtf.o wtf.c

Edit: le code fonctionne juste pour GNU/Linux, pour les windowsiens, renseignez-vous sur les fonctions "LoadLibrary" et "GetProcAddress" Wink (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
+1 (0) -1 (0) Répondre
30-08-2012, 13h50
Message : #2
ark Hors ligne
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. Smile
Par contre le "void main()" c'est crade...
+1 (0) -1 (0) Répondre
30-08-2012, 13h51
Message : #3
supersnail En ligne
É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
+1 (0) -1 (0) Répondre
30-08-2012, 13h55
Message : #4
ark Hors ligne
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]
+1 (0) -1 (0) Répondre
30-08-2012, 14h31
Message : #5
b0fh Hors ligne
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 !
+1 (0) -1 (0) Répondre
30-08-2012, 14h39
Message : #6
supersnail En ligne
É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 Wink

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 Smile
Mon blog

Code :
push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp

"VIM est merveilleux" © supersnail
+1 (0) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut