Brauche Hilfe von Verschlüsselungsprogramm

eXus49

Grünschnabel
Neues Problem mit Verschlüsselungsprogramm

Hallo nochmal! Wollte nicht noch einen neuen Thread aufmachen, desshalb poste ich mein neues Problem gleich hier! (Geht ja noch immer ums selbe Programm, Beschreibung siehe im Quote unten).

Das Problem: Alles läuft soweit super, der Code wird korrekt verschlüsselt und auch der Decrypter-Code wird korrekt abgespeichert (hier nochmal vielen Dank an deepthroat für die Hilfe :) ). Jetzt ist es allerdings so:
Sobald der Decrypter-Code sagen wir mal höher als 06000h liegt (Offset), also z.B. bei 09000h, dann crasht das Programm beim Ausführen. Wenn es näher ist (z.B. 04000h), dann funktioniert alles perfekt!
Woran kann das liegen? Die Characteristics sind alle richtig, sogar BaseOfCode habe ich geändert - bringt alles nichts. Wie weit kann der "jmp" Befehl von Assembler gehen?
Ich weiß, das hat jetzt mit deutlich mehr als nur C++ zutun, aber vl kann ja jemand helfen!

Danke schonmal,
eXus49


Altes Problem + Programmbeschreibung:
AltesProblem hat gesagt.:
Hallo,
ich brauche eure Hilfe, weil ich alleine einfach nicht weiter komme.
Ich will ein Programm schreiben, dass automatisch eine exe-Datei vom EntryPoint bis zum Ende der .text-Section verschlüsselt und in eine neu angelegte Section eine Art Decrypter-Code reinschreibt (der mir als Hex-String vorliegt).
Ich habe folgende 2 Probleme:
  1. Das Einlesen, verschlüsseln und zurückschreiben der Datei klappt nicht richtig. Ich will die Datei erstmal nur XOR verschlüsseln, aber das klappt nicht (Code unten).
  2. Das Schreiben des Decrypter-Codes klappt auch nicht richtig. Der Code wird nicht als Hex, sondern irgendwie anders in die Datei geschrieben.

Code zum Teilproblem "Einlesen":
Code:
char * buff[(int) SizeinBytes];
FILE *fbin;
size_t result;

fbin = fopen(File, "rb+"); //Öffnet die Datei zum Lesen & Schreiben (Binary-Mode?)
fseek(fbin,(long) EPinBytes, SEEK_SET); //EPinBytes = Adresse des Entrypoints in Bytes 
result = fread(buff, sizeof(char),(size_t) SizeinBytes, fbin); //SizeinBytes = Anzahl der zu lesenden Bytes

for (x = 0; x<SizeinBytes; x++) //Solange x < der Anzahl der zu lesenden Bytes...
             {   
                 buff[x] = (char *) ((BYTE) buff[x] ^ (BYTE) 0xF); //...soll jedes Zeichen ^0xF genommen werden (hier besteht wohl hoher Verbesserungsbedarf)
             }

fseek(fbin,(long) EPinBytes, SEEK_SET); //Wieder auf den Entry-Point zurücksetzen...
fwrite(buff,  sizeof(char), sizeof(buff), fbin); //...und alles reinschreiben

fclose(fbin); //Datei schließen

Code zum Teilproblem Decrypter-String schreiben:
Code:
FILE * fbin2;
char * decStub[250];
*decStub = "\xC7\x45\xF4\x00\x00\x40\x00\xC7\x45\xF0"
                 "\xAD\xDE\x00\x00\x8B\x45\xF4\x05\xEF\xBE\x00\x00\x89\x45\xF4\xC7\x45\xFC"
                 "\x00\x00\x00\x00\xEB\x09\x8B\x4D\xFC\x83\xC1\x01\x89\x4D"
                 "\xFC\x8B\x55\xFC\x3B\x55\xF0\x7D\x22\x8B\x45\xF4\x03\x45"
                 "\xFC\x8A\x08\x88\x4D\xF8\x0F\xBE\x55\xF8\x83\xF2\x0F\x88"
                 "\x55\xF8\x8B\x45\xF4\x03\x45\xFC\x8A\x4D\xF8\x88\x08\xEB"
                 "\xCD\xFF\x65\xF4"; //Der Decrypter-String im Hex-Format
   
   
fbin2 = fopen(File, "rb+"); //Öffnet die Datei zum Lesen & Schreiben im Binary-Mode   
fseek(fbin2, (long) NEPinBytes, SEEK_SET); //Setzt den Zeiger auf einen neuen EP (Anfang der neu erstellten Section)
fwrite(decStub, sizeof(char), sizeof(decStub), fbin2); //schreibt den Code
fclose(fbin2); //schließt die Datei

Ich hoffe ich habe alles verständlich kommentiert, wenn nicht, dann fragt einfach nach!

