2009-10-17 5 views
2

J'ai des données binaires qui contiennent un tas de fonctions et que vous voulez appeler. Je connais la signature de ces fonctions avec le décalage relatif au début du fichier. La convention d'appel est la convention par défaut: __cdecl. Le fichier était déjà chargé dans une page de mémoire avec des autorisations d'exécution.Comment appeler une fonction à partir de données binaires

Par exemple (A, B, C étant certains types)

void myFunction (A *arg1, B arg2, C arg3); // Signature 
int myOffset = 0x42; // Offset 

Comment puis-je préciser que myOffset points myFunction?

+0

Je ne suis pas un expert, mais je pense que si vous appelez une fonction __cdecl, la pile fuira si votre programme attend __stdcall. La valeur par défaut doit être __stdcall –

+0

__stdcall est utilisé pour les fonctions WINAPI. __cdecl est la norme pour les autres fonctions. Voir http://msdn.microsoft.com/en-us/library/zkwh89ks(VS.80).aspx – Etan

+0

@Etan J'ai un problème similaire, je me demandais comment vous avez obtenu le décalage de toutes les routines ... s'il vous plaît aider! –

Répondre

6
// define a function pointer 
typedef __cdecl void (*your_function) (A *arg1, B arg2, C arg3); 
your_function ftr; 

char * memory = 0x123456; // base segment address 

fptr = (your_function)(memory + 0x42); //calculate memory address 

(*ftpr)(a,b,b); // call function 
1
((void(*)(A*,B,C))0x42)(a,b,c); 

Ou quelque chose comme ça. Toujours eu des problèmes pour obtenir cela à la première fois. C'est si je comprends bien votre question, de toute façon.

4

Je ne suis pas sûr de ce que vous demandez. Je suppose que vous essayez de déclarer un pointeur de fonction et affectez un pointeur de fonction à une adresse arbitraire.

Déclarer un pointeur de fonction,

void (*p)(A*,B,C); 

pour lui assigner,

p = (void (*)(A*,B,C)))0x42; 

Pour appeler la fonction,

p(a,b,c) or (*p)(a,b,c); 
3

Pour la question elle-même: il vous suffit de besoin d'ajouter l'adresse en mémoire, vous chargé le binaire à. C'est à dire. Si vous avez chargé le binaire à l'adresse myLoadAddress ajoutez simplement cela à myOffset. Cela ne vous permettra pas d'appeler facilement la fonction, cependant. Si vous voulez faire cela, vous devriez le traiter comme un fichier de bibliothèque (et s'il s'agit en fait d'un fichier de bibliothèque vérifier une fonction système pour charger des bibliothèques comme LoadLibrary sur Windows, puis utiliser GetProcAddress pour récupérer un pointeur vers la fonction).

// create a type for your function signature 
typedef void (*myFunc)(A *arg1, B arg2, C arg3); 
// create a pointer to your function 
myFunc myFuncPointer; 
// set the address of the function in memory 
myFuncPointer = myLoadAddress + myOffset; 
// invoke function 
myFuncPointer(A, B, C); 

Lors du chargement d'une DLL que vous chargez à l'aide LoadLibrary, puis utilisez GetProcAddress et typecast l'adresse retournée à votre pointeur de fonction - à savoir myFuncPointer = (myFunc)GetProcAddress(hmodule, "myFunc"); dans l'exemple. Sur POSIX, cela fonctionne à peu près de la même façon, mais les fonctions sont légèrement différentes: utilisez dlopen pour charger la bibliothèque dynamique et dlsym pour récupérer le symbole. Le Programming Library Howto décrit ceci plus en détail, ou voir les pages man pour dlopen et dlsym. Les bases sont les mêmes.

+0

+1 pour un excellent exemple, si vous êtes familier avec posix, vous devriez mettre à jour votre réponse – mtasic85

Questions connexes