1

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.

+0

2600Hertz: Quelle est l'erreur que vous obtenez? –

Répondre

2

Vous obtenez cette erreur car vous essayez de déclarer ptr au milieu du bloc.

Le langage C Classic ANSI (C89/90) n'autorise pas les déclarations au milieu du bloc. Les déclarations doivent se trouver au début du bloc. La déclaration des variables au milieu n'est autorisée que dans C99.

Le compilateur GCC, même en mode C89/90, permet de déclarer des variables au milieu comme une extension non standard. Le compilateur MSVC est un compilateur C89/90 strict, il ne permet pas de telles déclarations.

+0

Merci :) Maintenant, creuser dans MSDN pour la syntaxe d'appel virtualAlloc et args. Merci beaucoup!! – TheCodeArtist