• STATISTIQUES
  • Il y a eu un total de 0 membres et 22524 visiteurs sur le site dans les dernières 24h pour un total de 22 524 personnes!
    Membres: 2 605
    Discussions: 3 579
    Messages: 32 816
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Root-me
    Script: 5, Système: 20, Cracking: 16, Cryptanalyse: 17, Programmation: 8, Réaliste: 11, Réseau: 10, Stéganog...
    Challenges
    [EN] Rosecode
    Programming: 36, Math: 29, Probability: 5, Sequence: 7, Crypto: 4, Brainf**k: 13, TimeRace: 4, Hack: 9
    Challenges
    [EN] Rankk
    Site de challenge construit sur le principe d'une pyramide à 9 level. Level 1: 60,Level 2: 72,Level 3: 68,Lev...
    Challenges
    [EN] Gekko
    Site de challenge présenter sous la forme d'une quête. Vous êtes un agent secret qui répond sous le nom...
    Challenges
    [EN] Exploit-db
    Une base de données d'exploits triés par genre (GHDB, Remote, Local, Web, DOS, ShellCode) à ...
    Vulnérabilités
    [EN] Packet Storm
    Packet Storm est un site qui combine nouvelles de la sécurité informatique, téléchargemen...
    Vulnérabilités
    [EN] This is legal
    Basic: 10, Realistic: 5, Programming: 1, Bonus: 11, SQL: 2, Encryption: 6, Application: 4, User Contributed: 3
    Challenges

  • 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 Hors ligne
Éleveur d'ornithorynques
*******



Messages : 1,609
Sujets : 71
Points: 465
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


Messages dans ce sujet
[C] Système de plugins "simpliste" - par supersnail - 30-08-2012, 13h29

Atteindre :


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