Guest User

Untitled

a guest
Jul 15th, 2018
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.83 KB | None | 0 0
  1. #### ASSEMBLER WINSOCK BY NOP0X90
  2.  
  3. proc FD_ZERO set
  4. mov EAX, [set]
  5. add EAX, fd_set.fd_count
  6. mov [EAX], 0
  7. ret
  8. endp
  9.  
  10. proc FD_SET fd, set
  11. mov EAX, [set]
  12. add EAX, fd_set.fd_count
  13. inc dword [EAX] ; Anzahl um 1 erhöhen
  14.  
  15. mov EBX, [EAX]
  16. dec EBX
  17. imul EBX, 4
  18. mov EAX, [set]
  19. add EAX, fd_set.fd_array
  20. add EAX, EBX ; EBX=anzahl der einträge * 4
  21.  
  22. mov EDX, [fd]
  23. mov [EAX], EDX ; schreibt den Eintrag hinter den letzten Eintrag.
  24. ret
  25. endp
  26.  
  27. proc FD_ISSET fd, set
  28. ;wenn fd_count=0, return false
  29. ;sonst in schleife alle sockets durchsuchen
  30. mov EAX, [set]
  31. add EAX, fd_set.fd_count
  32. cmp dword [EAX], 0
  33. je .false
  34. mov ECX, [EAX] ; fd_count nach ECX
  35. add EAX, fd_set.fd_array
  36. .loop:
  37. mov EBX, [EAX]
  38. cmp EBX, [fd]
  39. je .true
  40. dec ECX
  41. test ECX, ECX
  42. jz .false
  43. add EAX, 4
  44. jmp .loop
  45.  
  46. .false:
  47. mov EAX, FALSE
  48. jmp .out
  49. .true:
  50. mov EAX, TRUE
  51. .out:
  52. ret
  53. endp
  54.  
  55. proc InitializeSocket
  56. local dwStrucAddr: DWORD;
  57.  
  58. push sizeof.WSADATA
  59. call GetMem
  60. mov [dwStrucAddr], EAX
  61. push EAX
  62. push 0x2020
  63. call [WSAStartup]
  64. cmp EAX, NULL
  65. jne .fail
  66.  
  67. push IPPROTO_TCP
  68. push SOCK_STREAM
  69. push AF_INET
  70. call [socket]
  71. cmp EAX, INVALID_SOCKET
  72. je .fail
  73. push EAX
  74.  
  75. jmp .out
  76. .fail:
  77. call [WSAGetLastError]
  78. push 0
  79. .out:
  80. push [dwStrucAddr]
  81. push sizeof.WSADATA
  82. call FreeMem
  83. pop EAX
  84. ret
  85. endp
  86.  
  87. proc ConnectSocket wPort_, psIP_, dwSock
  88. local dwHost: DWORD;
  89. local wPort: WORD;
  90. local dwStrucAddr: DWORD;
  91.  
  92. push [psIP_]
  93. call [inet_addr]
  94. cmp EAX, INADDR_NONE
  95. je .fail
  96. mov [dwHost], EAX
  97.  
  98. push [wPort_]
  99. call [htons]
  100. cmp AX, 0
  101. je .fail
  102. mov [wPort], AX
  103.  
  104. push sizeof.sockaddr_in
  105. call GetMem
  106. mov [dwStrucAddr], EAX
  107.  
  108. mov EDX, [dwHost]
  109. mov BX, [wPort]
  110. mov [EAX+sockaddr_in.sin_family], AF_INET
  111. mov [EAX+sockaddr_in.sin_port], BX
  112. mov [EAX+sockaddr_in.sin_addr], EDX
  113.  
  114. push sizeof.sockaddr_in
  115. push [dwStrucAddr]
  116. push [dwSock]
  117. call [connect]
  118. cmp EAX, 0
  119. jne .fail
  120.  
  121. jmp .out
  122. .fail:
  123. mov EAX, 0
  124. .out:
  125. ret
  126. endp
  127.  
  128. proc SendHTTPGetRequest psURL, psHost, dwSocket
  129. local dwURLLen: DWORD
  130. local dwHostLen: DWORD
  131. local dwWriteAddr: DWORD
  132. local dwHeaderAddr: DWORD
  133.  
  134. mov EBX, .end_all-.get
  135.  
  136. push [psURL]
  137. call StrLen
  138. add EBX, EAX
  139. mov [dwURLLen], EAX
  140.  
  141. push [psHost]
  142. call StrLen
  143. add EBX, EAX
  144. mov [dwHostLen], EAX
  145.  
  146. push EBX
  147. call GetMem
  148. mov [dwWriteAddr], EAX
  149. mov [dwHeaderAddr], EAX
  150.  
  151. push .get
  152. push EAX
  153. push .http-.get
  154. call MemCpy ; Schreibe GET
  155.  
  156. add [dwWriteAddr], EAX
  157.  
  158. push [psURL]
  159. push [dwWriteAddr]
  160. push [dwURLLen]
  161. call MemCpy ; Schreibe URL
  162.  
  163. add [dwWriteAddr], EAX
  164.  
  165. push .http
  166. push [dwWriteAddr]
  167. push .host-.http
  168. call MemCpy ; Schreibe HTTP/1.1
  169.  
  170. add [dwWriteAddr], EAX
  171.  
  172. push .host
  173. push [dwWriteAddr]
  174. push .end_header-.host
  175. call MemCpy ; Schreibe Host:
  176.  
  177. add [dwWriteAddr], EAX
  178.  
  179. push [psHost]
  180. push [dwWriteAddr]
  181. push [dwHostLen]
  182. call MemCpy ; Schreibe host-adresse
  183.  
  184. add [dwWriteAddr], EAX
  185.  
  186. push .end_header
  187. push [dwWriteAddr]
  188. push .end_all-.end_header
  189. call MemCpy ; Schreibe abschließende \r\n\r\n
  190.  
  191. push [dwHeaderAddr]
  192. call StrLen
  193.  
  194. push [dwSocket]
  195. push [dwHeaderAddr]
  196. push EAX
  197. push 100
  198. call SendTextWithBlock
  199.  
  200. ret
  201.  
  202. .get:
  203. db 'GET '
  204. .http:
  205. db ' HTTP/1.1'
  206. .host:
  207. db CR, LF, 'Host: '
  208. .end_header:
  209. db CR, LF, CR, LF, 0
  210. .end_all:
  211.  
  212. endp
  213.  
  214. proc SendTextWithBlock dwBlockMs, dwTextSize, psText, dwSocket
  215. local dwSetAddr: DWORD
  216. local dwTvAddr: DWORD
  217.  
  218. push sizeof.fd_set
  219. call GetMem
  220. mov [dwSetAddr], EAX
  221.  
  222. push sizeof.timeval
  223. call GetMem
  224. mov [dwTvAddr], EAX
  225.  
  226. push [dwSetAddr]
  227. push [dwSocket]
  228. call FD_SET
  229.  
  230. mov EAX, [dwBlockMs]
  231. mov EBX, [dwTvAddr]
  232. mov [EBX+timeval.tv_sec], 0
  233. mov [EBX+timeval.tv_usec], EAX
  234.  
  235. push [dwTvAddr]
  236. push 0
  237. push [dwSetAddr]
  238. push 0
  239. push 0
  240. call [select]
  241.  
  242. push [dwSetAddr]
  243. push [dwSocket]
  244. call FD_ISSET
  245. cmp EAX, TRUE
  246. jne .fail
  247.  
  248. push 0
  249. push [dwTextSize]
  250. push [psText]
  251. push [dwSocket]
  252. call [send]
  253. jmp .out
  254.  
  255. .fail:
  256. mov EAX, 0
  257. .out:
  258. ret
  259. endp
  260.  
  261. proc RecvTextWithBlock dwBlockMs, dwBufSize, pBuf, dwSocket
  262. local dwSetAddr: DWORD
  263. local dwTvAddr: DWORD
  264.  
  265. push sizeof.fd_set
  266. call GetMem
  267. mov [dwSetAddr], EAX
  268.  
  269. push sizeof.timeval
  270. call GetMem
  271. mov [dwTvAddr], EAX
  272.  
  273. push [dwSetAddr]
  274. push [dwSocket]
  275. call FD_SET
  276.  
  277. mov EAX, [dwBlockMs]
  278. mov EBX, [dwTvAddr]
  279. mov [EBX+timeval.tv_sec], 0
  280. mov [EBX+timeval.tv_usec], EAX
  281.  
  282. push [dwTvAddr]
  283. push 0
  284. push 0
  285. push [dwSetAddr]
  286. push 0
  287. call [select]
  288.  
  289. push [dwSetAddr]
  290. push [dwSocket]
  291. call FD_ISSET
  292. cmp EAX, TRUE
  293. jne .fail
  294.  
  295. push 0
  296. push [dwBufSize]
  297. push [pBuf]
  298. push [dwSocket]
  299. call [recv]
  300.  
  301. jmp .out
  302. .fail:
  303. mov EAX, FALSE
  304. .out:
  305. ret
  306. endp
Add Comment
Please, Sign In to add comment