2011-06-15 5 views
2

Donc, je voudrais charger un ensemble d'instructions d'assemblage à partir d'un fichier, et exécuter ces instructions.Inline ASM jmp à la nouvelle mémoire

OU

Je voudrais charger le code de la machine déjà compilé à nouveau à partir d'un fichier (non exe)

Mes pensées:

assez asm en ligne Jusqu'à présent, je l'ai appris à Travailler avec des variables c/C++ facilement. J'ai commencé à apprendre des codes d'opération, et j'ai eu quelques manuels x86. Je comprends (un peu) comment le matériel fonctionne à un niveau de base. Je sais que je peux charger le fichier en mémoire avec C++ avec fstream, et je me demande s'il existe un moyen d'exécuter de la mémoire depuis cet espace, ou si c'est dans une partie non-exécutable de la mémoire ou quelque chose ..

Raison:

Actuellement, il y a plusieurs raisons pour lesquelles je voudrais faire. J'ai un désir de créer un base l'encodage pour mon programme, pour une clé simple pour exécuter le programme. Et même si je peux facilement crypter et déchiffrer le code réel, je veux que le programme soit décrypté à chaque passage et ne soit jamais stocké sur le disque dur. Je suis au courant de plusieurs problèmes, mais je suis très intéressé à le faire.

Questions finales:

Puis-je exécuter du code machine de l'espace mémoire dans un programme de C++ asm?

Est-ce que asm est nécessaire?

Existe-t-il d'autres façons d'accomplir cette tâche plus efficacement, si oui, quelles sont ces méthodes? Je lis aussi quelques injections de DLL pour un programme de partage de souris que je fais (deux ordinateurs l'un à côté de l'autre, les deux ont des moniteurs, mais vous n'avez qu'un seul clavier/souris.) où je peux trouver quelques bonnes ressources sur le sujet? Google a été utile, mais je suis intéressé par peut-être des canaux IRC ou quelque chose de similaire.En tout cas, merci de lire!

+0

Trop de questions dans une question vraiment. –

Répondre

6

Cela ressemble à une sorte de compilation JIT de certains assemblages x86 dans un fichier séparé?

Je pourrais avoir mal compris, quand vous dites «espace mémoire», vous encapsulant un terme très large. Je suppose que vous ne voulez pas dire que vous voulez le compiler avec un ensemble d'assemblage spécifique mais que vous pouvez échanger les instructions d'assemblage lors de l'exécution?

avoir une lecture sur la Dynamically generating and executing x86 code suivante

Vous verrez

#include <stdio.h> 
#include <stdint.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/mman.h> 

int main(int argc, char *argv[]) { 
    uint8_t *buf = mmap(NULL, 1000, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 

    buf[0] = 0xb8; 
    uint32_t u32 = 42; 
    memcpy(buf + 1, &u32, 4); 
    buf[5] = 0xc3; 

    if (mprotect(buf, 1000, PROT_EXEC | PROT_READ) < 0) { 
     fprintf(stderr, "mprotect failed: %s\n", strerror(errno)); 
     return 1; 
    } 
    int (*ptr)(void) = (int (*)(void)) buf; 

    printf("return is %d\n", ptr()); 

    return 0; } 

Ici vous allouez la mémoire pour un tampon. Mettre les instructions dans le tampon, puis créer un pointeur de fonction à partir de la mémoire allouée. Notez que la mémoire est également protégée.

Relisez l'article pour une meilleure compréhension, il vous donne également quelques équivalents Windows.

+0

+1 pour un simple comment faire! Comme future référence, parce que l'API n'est pas portable, le processus de protection de la mémoire "équivalent" sur Windows commence par un appel à ['VirtualAlloc()'] (http://msdn.microsoft.com/en-us/library/aa366887 (VS.85) .aspx) et l'utilisation des [Constantes de protection de la mémoire] (http://msdn.microsoft.com/en-us/library/aa366786 (VS.85) .aspx) est requise. –

+0

WOW !! C'est parfait! Je vous remercie!! – ultifinitus

2

Si vous souhaitez charger le code en tant que données, puis exécutez-le alors vous aurez probablement besoin de marquer la mémoire contenant le code comme exécutable (ceci est dû à une fonction de sécurité dans la plupart des systèmes d'exploitation modernes pour empêcher divers exploits.) Sous Linux, Mac OS X, et al vous utiliserez mprotect, mais ça sonne lik e vous utilisez peut-être Windows (?), dans ce cas, vous devrez trouver l'API équivalente.

Et non vous n'avez pas besoin d'utiliser asm pour cela - vous pouvez simplement utiliser un pointeur de fonction C ou C++.

+0

Vous pouvez utiliser un pointeur de fonction régulière * si * le code est en fait une fonction * et * vous êtes sûr à 100% de la convention d'appel (sous Windows). –

Questions connexes