删除nasm x64中的空格字节

时间:2017-02-24 17:12:05

标签: assembly nasm

我一直在尝试使用xor加密技术加密文件的内容。我对该程序的逻辑是读取文件中的内容,用密钥对其进行读取,将其存储到缓冲区然后打印。我给出了200的缓冲区大小,但缓冲区大小可以是任何值。当我打印加密的消息时,我得到了空格字符。

我尝试添加一个循环来计算加密消息的字符串长度,我只能读取空格字节然后打印它。但那没有成功。

我的xor加密代码:

  BITS 64

  %define BUF_SIZE 200
  %define ELEM_SIZE 1

  section .bss
buffer : resb BUF_SIZE
fh: resq 1
filename: resq 1

section .text
global _start

_start:
    mov rax, QWORD [rsp]            ; argument count check
    cmp rax, 0x3
    jne .nofilename

    mov rax, QWORD [rsp + 16]       ; retrieve address of filename from stack
    mov [filename], rax

    mov r13, QWORD[rsp +24]         ;store the key in r13

    xor rax, rax                    ;naddded
    mov rax, SYS_OPEN               ; open file in read only mode
    mov rdi, [filename]
    xor rsi, rsi
    mov rdx, O_RDONLY
    syscall
    cmp rax, 0                      ; test if read failed
    jl .openfailed
    mov [fh], rax

    ;mov rdi,buffer
    ;call .strlen
    ;mov r14, rax

    xor rax, rax                    ;nadded
    mov rax, SYS_READ               ; read BUF_SIZE bytes from file into buffer
    mov rdi, [fh]
    mov rsi, buffer
    mov rdx, BUF_SIZE
    syscall

    mov rdi, buffer                 ;move the buffer to rdi
    call .strlen
    mov r10, rax                    

    mov rdi, r13
    call .strlen
    mov r11, rax
    mov r12,r11

    mov rcx, r10
    ;mov rdx, buffer
    xor rax, rax
    ;mov rbx, r13

    mov r15,0

    .keyloop:

        mov bl, BYTE[r13+r15]

            xor BYTE[buffer+rax],bl
            inc rax
            dec rcx
            cmp rcx,0
            je  .label1

        inc r15
        dec r11
        cmp r11,0
        jne .keyloop
        je  .setloop

    .setloop:
        mov r11,r12
        xor r15, r15
        cmp rcx, 0
        je .label1
        jne .keyloop

    .label1:   
        xor rax, rax
        mov rax, SYS_WRITE              ; write buffer to stdout
        mov rdi, STDOUT
        mov rsi, buffer
        mov rdx, BUF_SIZE
        syscall

    mov rax, SYS_CLOSE              ; close file
    mov rdi, [fh]
    syscall

    xor rdi, rdi                    ; exit(0)
    jmp .final

    .openfailed:                    ; display file open failed error message
        mov rax, SYS_WRITE
        mov rdi, STDERR
        mov rsi, open_error
        mov rdx, open_error_len
        syscall
        mov rdi, 1
        jmp .final

    .nofilename:                    ; display usage message
        mov rax, SYS_WRITE
        mov rdi, STDERR
        mov rsi, usage
        mov rdx, usage_len
        syscall
        mov rdi, 1                  ; exit(1)
        jmp .final

    .final:                        ; exit syscall

        xor r15, r15
        xor r10, r10
        xor r11,r11
        xor rax, rax

        mov rax, SYS_EXIT
        syscall

    .strlen:
        push rbp
        mov rbp, rsp

        xor rax, rax

        .cmploop:
            cmp BYTE[rdi + rax], 0     ; check if current byte is null
            je .cmpdone                 ; if yes, done
            inc rax                     ; else increment length counter
            jmp .cmploop                ; and continue

        .cmpdone:
            leave
            ret

有什么方法可以摆脱空间。

0 个答案:

没有答案
相关问题