Ich bin gerade dabei einen XOR Algorithmus in Assembler zu schreiben. Ich weiss natürlich schon, dass es schon massenhaft vorgefertigtes, optimiertes Zeug in dieser Art gibt (z.B. auch im MASM32 Packet), doch ich hab mir halt vorgenommen einen eigenen zu schreiben...
...wenn da nicht ein Problem aufgetaucht wäre: Mein Programm stürzt immer ab. Irgendwo muss da ein harter Fehler sein.
Grob beschrieben funktioniert mein Programm (mehr Test als Programm
1. Der Schlüssel wird aus einer Datei ausgelesen (Schluessel.txt)
2. Der Klartext (zu verschlüsselnder Text) wird aus einer Datei ausgelesen (Klartext.txt)
3. Das ganze wird Byteweise verschlüsselt und in einen Buffer geschrieben
4. Wenn der ganze Klartext verschlüsselt ist, wird das verschlüsselte Zeug in die Datei Geheimtext.txt geschrieben
So viel zum groben Ablauf des Programms. Hier der Quelltext...
Code: Alles auswählen
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
DateinameSchluessel db "Schluessel.txt",0
DateinameKText db "Klartext.txt",0
DateinameGText db "Geheimtext.txt",0
MsgCaption db "Meldung",0
MsgText db "Die Datei wurde vollständig verschlüsselt",0
.data?
hDatei dd ?
Schluesselgroesse dd ?
Klartextgroesse dd ?
GeleseneBytes dd ?
GeschriebeneBytes dd ?
SBuffer dd ? ;Schlüssel Buffer
KBuffer dd ? ;Geheimtext Buffer
NBuffer dd ? ;Neuer Buffer
Dat1 db ? ;1 Schlüsselzeichen -> 1 Byte
Dat2 db ? ;1 Klartextzeichen -> 1 Byte
SPosition dd ? ;Position im SBuffer
KPosition dd ? ;Position im KBuffer
NPosition dd ? ;Position im NBuffer (Neuer Buffer)
.code
start:
;/////////////////////////////////////////////////////////////////
;***ZEUGs auslesen: Schlüssel und Klartext***
invoke CreateFile, addr DateinameSchluessel, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL
mov hDatei, eax
invoke GetFileSize,hDatei, NULL
mov Schluesselgroesse,eax
invoke ReadFile, hDatei, addr SBuffer,Schluesselgroesse, addr GeleseneBytes, NULL
invoke CloseHandle, hDatei
;/////////////////////////////////////////////////////////////////
invoke CreateFile, addr DateinameKText, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL
mov hDatei, eax
invoke GetFileSize,hDatei, NULL
mov Klartextgroesse,eax
invoke ReadFile, hDatei, addr KBuffer,Klartextgroesse, addr GeleseneBytes, NULL
invoke CloseHandle, hDatei
;***Jetzt ist alles Zeug ausgelesen und befindet sich im Speicher.***
;/////////////////////////////////////////////////////////////////
Verschluesseln:
mov ebx,offset SBuffer
mov ecx,SPosition
mov al, [ebx + ecx]
mov Dat1, al
inc SPosition ;erhöhe (inkrementiere) SPosition um 1 Byte
mov eax,SPosition
.if eax==Schluesselgroesse
mov SPosition,0
.endif
mov ebx,offset KBuffer
mov ecx,KPosition
mov al, [ebx + ecx]
mov Dat2, al
inc KPosition ; erhöhe (inkrementiere) KPosition um 1 Byte
;***Hier wird verschlüsselt***
mov al,Dat1
mov bl,Dat2
xor al,bl
;*************
mov ebx,offset NBuffer
mov ecx,NPosition
mov [ebx + ecx],al
inc NPosition
mov eax, KPosition
.if eax!=Klartextgroesse
jmp Verschluesseln
.endif
;***Wenn das Zeug verschlüsselt ist, wird es in eine Datei geschrieben***
invoke CreateFile,addr DateinameGText,GENERIC_WRITE,0,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov hDatei,eax
invoke SetFilePointer, hDatei, NULL, NULL, FILE_END
invoke WriteFile, hDatei,addr NBuffer, Klartextgroesse, addr GeschriebeneBytes, NULL
invoke CloseHandle, hDatei
invoke MessageBox, NULL,addr MsgText, addr MsgCaption, MB_OK
invoke ExitProcess,0
end start
Ich rätsle nun schon ziemlich lange an diesem Problem herum. Kann mir jemand helfen? Was mache ich falsch? Warum stürzt das Programm ab?