|
Постоянный
Регистрация: 23.04.2006
Сообщений: 622
Провел на форуме: 5887054
Репутация:
1292
|
|
Base64 Encode
Алгоритм: Base64 Encode
Синтаксис: fasm
Описание: rfc2045.txt
Коментарий: Вот решил переписать алгоритм по своему, оптимизировать и т.д. после этого у меня сложилось впечатление что автор разработавший его смутно представлял основы написания програм на ассемблере, можно было сделать его намного быстрее, кстати кто нибудь задумывался что результат кодирования участка данных длиной пропорциональной выражению x*2 имеет 3 синонима, а x*2+1 целых 15, для примера выполни эту команду perl -e "print'OK'if(decode_base64('bWU=')eq decode_base64('bWX='));"
Пример вызова:
Код:
format PE GUI 4.0
entry start
include 'win32a.inc'
data import
library USER32,'USER32.DLL'
import USER32,MessageBoxA,'MessageBoxA'
end data
include 'utils.inc'
start:
stdcall bin2base64, bin, bin.len, chrset, buf
ret
chrset db 'ABCDEFGHIJKLMNOP'
db 'QRSTUVWXYZabcdef'
db 'ghijklmnopqrstuv'
db 'wxyz0123456789+/'
bin db 'This is my data'
.len = $ - bin
buf rb 256
Внимание: Длина буфера должна быть больше длины кодируемых данных в 4/3 раза c округлением в большую сторону + pad символ + символ конца строки, мы ведь не хотим переполнения буфера
Код:
Код:
proc bin2base64, data, len, chrset, base
push edx
xchg esi, [data]
xchg ecx, [len]
xchg ebx, [chrset]
xchg edi, [base]
mov eax, ecx
xor edx, edx
lea ecx, [edx+3]
div ecx
mov ecx, eax
mov al, dl
ror eax, 16
.lop: lodsb
ror ax, 2
mov dl, al
and dl, 63
mov al, [edx+ebx]
stosb
rol ax, 10
lodsb
ror ax, 4
mov dl, al
and dl, 63
mov al, [edx+ebx]
stosb
rol ax, 12
lodsb
ror ax, 6
mov dl, al
and dl, 63
mov al, [edx+ebx]
stosb
rol ax, 6
mov dl, al
and dl, 63
mov al, [edx+ebx]
stosb
loop .lop
rol eax, 16
mov cx, ax
jcxz .sz
mov eax, '==' shl 16
lodsb
ror ax, 2
mov dl, al
and dl, 63
mov al, [edx+ebx]
dec cx
jnz @f
shr ah, 2
mov dl, ah
mov ah, [edx+ebx]
stosd
jmp .sz
@@: stosb
shr eax, 8
shl ax, 2
lodsb
ror ax, 4
and al, 63
mov dl, al
and dl, 63
mov al, [edx+ebx]
shr ah, 2
mov dl, ah
mov ah, [edx+ebx]
stosd
.sz: xor eax, eax
stosb
.lnd: pop edx
mov esi, [data]
mov ecx, [len]
mov ebx, [chrset]
mov edi, [base]
ret
endp
Последний раз редактировалось hidden; 13.12.2006 в 00:18..
Причина: Придерживаться формата, относится для всех!
|