2013-06-24 21:33:16 +02:00
|
|
|
server_parser:
|
|
|
|
|
|
|
|
; Commands are always 3 numbers and followed by a space
|
|
|
|
; If a server decides it needs multiline output,
|
|
|
|
; first lines will have a dash instead of space after numbers,
|
2013-07-09 22:19:08 +02:00
|
|
|
; thus they are simply ignored in this simple command parser.
|
2013-06-24 21:33:16 +02:00
|
|
|
|
|
|
|
cmp dword[s], "150 "
|
|
|
|
je data_ok
|
|
|
|
|
|
|
|
cmp dword[s], "220 "
|
|
|
|
je welcome
|
|
|
|
|
2013-07-09 22:55:18 +02:00
|
|
|
; cmp dword[s], "226 "
|
2013-07-09 22:19:08 +02:00
|
|
|
; je list_ok
|
|
|
|
|
2013-06-24 21:33:16 +02:00
|
|
|
cmp dword[s], "227 "
|
|
|
|
je pasv_ok
|
|
|
|
|
|
|
|
cmp dword[s], "230 "
|
|
|
|
je login_ok
|
|
|
|
|
2013-07-09 22:55:18 +02:00
|
|
|
; cmp dword[s], "250"
|
|
|
|
; je dir_ok
|
|
|
|
|
2013-06-24 21:33:16 +02:00
|
|
|
cmp dword[s], "331 "
|
|
|
|
je pass
|
|
|
|
|
2013-07-09 22:55:18 +02:00
|
|
|
; cmp dword[s], "421 "
|
2013-07-09 22:19:08 +02:00
|
|
|
; je timeout
|
|
|
|
|
|
|
|
cmp dword[s], "530" ; password incorrect
|
|
|
|
je welcome
|
|
|
|
|
|
|
|
jmp wait_for_usercommand
|
2013-06-24 21:33:16 +02:00
|
|
|
|
|
|
|
|
|
|
|
welcome:
|
|
|
|
|
|
|
|
mov [status], STATUS_CONNECTED
|
2013-07-09 22:19:08 +02:00
|
|
|
jmp wait_for_usercommand
|
2013-06-24 21:33:16 +02:00
|
|
|
|
|
|
|
|
|
|
|
pass:
|
|
|
|
|
|
|
|
mov [status], STATUS_NEEDPASSWORD
|
2013-07-09 22:19:08 +02:00
|
|
|
jmp wait_for_usercommand
|
2013-06-24 21:33:16 +02:00
|
|
|
|
|
|
|
|
|
|
|
login_ok:
|
|
|
|
|
|
|
|
mov [status], STATUS_LOGGED_IN
|
2013-07-09 22:19:08 +02:00
|
|
|
jmp wait_for_usercommand
|
2013-06-24 21:33:16 +02:00
|
|
|
|
|
|
|
|
|
|
|
pasv_ok:
|
|
|
|
|
|
|
|
sub ecx, 5
|
|
|
|
jb .fail
|
|
|
|
mov al, "("
|
|
|
|
mov edi, s + 5
|
|
|
|
repne scasb
|
|
|
|
|
|
|
|
mcall socket, AF_INET4, SOCK_STREAM, 0
|
|
|
|
cmp eax, -1
|
|
|
|
je fail
|
|
|
|
mov [datasocket], eax
|
|
|
|
|
|
|
|
mov esi, edi
|
|
|
|
call ascii_dec
|
|
|
|
mov byte[sockaddr2.ip+0], bl
|
|
|
|
call ascii_dec
|
|
|
|
mov byte[sockaddr2.ip+1], bl
|
|
|
|
call ascii_dec
|
|
|
|
mov byte[sockaddr2.ip+2], bl
|
|
|
|
call ascii_dec
|
|
|
|
mov byte[sockaddr2.ip+3], bl
|
|
|
|
|
|
|
|
call ascii_dec
|
|
|
|
mov byte[sockaddr2.port+0], bl
|
2013-07-09 22:19:08 +02:00
|
|
|
call ascii_dec
|
|
|
|
mov byte[sockaddr2.port+1], bl
|
2013-06-24 21:33:16 +02:00
|
|
|
|
2013-07-09 22:19:08 +02:00
|
|
|
invoke con_write_asciiz, str_open
|
2013-06-24 21:33:16 +02:00
|
|
|
mcall connect, [datasocket], sockaddr2, 18
|
|
|
|
|
|
|
|
.fail:
|
2013-07-09 22:19:08 +02:00
|
|
|
jmp wait_for_servercommand
|
2013-06-24 21:33:16 +02:00
|
|
|
|
|
|
|
|
|
|
|
data_ok:
|
|
|
|
|
2013-07-09 23:14:47 +02:00
|
|
|
mcall recv, [datasocket], buffer_ptr2, BUFFERSIZE, 0
|
|
|
|
test ebx, ebx
|
|
|
|
jnz .fail
|
2013-07-09 22:55:18 +02:00
|
|
|
mov byte[buffer_ptr2 + eax], 0
|
2013-07-09 22:19:08 +02:00
|
|
|
|
2013-07-09 22:55:18 +02:00
|
|
|
invoke con_write_asciiz, buffer_ptr2
|
2013-06-24 21:33:16 +02:00
|
|
|
|
2013-07-09 23:14:47 +02:00
|
|
|
jmp data_ok
|
|
|
|
|
2013-06-24 21:33:16 +02:00
|
|
|
.fail:
|
2013-07-09 22:19:08 +02:00
|
|
|
mcall close, [datasocket]
|
|
|
|
jmp wait_for_servercommand
|
2013-06-24 21:33:16 +02:00
|
|
|
|
|
|
|
|
|
|
|
ascii_dec:
|
|
|
|
|
|
|
|
xor ebx, ebx
|
2013-07-09 22:19:08 +02:00
|
|
|
mov cl, 4 ; max length is 3 digits + 1 separator
|
2013-06-24 21:33:16 +02:00
|
|
|
.loop:
|
|
|
|
lodsb
|
|
|
|
sub al, '0'
|
|
|
|
jb .done
|
|
|
|
cmp al, 9
|
|
|
|
ja .done
|
2013-07-09 22:19:08 +02:00
|
|
|
lea ebx, [ebx*4+ebx] ; ebx *5
|
|
|
|
shl ebx, 1 ; ebx *2
|
2013-06-24 21:33:16 +02:00
|
|
|
add bl, al
|
|
|
|
dec cl
|
|
|
|
jnz .loop
|
|
|
|
|
|
|
|
.done:
|
|
|
|
ret
|