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


  • ANNUAIRE
  • [EN] osix
    Site de challenge qui utilise un système de level on chaque épreuve doit être réussie avant d'accédÃ...
    Challenges
    [EN] Defcon
    Lancé en 1992 par Dark Tangent, DEFCON est la plus ancienne et la plus grande conférence underground de...
    Hacking
    [EN] Bright Shadows
    JavaScript: 13, Exploit: 27, Crypto: 69, CrackIt: 52, Stegano: 67, Flash: 3, Programming: 16, Java-Applet: 10, Logic: 20...
    Challenges
    [FR] Kalkulators
    Ce projet a plusieurs buts, le premier étant l’étude de toutes formes cryptographiques, le cot&ea...
    Cryptographie
    [EN] social-engineer
    Site dédié au Social Engineering en général.
    Hacking
    [EN] Astalavista
    JavaScript: 1, Exploit: 2, Crypto: 34, CrackIt: 15, Stegano: 8, Programming: 12, Logic: 36, Special: 6, Science: 4, Info...
    Challenges
    [FR] Newbie Contest
    Crackme: 35, Cryptographie: 49, Hacking: 27, Javascript/Java: 17, Logique: 31, Programmation: 23, Stéganographie: 53
    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 : 4 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut