Array auslesen und mit Offset verschlüsseln?

02/26/2013 16:00 Sogma#1
Hallo, ich programmiere hobbymäßig und habe mich mal an eine simple Cäsar-Verschlüsselung gesetzt. Das ganz ist in C geschrieben, und benötigt immernoch eine Eingabe des "Klartextes" - welcher verschlüsselt wird, und die des Offsets.
Falls ihr euch den Code ansehen wollt spoilere ich ihn hier mal vorsichtshalber.

Das Ganze ist eine MSDOS Anwendung ;)

So jetzt zu dem eigentlichen Problem das ich habe. Mit einer Art dieser Encryption wollte ich nun gerne ein Array aus einer .exe auslesen, Diesen wieder verschlüsseln.
Die Executeable ist aber leider in Assembly geschrieben, heißt das Verfahren klappt nicht mit meinem Code.Außerdem wollte ich gerne das Eingeben von Offset und Text raus hauen, also dass er sich den Text selbst holt und das Offset schon vorgegeben ist.

Kann mir freundlicherweise jemand dabei helfen?

Lg Sogma
02/26/2013 16:48 snow#2
Willst du das Array während der Laufzeit auslesen oder ist irgendwo in der .exe ein Array, das du auslesen willst?
Während der Laufzeit: ReadProcessMemory nutzen, Daten verändern und mit WriteProcessMemory wieder in den Speicher an Stelle des Arrays reinschreiben.
Ansonsten: Ein FILE mit der .exe initialisieren. Irgendwo in der .exe ist ja der .DATA Part (oder war es doch .TEXT? :o) und da ist dann (in der Theorie zumindest) das Array. Dann beginnt das Array bei (address of FILE) + (array-Part in der FILE). Darauf nen Zeiger oder wie auch immer und du hast den Content.

Wie meinst du das mit dem Offset?
02/26/2013 17:34 Sogma#3
Danke erstmal. Also das Offset ist zum Beispiel abc, der Text wie im Beispiel 1234abcd5678efgh - dann wird gerechnet: 1+a, 2+b, 3+c, 4+a ... usw. Und daraus ergibt sich die Verschlüsselung.

Wenn ich die Exe mit nem HEX Editor öffne steht dort folgendes:
Code:
007CE080  31 32 33 34 61 62 63 64  35 36 37 38 65 66 67 68  1234abcd5678efgh
Das 1234... will ich nun auslesen, und mit der Methode oben direkt verschlüsseln.
02/26/2013 19:01 snow#4
007CE080 ist meines Wissens nach die Adresse innerhalb der .exe, evtl. musst du da noch was draufrechnen oder abziehen, das weiß ich so grade nicht.

Die 31, 32 etc. sind die ASCII-Zeichen in Hexadezimal, das müsstest du direkt so auslesen können (%x speichert dir einen Integer im Hexadezimalformat) und zum Array hinzufügen können. Einen char kannst du ja auch über den ASCII-Wert definieren (das wäre hier dann z.B. 49, das ist als char '1').

Da kannst du ja dann über eine Schleife lösen:
while (nochnichtfertig) {

array[i] = asciiwert[adresse + i];
++i;
}

Zu der Verschlüsselung: Die kenne ich nicht, aber sehe ich richtig, dass du im Prinzip +a, +b, +c, +a, +b, +c usw. anwendest? Dann kannst du das über 'a' + (i % 3); lösen, somit hast du in jedem 3. Schritt ein 'a', nach jedem 3. + 1 Schritt ein 'b' und nach jedem 3. + 2 Schritt ein 'c'. Modulo ftw.

Joa, so sollte das so ganz grob passen. :D
02/26/2013 19:19 Sogma#5
Wenn du dir den Code im Spoiler anguckst dann sieht das da auch so aus. Ich möchte Das jetzt jedoch in Assembly haben, denn in der IDA-Anicht von meiner Exe sieht da sganze so aus:

Code:
007CE080                 db  31h ; 1
007CE081                 db  32h ; 2
007CE082                 db  33h ; 3
007CE083                 db  34h ; 4
007CE084                 db  61h ; a
007CE085                 db  62h ; b
007CE086                 db  63h ; c
007CE087                 db  64h ; d
007CE088                 db  35h ; 5
007CE089                 db  36h ; 6
007CE08A                 db  37h ; 7
007CE08B                 db  38h ; 8
007CE08C                 db  65h ; e
007CE08D                 db  66h ; f
007CE08E                 db  67h ; g
007CE08F                 db  68h ; h