Comme une expérience j'essaie d'écrire le programme suivant qui me permet de générer du code pendant l'exécution. c'est-à-dire que je fais ce qui suit:Pointeurs de fonction dans VS-2010 (+ Appel Virtual Alloc)
1. Remplissez un tampon avec les op-codes des instructions que je veux exécuter.
2. Déclarez un pointeur de fonction et faites-le pointer vers le début du tampon.
3. Appelez la fonction en utilisant la fonction func-ptr ci-dessus.
Le code est le suivant: (. Mise à jour suivant les instructions ci-dessous AndreyT)
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
//#include <sys/mman.h>
int main(int argc, char *argv[])
{
int u32;
int (*ptr)(void);
uint8_t *buf = malloc(1000);
//uint8_t *buf = mmap(NULL, 1000, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
buf[0] = 0xb8;
u32= 42;
memcpy(buf + 1, &u32, 4);
buf[5] = 0xc3;
ptr = (int (*)(void)) buf;
printf("return is %d\n", ptr());
return 0;
}
Ce code compile bien sur une machine Linux en utilisant gcc.
Maintenant, je le migre vers windows (visual-studio-2010).
AFAIK, mmap fonctionnalité est fournie par VirtualAlloc et VirtualProtect sur les fenêtres.
J'ai parcouru MSDN et d'autres documents sur le net,
mais je n'arrive toujours pas à trouver un moyen d'exécuter ce programme sur VS-2010 sous Windows.
MISE À JOUR:
@AndreyT Merci. Cela semble fonctionner maintenant. Bien que je reçois l'erreur suivante:
1>MSVCRTD.lib(crtexew.obj) :
error LNK2019: unresolved external symbol [email protected] referenced in function ___tmainCRTStartup
1>file.exe : fatal error LNK1120: 1 unresolved externals
Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped
Je pense que je dois échanger l'appel mmap()
avec virtualAlloc()
maintenant.
Merci beaucoup à tous. Ensuite, je dois creuser dans MSDN pour virtualAlloc()
je suppose.
2600Hertz: Quelle est l'erreur que vous obtenez? –