Ich wäre euch über eure Hilfe sehr dankbar!

mFg
eXus49
 
Zuletzt bearbeitet:
Hi.
Code zum Teilproblem Decrypter-String schreiben:
Code:
FILE * fbin2;
char * decStub[250];
*decStub = "\xC7\x45\xF4\x00\x00\x40\x00\xC7\x45\xF0"
                 "\xAD\xDE\x00\x00\x8B\x45\xF4\x05\xEF\xBE\x00\x00\x89\x45\xF4\xC7\x45\xFC"
                 "\x00\x00\x00\x00\xEB\x09\x8B\x4D\xFC\x83\xC1\x01\x89\x4D"
                 "\xFC\x8B\x55\xFC\x3B\x55\xF0\x7D\x22\x8B\x45\xF4\x03\x45"
                 "\xFC\x8A\x08\x88\x4D\xF8\x0F\xBE\x55\xF8\x83\xF2\x0F\x88"
                 "\x55\xF8\x8B\x45\xF4\x03\x45\xFC\x8A\x4D\xF8\x88\x08\xEB"
                 "\xCD\xFF\x65\xF4"; //Der Decrypter-String im Hex-Format
   
   
fbin2 = fopen(File, "rb+"); //Öffnet die Datei zum Lesen & Schreiben im Binary-Mode   
fseek(fbin2, (long) NEPinBytes, SEEK_SET); //Setzt den Zeiger auf einen neuen EP (Anfang der neu erstellten Section)
fwrite(decStub, sizeof(char), sizeof(decStub), fbin2); //schreibt den Code
fclose(fbin2); //schließt die Datei
Hier hast du bei der Deklaration von decStub einen Fehler gemacht. Du hast die Variable als Array von 250 Zeigern auf char deklariert. Dann setzt du das erste Element des Array (*decStub == decStub[0]) auf den String.

Beim Schreiben schreibst du entweder (250*4) oder (250*8) Bytes in die Datei - je nachdem ob dein System 32bit Zeiger oder 64bit Zeiger verwendet.

C:
char decStub[250] = "\xC7\x45\xF4\x00\x00\x40\x00\xC7\x45\xF0"
                 "\xAD\xDE\x00\x00\x8B\x45\xF4\x05\xEF\xBE\x00\x00\x89\x45\xF4\xC7\x45\xFC"
                 "\x00\x00\x00\x00\xEB\x09\x8B\x4D\xFC\x83\xC1\x01\x89\x4D"
                 "\xFC\x8B\x55\xFC\x3B\x55\xF0\x7D\x22\x8B\x45\xF4\x03\x45"
                 "\xFC\x8A\x08\x88\x4D\xF8\x0F\xBE\x55\xF8\x83\xF2\x0F\x88"
                 "\x55\xF8\x8B\x45\xF4\x03\x45\xFC\x8A\x4D\xF8\x88\x08\xEB"
                 "\xCD\xFF\x65\xF4"; //Der Decrypter-String im Hex-Format
Gruß
 
Stimmt, ich hab das Problem jetzt so gelöst, und das klappt!!

Code:
char * decStub;
    decStub = (char *) "\xC7\x45\xF4\x00\x00\x40\x00\xC7\x45\xF0"
                 "\xAD\xDE\x00\x00\x8B\x45\xF4\x05\xEF\xBE\x00\x00\x89\x45\xF4\xC7\x45\xFC"
                 "\x00\x00\x00\x00\xEB\x09\x8B\x4D\xFC\x83\xC1\x01\x89\x4D"
                 "\xFC\x8B\x55\xFC\x3B\x55\xF0\x7D\x22\x8B\x45F4\x03\x45"
                 "\xFC\x8A\x08\x88\x4D\xF8\x0F\xBE\x55\xF8\x83\xF2\x0F\x88"
                 "\x55\xF8\x8B\x45\xF4\x03\x45\xFC\x8A\x4D\xF8\x88v08\xEB"
                 "\xCD\xFF\x65\xF4";

//und fwrite habe ich so geändert (konstante Werte, da ja der Code auch konstant ist)
fwrite(decStub, 1, 89, fbin2);

Danke schonmal hierfür!

Hat noch einer ne Idee für die XOR-Verschlüsselung? Weil soviel gecaste und so geht bestimmt auch sauberer (und vor allen Dingen funktionierender ^^).
 
Hi.

Beim Einlesen hast du den gleichen Fehler gemacht: die Variable buff ist ein Array von Zeigern auf char, sollte einfach nur ein Array von char sein.

Gruß
 
Vielen Dank deepthroat! Das war die Lösung.
Ich habe allerdings ein neues Problem (siehe ersten Post).
Vielleicht kannst du (oder jemand anders hier) mir dabei auch helfen!?

Mfg
eXus49
 
Zurück