Est-il possible de charger un fichier binary en mémoire et de l’exécuter dans Windows

J’essaie d’écrire un programme pour lire un fichier binary à partir de la mémoire, l’exécuter et le quitter, mais le système d’exploitation ne semble pas me laisser l’exécuter de la mémoire. Le but de cet exercice est de charger un fichier binary sans en-tête dans la mémoire. .

Ceci est mon code pour le fichier binary:

push eax mov eax,3 mov edi,eax sub eax,edi pop eax leave ret 

Et mon chargeur est comme suit:

 int main(int argc, char **argv){ void (*ptr)(void); FILE *fo = fopen(argv[1],"r"); int l = fseek(fo,0,SEEK_END); fread((void*)ptr,l*sizeof(char),1,fo); ptr(); return 0; } 

Je sais que j’y vais probablement de la mauvaise façon.

Bien que le code que vous avez montré soit indépendant de l’emplacement, il peut donc être exécuté n’importe où, ce n’est pas le cas de la mémoire allouée pour les données. Les versions actuelles des systèmes d’exploitation appliquent la protection d’access à la mémoire en refusant explicitement l’exécution sur la mémoire de données. Mais tout d’abord, il y a une grosse erreur dans votre programme, vous n’avez défini aucune mémoire pour le code que vous voulez charger:

 void (*ptr)(void); //This allocates only space for a function pointer, but no memory 

Lors de la lecture des données sur le disque, il sera écrit quelque part dans la mémoire, ce qui déclenchera une erreur d’access à la mémoire. Pour obtenir de la mémoire exécutable à partir du système d’exploitation, vous pouvez utiliser des fonctions en tant que VirtualAlloc , puis rendre la mémoire allouée exécutable à l’aide d’autres fonctions en tant que VirtualProtect . Ensuite, vous devez affecter à votre pointeur de fonction l’adresse de la mémoire exécutable et lire à ce moment-là le code à partir du disque. Ce processus est souvent utilisé pour les programmes malveillants ou l’injection de code, et peut fonctionner pour des processus locaux ou distants, c’est pourquoi je ne donnerai pas une meilleure explication. La curiosité est bonne, mais … 😉

C’est possible? Oui. Mais comme les gens l’ont commenté, il y a beaucoup plus à faire que ce que vous êtes en train de faire (même en ignorant la faute de segment en attente dans votre code). Entre autres choses, vous devez savoir que Visual Studio (au moins) construit des programmes qui, par défaut, sont explicitement empêchés d’exécuter des “données”. Voir la documentation sur l’indicateur / NXCOMPAT et la prévention de l’exécution des données.