2016-09-05 5 views
0

habe ich ein Programm, das kopiert alle Inhalte eines anderen c prog (Binärdatei), sie auf eine andere Datei schreibt und führt sie dann aus (execve()) nach der Ausführung Erlaubnis ihm hinzufügen (chmod()).Shop ein Programm in einem anderen Programm

Jetzt möchte ich den gesamten Inhalt der Datei in einem Array innerhalb des Prog speichern (ich verwende hex Darstellung) und dann ausführen. Zu diesem Zweck habe ich ein anderes Programm in C, die eine Datei in Hex-Darstellung konvertiert hier ist der Quellcode dieser beiden Programme:

#include <stdio.h> //program used for execution 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/stat.h> 

unsigned char prog []= {}// thats the string i am planning to use so i can store the program 

void FileCreate(const char *in) { 

    FILE *fp2 = fopen(in,"wb"); // create afile in binary form with write permission 
    if (fp2==NULL) { //error checking 
    fclose(in); 
    printf("file '%s' isn't here...\n", in); 
    exit(1); 
    } 

    int ch; 
    int i = 0; 
    for (i=0; i<sizeof(prog);++i) { 
    ch = prog[i]; 
    fputc(ch, fp2); 
    } 

    fclose(fp2); 
} 

int main (int argc,char *argv[]){ 
    if (argc != 2) { 
    fprintf(stderr, "Usage: %s [file_name]\n", argv[0]); 
    exit(1); 
    } 
    FileCreate(argv[1]); 
    char *cmd[] = {argv[1], NULL}; 
    int err = chmod (argv[1], S_IXUSR); 
    if (err==-1){ 
    perror ("Change mode"); 
    exit(1); 
    } 
    err = execve (cmd[0], cmd,NULL); 
    if (err==-1){ 
    perror ("Execute file"); 
    exit(1); 
    } 
    return 0; 
} 

converter.c: Programm, das Datei zu hex reprentation konvertiert

#include <stdio.h> 
int main (void) { 
    unsigned char data[1024]; 
    size_t numread, i; 

    while ((numread = read(0, data, 1024)) > 0) { 
    for (i = 0; i < numread; i++) { 
     if(data[i] != 0){ //remove null bytes 
     printf("0x%02x,", data[i]); 
    } 
    } 
} 

    return 0; 
} 

Wie Sie in meinem Konverter-Programm sehen können, entferne ich die Null-Bytes aus der ausführbaren Datei. Ist das korrekt oder wird das Programm nicht ausgeführt? Mein Hauptproblem ist, dass ich nicht den gesamten Programminhalt in ein Array passen kann. Wie kann ich also ein Programm implementieren, das den Inhalt eines anderen speichert und dann ausführt?

  • Ich verwende Linux-Umgebung und gcc Compiler.
  • Diese Programme werden für Bildungszwecke durchgeführt und sind nicht Teil einer Aufgabe oder Übung.
  • Wenn Sie weitere Informationen benötigen lassen Sie mich jetzt
+0

Haben Sie einen Virus erstellen? – Alexi

+0

Wird dieses Programm als Virus oder Schadprogramm betrachtet? Wenn ja, sag es mir und ich lösche es sofort. danke –

+0

Nein, natürlich nicht. Auch wenn Sie einen Virus erstellen möchten, können Sie nur für Bildungszwecke verwendet werden. Nur neugierig. Dies ist eine übliche Art, sich selbst zu replizieren. – Alexi

Antwort

1

Wenn Sie Binärdatei haben wie folgt [A prog, B Prog] und Sie wissen, wo B prog startet in die ausführbare Datei Sie wie mmap in this thread nutzen könnten.

UPDATE (nur für Linux) von this:

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

unsigned char mya[] = { 
       0x50,0x57,0x56,0x52,0xe8, 
       0x00,0x00,0x00,0x00,0x5e, 
       0x48,0x81,0xc6,0x24,0x00, 
       0x00,0x00,0x48,0xc7,0xc0, 
       0x01,0x00,0x00,0x00,0x48, 
       0xc7,0xc7,0x01,0x00,0x00, 
       0x00,0x48,0xc7,0xc2,0x0e, 
       0x00,0x00,0x00,0x0f,0x05, 
       0x5a,0x5e,0x5f,0x5a,0xc3, 
       0x48,0x65,0x6c,0x6c,0x6f, 
       0x2c,0x20,0x57,0x6f,0x72, 
       0x6c,0x64,0x21,0x0a,0x00 
      }; 

int main(int argc, char**argv) 
{ 
    void *addr = (void*)((unsigned long)mya & ((0UL - 1UL)^0xfff));/*get memory page*/ 
    int ans = mprotect(addr, 1, PROT_READ|PROT_WRITE|PROT_EXEC);/*set page attributes*/ 
    if (ans) 
    { 
    perror("mprotect"); 
    exit(EXIT_FAILURE); 
    } 

    ((void(*)(void))mya)();/*execute array*/ 

    return 0; 
} 

Dieser Wille Ausgang "Hallo, Welt!"

Um große ausführbare Dateien zu verwalten Sie Konverter vornehmen können, die c-Header-Datei wie folgt generieren:

//data.h 
static unsigned char executable[] = 
{ 
0x50, 0x36, 0x0A, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 
0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4D, 0x50, 0x0A, 0x32, 0x37, 
0x37, 0x20, 0x31, 0x36, 0x32, 0x0A, 0x32, 0x35, 0x35, 0x0A, 0xFF, 0xFF, 
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
.... 

und dann ist es in Ihrem Hauptprogramm und wie im Beispiel oben verwenden.

+0

Vielen Dank für Ihre Antwort, aber ich glaube nicht, dass ich an diesem Ansatz interessiert bin. Ich bin daran interessiert, die Binärdatei innerhalb des Programms mit einem Array oder etwas Ähnlichem zu speichern. –

+0

Ich habe die Antwort aktualisiert. – j2ko

+0

Ich habe ein paar Fragen. Wie bist du auf den Inhalt von 'mya []' gekommen? weil, wenn ich versuche, ein einfaches Hallo Weltprogramm in hex Form mit meinem 'converter.c' Programm zu konvertieren, bekomme ich eine lange Zeichenfolge von hex, die nicht in ein Array passt. Zweitens, wenn der Binärcode zu groß ist, um in das Array zu passen, was kann ich tun? –

Verwandte Themen