2012-01-09 95 views
0

尋找一個用匯編器編寫的程序,它將加密/解密文件。我使用NASM作爲編譯器。我發現樣本代碼,但它引發錯誤彙編器XOR加密/解密文件

encrypt_xor proc lpBuffor:dword, dwSize:dword, dwKey:dword 

    mov eax,lpBuffor 
    mov ecx,dwSize 
    mov edx,dwKey 

    next_byte: 

    xor byte ptr[eax+ecx-1],dl 
    dec ecx 
    jne next_byte 

    ret 

加密_xor ENDP

我有錯誤:

encrypt_xor proc lpBuffor:dword, dwSize:dword, dwKey:dword 

encrypt_xor proc lpBuffor:dword, dwSize:dword, dwKey:dword 

錯誤解析器:指令預期 和也在這裏

xor byte ptr[eax+ecx-1],dl 

錯誤昏迷或線有望年底

什麼是錯誤的代碼?

+0

您定位的是哪個CPU/Arch?您可以檢查出的OpenSSL源和/或AES-NI指令(SandyBridge的和更高) – Elalfer 2012-01-09 22:48:40

+0

@Elalfer x86處理器 – quba88 2012-01-10 12:30:41

+0

quba88,請接受給出的答覆或說明爲什麼它是不適合你接受 – 2012-01-13 00:51:08

回答

3

您提供的代碼看起來更像MASM語法。 的equivilent NASM語法可以是這樣的:

; void encrypt_xor(LPBYTE lpBuffor, DWORD dwSize, DWORD dwKey) 
encrypt_xor: 
    push ebp 
    mov  ebp,esp 

    %stacksize flat 
    %arg lpBuffor:dword, dwSize:dword, dwKey:dword 

    mov eax,[lpBuffor] 
    mov ecx,[dwSize] 
    mov edx,[dwKey] 

    next_byte: 

    xor [eax+ecx-1],dl 
    dec ecx 
    jne next_byte 

    mov esp, ebp 
    pop ebp 

    ret 

有幾件事情,這裏要注意。使用%堆棧大小%arg假設爲cdecl調用約定(即所有參數都在堆棧上傳遞)。在NASM中,這需要包含一個堆棧幀(因此需要聲明espebp)。

最後一個注意事項 - 如果此代碼是共享的,則應考慮更改名稱。該例程不提供任何強大的加密,並且讓開發人員陷入虛假的安全感是一個壞主意。

+0

月ECX,JNE next_byte *爲*一個優化...循環更具可讀性,但在現代處理器上更慢。 – 2012-01-09 15:12:35

+0

@BrianKnoblauch真的嗎?我很欣賞看到兩條指令「dec ecx,jne next_byte」比單個Loop指令快的證明/演示。 – adelphus 2012-01-09 16:07:08

+1

@adelphus http://www.agner.org/optimize/instruction_tables.pdf – harold 2012-01-09 16:12:34