32位汇编语言创建输出文件的麻烦

时间:2012-11-24 00:20:05

标签: assembly masm irvine32

使用此程序一段时间后,它会在创建输出文件后继续停止。我使用的是Visual Basic 2010,我仍然是初学者。作业问题是:

描述(对称加密):

  1. 编码

    • 要求用户输入一些文字
    • 要求用户键入此范围内的私钥[1-255]。执行范围有效性检查。
    • 使用提供的私钥加密输入文本,将密文放入用户指定的文件中。
  2. 解码

    • 要求用户指定要解码的文件。
    • 从该文件加载密文并尝试解密,而不假设私钥与编码中使用的密钥相同。
    • 将所有试用结果放在用户指定的分隔文件中。
    • d。弄清楚最合理的结果(或原始明文)是什么。
  3. 我可以弄清楚如何加密文本,但是在使用位于此教科书地址的库创建输出文件时遇到问题: http://www.kipirvine.com/asm/examples/index.htm

    我将在下面包含我的代码,并通过评论材料显示我在此处尝试了多少次。这本书不能很好地解释我,所以如果我能看到它试图说它将是非常有帮助的!

    提前致谢!

    INCLUDE Irvine32.inc
    
        BUFMAX = 128                    ; maximum buffer size
        KEYMAX = 128                    ; maximum buffer size
        BUFFER_SIZE = 5000
    
    .data
    
        sPrompt BYTE        "Enter some text message:       ", 0
        keyPrompt   BYTE        "Enter a private key [1-255]:       ", 0
        cFile   BYTE        "Enter a filename for cypher text: ", 0
        sEncrypt    BYTE        "Cypher text                    ", 0
        sDecrypt    BYTE        "Decrypted:                 ", 0
        error   BYTE        "The key must be within 1 - 255!    ", 0
        buffer  BYTE         BUFMAX + 1 DUP(0)
        bufSize DWORD    ?
        keyStr  BYTE         KEYMAX + 1 DUP(0)
        keySize DWORD    ?
        key     DWORD    ?
        filename    BYTE        "newfile.txt                    ", 0
        fileHdl DWORD   ?
        bufFile BYTE        BUFFER_SIZE DUP (?)
    
    .code
    main PROC
    
        call InputTheString             ; input the plain text
        call InputTheKey                ; input the security key
        call CypherFile             ; input a cypher filename
        ;call TranslateBuffer           ; encrypt the buffer
        ;mov edx, OFFSET sEncrypt           ; display encrypted message
        ;call DisplayMessage
        ;call TranslateBuffer           ; decrypt the buffer
        ;mov edx, OFFSET sDecrypt           ; display decrypted message
        ;call DisplayMessage
        exit
    main ENDP
    
    InputTheKey PROC
    
        pushad                      ; save 32-bit registers
    LK: mov edx, OFFSET keyPrompt       ; display a prompt
        call WriteString                ; Enter a private key [1-255]
        call Crlf                       ; start a new line
        call ReadInt                    ; read int into system
        mov key, eax                    ; store int into keyStr
        cmp eax, 255                    ; compare newly read int
        ja LC                       ; jump if above 255 to LC
        cmp eax, 1                  ; compare newly read int
        jb LC                       ; jump if below 1 to LC
        jmp LR                      ; if between range jump to LR
    LC: mov edx, OFFSET error           ; The key must be within 1 - 255!
        call WriteString                ; Display the error
        call Crlf                       ; start a new line
        loop LK                     ; loop back to enter the security key
    LR: popad                       ; restore the registers
        ret
    InputTheKey ENDP
    
    CypherFile PROC
        pushad
        mov edx, OFFSET cFile           ; "Enter a filename for cypher text
        call WriteString                ; Enter a name for encrypted file
        call Crlf
        call ReadString             ; Store the filename in eax
        ;mov filename, eax
        mov edx, OFFSET filename
        ;push eax
        ;mov eax, fileHdl
        ;mov edx, OFFSET bufFile
        ;mov ecx, BUFFER_SIZE
        ;mov edx, "C:\outputtext.txt"
        call CreateOutputFile
        ;mov edx, OFFSET filename
        ;mov ecx, SIZEOF filename
        ;push eax
        ;mov eax, bufSize
        call WriteToFile
        pop eax
        ;call CloseFile
        ret
    CypherFile ENDP
    InputTheString PROC
    
        pushad                      ; save 32-bit registers
        mov edx, OFFSET sPrompt         ; display a prompt
        call WriteString                ; "Enter some text message"
        call Crlf                       ; start a new line
        mov ecx, BUFMAX             ; maximum character count
        mov edx, OFFSET buffer          ; point to the buffer
        call ReadString             ; input the string
        mov bufSize, eax                ; save the length
        popad
        ret
    InputTheString ENDP
        COMMENT !
    DisplayMessage PROC
    
        pushad
        call WriteString
        mov edx, OFFSET buffer          ; display the buffer
        call WriteString
        call Crlf
        call Crlf
        popad
        ret
    DisplayMessage ENDP
    
    TranslateBuffer PROC
    
        pushad
        mov ecx, bufSize                ; loop counter
        mov esi, 0                  ; index 0 in buffer
        mov edi, 0                  ; index 0 in the key
    L1:
        mov al, keyStr[edi]             ; get a character from encryption key
        xor buffer[esi], al             ; translate a byte
        inc esi                     ; point to next byte
        inc edi                     ; go to next position in key
        cmp edi, keySize                ; compare if equal to size of the key
        jb L2
        mov edi, 0                  ; reset to beginning of the key
    L2: loop L1
        popad
        ret
    TranslateBuffer ENDP
    !
    END main
    

1 个答案:

答案 0 :(得分:2)

从哪里开始?

您是否错过了ReadString的一些参数?也许是指向存储输入文件名的位置的指针?要接收文件名的缓冲区的大小?

CypherFile您使用pushad将所有寄存器压入堆栈,但最后只有pop eax。那里的大问题应该是popad

就目前而言,它没有向输出文件写入任何内容,因为WriteToFile的参数被注释掉了。

编辑 - 反对我的“只是给代码” 您需要告诉ReadString保存输入的文件名和缓冲区大小的位置。 然后将其传递给CreateOutputFile - 在CyperFile proc -

mov     edx, offset buffer      ; you are missing a buffer for filename
mov     ecx, BUFMAX             ; buffer size
call    ReadString              

mov     edx, offset buffer      ; Pass this to CreateOutputFile
call    CreateOutputFile

现在正在阅读CreateOutputFile的来源,它说它在成功时返回一个文件句柄,将其保存在某处。完成写入文件后,将其与CloseFile一起使用。如果未成功创建文件,则会返回INVALID_HANDLE_VALUE