Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #### ASSEMBLER WINSOCK BY NOP0X90
- proc FD_ZERO set
- mov EAX, [set]
- add EAX, fd_set.fd_count
- mov [EAX], 0
- ret
- endp
- proc FD_SET fd, set
- mov EAX, [set]
- add EAX, fd_set.fd_count
- inc dword [EAX] ; Anzahl um 1 erhöhen
- mov EBX, [EAX]
- dec EBX
- imul EBX, 4
- mov EAX, [set]
- add EAX, fd_set.fd_array
- add EAX, EBX ; EBX=anzahl der einträge * 4
- mov EDX, [fd]
- mov [EAX], EDX ; schreibt den Eintrag hinter den letzten Eintrag.
- ret
- endp
- proc FD_ISSET fd, set
- ;wenn fd_count=0, return false
- ;sonst in schleife alle sockets durchsuchen
- mov EAX, [set]
- add EAX, fd_set.fd_count
- cmp dword [EAX], 0
- je .false
- mov ECX, [EAX] ; fd_count nach ECX
- add EAX, fd_set.fd_array
- .loop:
- mov EBX, [EAX]
- cmp EBX, [fd]
- je .true
- dec ECX
- test ECX, ECX
- jz .false
- add EAX, 4
- jmp .loop
- .false:
- mov EAX, FALSE
- jmp .out
- .true:
- mov EAX, TRUE
- .out:
- ret
- endp
- proc InitializeSocket
- local dwStrucAddr: DWORD;
- push sizeof.WSADATA
- call GetMem
- mov [dwStrucAddr], EAX
- push EAX
- push 0x2020
- call [WSAStartup]
- cmp EAX, NULL
- jne .fail
- push IPPROTO_TCP
- push SOCK_STREAM
- push AF_INET
- call [socket]
- cmp EAX, INVALID_SOCKET
- je .fail
- push EAX
- jmp .out
- .fail:
- call [WSAGetLastError]
- push 0
- .out:
- push [dwStrucAddr]
- push sizeof.WSADATA
- call FreeMem
- pop EAX
- ret
- endp
- proc ConnectSocket wPort_, psIP_, dwSock
- local dwHost: DWORD;
- local wPort: WORD;
- local dwStrucAddr: DWORD;
- push [psIP_]
- call [inet_addr]
- cmp EAX, INADDR_NONE
- je .fail
- mov [dwHost], EAX
- push [wPort_]
- call [htons]
- cmp AX, 0
- je .fail
- mov [wPort], AX
- push sizeof.sockaddr_in
- call GetMem
- mov [dwStrucAddr], EAX
- mov EDX, [dwHost]
- mov BX, [wPort]
- mov [EAX+sockaddr_in.sin_family], AF_INET
- mov [EAX+sockaddr_in.sin_port], BX
- mov [EAX+sockaddr_in.sin_addr], EDX
- push sizeof.sockaddr_in
- push [dwStrucAddr]
- push [dwSock]
- call [connect]
- cmp EAX, 0
- jne .fail
- jmp .out
- .fail:
- mov EAX, 0
- .out:
- ret
- endp
- proc SendHTTPGetRequest psURL, psHost, dwSocket
- local dwURLLen: DWORD
- local dwHostLen: DWORD
- local dwWriteAddr: DWORD
- local dwHeaderAddr: DWORD
- mov EBX, .end_all-.get
- push [psURL]
- call StrLen
- add EBX, EAX
- mov [dwURLLen], EAX
- push [psHost]
- call StrLen
- add EBX, EAX
- mov [dwHostLen], EAX
- push EBX
- call GetMem
- mov [dwWriteAddr], EAX
- mov [dwHeaderAddr], EAX
- push .get
- push EAX
- push .http-.get
- call MemCpy ; Schreibe GET
- add [dwWriteAddr], EAX
- push [psURL]
- push [dwWriteAddr]
- push [dwURLLen]
- call MemCpy ; Schreibe URL
- add [dwWriteAddr], EAX
- push .http
- push [dwWriteAddr]
- push .host-.http
- call MemCpy ; Schreibe HTTP/1.1
- add [dwWriteAddr], EAX
- push .host
- push [dwWriteAddr]
- push .end_header-.host
- call MemCpy ; Schreibe Host:
- add [dwWriteAddr], EAX
- push [psHost]
- push [dwWriteAddr]
- push [dwHostLen]
- call MemCpy ; Schreibe host-adresse
- add [dwWriteAddr], EAX
- push .end_header
- push [dwWriteAddr]
- push .end_all-.end_header
- call MemCpy ; Schreibe abschließende \r\n\r\n
- push [dwHeaderAddr]
- call StrLen
- push [dwSocket]
- push [dwHeaderAddr]
- push EAX
- push 100
- call SendTextWithBlock
- ret
- .get:
- db 'GET '
- .http:
- db ' HTTP/1.1'
- .host:
- db CR, LF, 'Host: '
- .end_header:
- db CR, LF, CR, LF, 0
- .end_all:
- endp
- proc SendTextWithBlock dwBlockMs, dwTextSize, psText, dwSocket
- local dwSetAddr: DWORD
- local dwTvAddr: DWORD
- push sizeof.fd_set
- call GetMem
- mov [dwSetAddr], EAX
- push sizeof.timeval
- call GetMem
- mov [dwTvAddr], EAX
- push [dwSetAddr]
- push [dwSocket]
- call FD_SET
- mov EAX, [dwBlockMs]
- mov EBX, [dwTvAddr]
- mov [EBX+timeval.tv_sec], 0
- mov [EBX+timeval.tv_usec], EAX
- push [dwTvAddr]
- push 0
- push [dwSetAddr]
- push 0
- push 0
- call [select]
- push [dwSetAddr]
- push [dwSocket]
- call FD_ISSET
- cmp EAX, TRUE
- jne .fail
- push 0
- push [dwTextSize]
- push [psText]
- push [dwSocket]
- call [send]
- jmp .out
- .fail:
- mov EAX, 0
- .out:
- ret
- endp
- proc RecvTextWithBlock dwBlockMs, dwBufSize, pBuf, dwSocket
- local dwSetAddr: DWORD
- local dwTvAddr: DWORD
- push sizeof.fd_set
- call GetMem
- mov [dwSetAddr], EAX
- push sizeof.timeval
- call GetMem
- mov [dwTvAddr], EAX
- push [dwSetAddr]
- push [dwSocket]
- call FD_SET
- mov EAX, [dwBlockMs]
- mov EBX, [dwTvAddr]
- mov [EBX+timeval.tv_sec], 0
- mov [EBX+timeval.tv_usec], EAX
- push [dwTvAddr]
- push 0
- push 0
- push [dwSetAddr]
- push 0
- call [select]
- push [dwSetAddr]
- push [dwSocket]
- call FD_ISSET
- cmp EAX, TRUE
- jne .fail
- push 0
- push [dwBufSize]
- push [pBuf]
- push [dwSocket]
- call [recv]
- jmp .out
- .fail:
- mov EAX, FALSE
- .out:
- ret
- endp
Add Comment
Please, Sign In to add comment