Code:
.686
.model flat,stdcall
include \masm32\include\include\windows.inc
include \masm32\include\stdio.inc
include \masm32\include\msvcrt.inc
Blowfish_SetKey PROTO :DWORD, :DWORD
Blowfish_Encrypt PROTO :DWORD, :DWORD
Blowfish_Decrypt PROTO :DWORD, :DWORD
Blowfish_Clear PROTO
Base64Decode proto pInputStr:DWORD,pOutputData:DWORD
.data
blowfish_key label dword
db 8 dup (0) ; user_salt
db 099h,000h,086h,0A5h,027h,0AAh,09Dh,07Fh
db 058h,0AAh,0AEh,0B9h,00Bh,047h,03Ah,035h
db 0AAh,0E0h,0EAh,095h,066h,0FBh,0E4h,09Fh
db 0CBh,0F7h,016h,01Ch,0A3h,092h,0E6h,01Ch
db 096h,006h,09Bh,05Bh,029h,030h,0BFh,0AFh
db 0ECh,011h,029h,0C8h,089h,05Bh,0B8h,057h
key_len equ $-blowfish_key
format dw 10,'A','I','M','6',' ','P','a','s','s','w','o','r','d',':','%','s',10,0
main proto :dword,:dword
.code
start proc
local stinfo :STARTUPINFO
local bWildCard :dword
local pEnv :dword
local pArgv :dword
local nArgc :dword
mov bWildCard,FALSE
invoke __getmainargs,addr nArgc,addr pArgv,addr pEnv,[bWildCard],addr stinfo
invoke main,nArgc,pArgv
invoke exit,0
start endp
main proc private uses esi ebx edi argc:dword, argv:dword
local b64_aim_pass[64] :byte
local ciphertext[64] :byte
local aim_pass[64] :byte
mov ebx,[argv]
.if [argc] == 2
invoke ZeroMemory,addr ciphertext,64
invoke ZeroMemory,addr aim_pass,64
invoke ZeroMemory,addr b64_aim_pass,64
invoke lstrcpyn,addr b64_aim_pass,dword ptr[ebx+4],48
invoke Base64Decode,addr b64_aim_pass,addr ciphertext
lea esi,[ciphertext]
lea edi,[blowfish_key]
movsd ; 1st 4 bytes of salt
movsd ; 2nd 4 bytes
sub edi,8
invoke Blowfish_SetKey, edi, key_len
lea edi,[aim_pass] ; for plaintext..
mov ebx,24/8 ; decrypt remaining bytes
decrypt_loop:
invoke Blowfish_Decrypt,edi,esi
add esi,8
add edi,8
dec ebx
jnz decrypt_loop
invoke wprintf,addr format,addr aim_pass ; print unicode password
.else
invoke printf,CStr(<10,'Usage:%s <AIM6 PASSWORD STRING>',10>),dword ptr[ebx]
.endif
ret
main endp
.data
align 4
b64table label byte
db 0,42 dup (-1)
db 62; + ; [02Bh]
db 3 dup(-1)
db 63; / ; [02Fh]
db 52,53,54,55,56,57,58,59,60,61; 0..9 ;30-39
db 3 dup(-1)
db 0 ; = ; [03Dh]
db 3 dup(-1)
db 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25; A..Z
db 6 dup(-1)
db 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51; a..z
db 133 dup (-1)
.code
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
Base64Decode proc pInputStr:DWORD,pOutputData:DWORD
push ebp
push esi
push edi
push ebx
mov edi,[esp+1*4][4*4];pInputStr
xor eax,eax
mov esi,edi
.repeat; strlen
mov al,[edi]
add edi,4
test al,al
.until zero?
lea ebp,[edi-4]
mov eax,'='
sub ebp,esi; 4parts
jz @F
cmp al,[esi+ebp-1]; padd?
sete dl
.if zero?;equal?
mov [esi+ebp-1],ah
.endif
cmp al,[esi+ebp-2]
sete al
.if zero?;equal?
mov [esi+ebp-2],ah
.endif
add al,dl
mov edi,[esp+2*4][4*4];pOutputData
shr ebp,2
lea edx,[ebp*2+ebp]
sub edx,eax
push edx; result = length
.repeat
; CCDDDDDD BBBBCCCC AAAAAABB
mov ecx,[esi]
movzx edx,cl
movzx ebx,ch
mov al,[edx+b64table]; ..AAAAAA
mov ah,[ebx+b64table]; ..BBBBBB
shr ecx,16
add esi,4
movzx edx,cl
movzx ecx,ch
mov bl,[edx+b64table]; ..CCCCCC
mov bh,[ecx+b64table]; ..DDDDDD
mov dl,ah
mov dh,bl
shl al,2;AAAAAA..
shr bl,2;....CCCC
shl dh,6;CC......
shl ah,4;BBBB....
shr dl,4;......BB
or bh,dh
or al,dl
or ah,bl
mov [edi+0],al
mov [edi+2],bh
mov [edi+1],ah
dec ebp
lea edi,[edi+3]
.until zero?
pop eax
@@: pop ebx
pop edi
pop esi
pop ebp
ret 2*4
Base64Decode endp
OPTION PROLOGUE:PROLOGUEDEF
OPTION EPILOGUE:EPILOGUEDEF
Blowfish_Decrypt proc uses esi edi ebp ebx ptrOut:DWORD, ptrIn:DWORD
;pushad
mov edi, dword ptr [ptrIn] ;ptrIn
xor ebx, ebx
mov eax, dword ptr [edi ]
mov edx, dword ptr [edi+4]
xor ecx, ecx
mov edi, offset _PBox + 16*4
.repeat
xor eax, dword ptr [edi+4]
rol eax, 16
mov cl, al
mov bl, ah
mov esi, dword ptr [_SBox2+4*ecx]
rol eax, 16
add esi, dword ptr [_SBox1+4*ebx]
mov cl, ah
mov bl, al
xor esi, dword ptr [_SBox3+4*ecx]
add esi, dword ptr [_SBox4+4*ebx]
xor edx, esi
xor edx, dword ptr [edi]
rol edx, 16
mov cl, dl
mov bl, dh
mov esi, dword ptr [_SBox2+4*ecx]
rol edx, 16
add esi, dword ptr [_SBox1+4*ebx]
mov cl, dh
mov bl, dl
xor esi, dword ptr [_SBox3+4*ecx]
add esi, dword ptr [_SBox4+4*ebx]
sub edi, 8
xor eax, esi
cmp edi, offset _PBox
.until zero?
mov esi, dword ptr [ptrOut] ;ptrOut
xor eax, dword ptr [edi+4] ;L = L ^ Pbox[1]
xor edx, dword ptr [edi ] ;R = R ^ Pbox[0]
mov dword ptr [esi+4], eax
mov dword ptr [esi ], edx
;popad
ret ;8
Blowfish_Decrypt endp
Bookmarks