Код (Text): section '.code' code readable writable executable start: invoke WSAStartup, VERSION1_1, wsadata test eax, eax jz @f int3 @@: cmp [wsadata.wVersion], VERSION1_1 je @f int3 @@: invoke socket, AF_INET, SOCK_STREAM, PF_UNSPEC ;семейство, тип сокета, протокол cmp eax, INVALID_SOCKET jne @f int3 @@: mov [hsock], eax mov [saddr_in.sin_family], AF_INET ;семейство invoke htons, [port] mov [saddr_in.sin_port], ax ;порт invoke gethostbyname, server jnz @f int3 @@: .......... section '.data' data readable writable server db "ya.ru", 0 port dw 80 saddr_in sockaddr_in 0 wsadata WSADATA ? hsock dd ? gethostbyname возвращает ошибку 2AF9 (WSAHOST_NOT_FOUND). wtf? бинарь: http://data.cod.ru/64432537034
у меня тоже не работает (WSAHOST_NOT_FOUND), правда я сейчас через прокси сижу, даже пинг не работает тест-код Код (Text): ;================ MACRO DEFINITIONS ===================== ;High-level-like imported api calls macro. ;Lite version with procedure calls and string constants with "\n" support. macro IMPORTS [dll,funclist] { common data import forward dd 0,0,0,rva a#dll, rva v#dll common dd 0,0,0,0,0 end data forward v#dll: irp func,funclist \{ p\#func dd rva a\#func macro func [line*] \\{common match (arglist)tail,line* \\\{ push_r arglist \\\} call [p\#func] \\} \} dd 0 forward a#dll db `dll#".dll",0 irp func,funclist \{a\#func db 0,0,\`func,0\} } macro push_r [arg] { reverse if arg eqtype "" call @f local str str db arg,0 @@: fix_str str,$-str else pushd arg end if } macro fix_str pStr,nLen { repeat nLen-1 load w word from pStr+%-1 if w="\n" store word 0x0D0A at pStr+%-1 end if end repeat } ;============================================== ;Some console output macro (print and println) macro __print text { local size,str push_r size,0,0 call @f str db text @@: size = $-str fix_str str,size WriteFile([stdout]) } macro __printf format,[arglist] { common wsprintfA(gMsgBuf,format,arglist) local ..argcount ..argcount=0 forward ..argcount=..argcount+1 common add esp,8+..argcount*4 WriteFile([stdout],gMsgBuf,eax,0,0) } macro print format,[arg] {common if arg eq __print format else __printf format,arg end if } macro println format,[arglist] {common print format#"\n",arglist} ;********************* PROGPAM CODE ************************************************** format PE console section 'O_o' code readable executable writeable IMPORTS KERNEL32, < GetStdHandle,WriteFile,ReadFile,CreateFileA,SetFilePointer,GetLastError,CopyFileA,LoadLibraryA,CloseHandle,\ FreeLibrary,DeleteFileA,ExitProcess>,\ USER32,<wsprintfA>,\ WS2_32,<WSAStartup,gethostbyname,WSAGetLastError> entry $ GetStdHandle(-11) ;STD_OUTPUT_HANDLE mov [stdout],eax GetStdHandle(-10) ;STD_INPUT_HANDLE mov [stdin],eax ;=========================================== WSAStartup(0x0202,wsadata) println "WSAStartup OK" gethostbyname("ya.ru") test eax,eax jnz _ok WSAGetLastError() println "gethostbyname failed with error %d",eax jmp _exit _ok: println "gethostbyname returned OK" ;.... ;=========================================== _exit: println "\nPress [Enter] to close log." ReadFile([stdin],gMsgBuf,1,nRead,0) ExitProcess(0) ;_____________________________________________ ;Uninitialized data. Must be at end of section nRead dd ? org $-4 nWritten dd ? stdout dd ? stdin dd ? gMsgBuf db 1024 dup (?) ;--------------- wsadata db 0x4000 dup ? ;it's enough
Всё из-за того, что WSALookupServiceBegin внутри gethostbyname возвращает WSASERVICE_NOT_FOUND. Почему так происходит так и не понял.
Нашел ошибку: Код (Text): invoke htons, [port] ;!!! ......... port dw 80 ;!!!!!! push word ptr[xxxxxx] честно толкает в стэк два байта, а не дополненный нулями дворд. В результате стэку приходит ппц GoldFinch Код (Text): 004011F1 . E8 06000000 CALL test.004011FC ; PUSH ASCII "ya.ru" 004011F6 . 79 61 2E 72 75 00 ASCII "ya.ru",0 004011FC > FF15 90104000 CALL DWORD PTR DS:[<&WS2_32.gethostbyname>] ; \gethostbyname Красиво нах
это косяк инвока что он не выставляет принудительно размер операнда, т.е. не юзает pushd вместо push "call @f /db 'xxx',0/@@:" красиво, но тормозит прогу, годится только для небольших тестовых программ некритичных к быстродействию