Вопрос 2: Спустя некоторое время программа вываливается с ошибкой 11010 (нехватка ресурсов). Собственно программа в бесконечном цикле посылает icmp-пакеты )) Code: .sendicmp: invoke IcmpSendEcho, [handle], [addr], 0, 0, 0, reply, 100, timeout cmp eax, 0 je .error invoke Sleep, sleep jmp .sendicmp константа sleep = 3000 (мс). может следует увеличить слип? до 10к? 15к? больше? естественно в реальном проекте ошибка вываливаться не будет. Еще кто работал с icmpsendecho: что не так? значение ReplySize я взял от "балды" в msdn написано, что это должна быть сумма размеров структуры ICMP_ECHO_REPLY и поля RequestSize. Последний у меня равен нулю, а размер структуры - sizeof.ICMP_ECHO_REPLY. Или я не прав? теперь еще 1 вопрос - как можно сделать авторестарт после завершения программы с ошибкой? спасибо.
Еще раз привет всем: Code: format PE GUI 4.0 entry main include 'win32a.inc' section '.data' data readable writeable ip db '127.0.0.1', 0 wdata WSADATA saddr sockaddr_in AF_INET, 80, ip sock dd ? hello db 'GET http://localhost/hello.php HTTP/1.0', 10, 13 db 'Host: localhost', 0 section '.code' code readable executable main: invoke WSAStartup, 0101h, wdata invoke socket, AF_INET, SOCK_STREAM, 6 mov [sock], eax invoke connect, [sock], saddr, sizeof.sockaddr_in invoke send, [sock], hello, 57, 0 invoke closesocket, [sock] invoke ExitProcess, 0 section '.idata' import data readable library kernel32, 'kernel32.dll',\ user32, 'user32.dll',\ wsock32, 'wsock32.dll' include 'api\kernel32.inc' include 'api\user32.inc' include 'api\wsock32.inc' В hello.php находится код чего-то, что напоминает счетчик посещений (при каждом обращении к странице прибавляет к значению счетчика еденицу). Но почему то указанный код не работает Еще раз заранее спасибо всем тем, кто ответит.
HTTP запросы должна заканчиваться 2-мя crlf так что типа hello db 'GET http://localhost/hello.php HTTP/1.0', 10, 13 db 'Host: localhost', 13,10,13,10,0 ну и соответственно перерасчитай длинну посылаемых данных в invoke send, [sock], hello, 57, 0 лучше заюзай типа invoke lstrlenA, hello invoke send, [sock], hello, eax, 0
насчет пинга вот код который я юзал - Code: ; необходимые структуры struct IP_OPTION_INFORMATION Ttl db 0 Tos db 0 Flags db 0 OptionsSize db 0 OptionsData dd 0 ends struct ICMP_ECHO_REPLY Address dd 0 Status dd 0 RoundTripTime dd 0 DataSize dw 0 Reserved dw 0 Data dd 0 Options IP_OPTION_INFORMATION PingBuf db 32 dup (0) ends struct TInAddr b1 db 0 b2 db 0 b3 db 0 b4 db 0 ends Optionss IP_OPTION_INFORMATION InAddr TInAddr Reply ICMP_ECHO_REPLY PingBuf db 32 dup (0) proc Ping InetAddress,ttl ; пингование передается адрес сервера и ТТЛ invoke IcmpCreateFile ; cmp eax,INVALID_HANDLE_VALUE ; если не удалось создать "ICMP файл" je exitp mov [handle],eax ;сохраним дискриптор invoke gethostbyname,[InetAddress] ; попытка отпределяни IP адреса cmp eax,0 ; если не удалось je exitp ; то mov eax,[eax+0ch] ; заполение необходимой струкуры mov eax,[eax] mov cl,[eax] mov [InAddr.b1],cl mov cl,[eax+1] mov [InAddr.b2],cl mov cl,[eax+2] mov [InAddr.b3],cl mov cl,[eax+3] mov [InAddr.b4],cl mov eax,PingBuf mov [Reply.Data],eax mov [Reply.DataSize],32 mov al,byte [ttl] mov [Optionss.Ttl],al mov eax,[InAddr] invoke IcmpSendEcho,[handle],eax,PingBuf,32,Optionss,Reply,92,3000 ; пинг cmp eax,0 je exitp mov eax,1 ret exitp: xor eax,eax ret endp
slesh, спасибо огромное за ответы Так всеравно не вышло Кстати собственно через lstrlen и было, только не отсылал и посчитал и поставил конкретное значение при запуске данная программа просто висит в процессах, никаких пакетов, ничего не отсылвается. может лучше сделать через wininet? действительно насчет icmp - он и этот код отлично пингует, но вываливается через некоторое время с ошибкой.
PingBuf - это просто буфер для данных которые идут в нагрузку с пингом. В ответ должны приходить этиже данные для того чтобы проверить корректность работы. насчет того что прога висит в процессах итд итп. то советую тебе поглядеть как ты реализовал заполнение addr для connect погляди исходники моего спам бота - он в разделе избранное валяется вроде. написан полностью на FASM и там была функция для посылки HTTP запроса на сервак и корректное получение ответа.
спасибо сейчас получилось - изменил элементы sockaddr_in: 1. перед загрузкой элемента sin_port обработал его функцией htons 2. перед загрузкой элемента sin_addr обработал его функцией inet_addr снифер пакеты отслеживает, но эффекта 0 вот код на асме: Code: format PE GUI 4.0 entry main include 'win32a.inc' section '.data' data readable writeable ip db '127.0.0.1', 0 wdata WSADATA saddr sockaddr_in sock dd ? hello db 'GET http://localhost/hello.php HTTP/1.0', 13, 10 db 'Host: localhost', 13, 10, 13, 10, 0 section '.code' code readable executable main: invoke WSAStartup, 0101h, wdata invoke socket, AF_INET, SOCK_STREAM, 6 mov [sock], eax mov [saddr.sin_family], AF_INET invoke htons, 80 mov [saddr.sin_port], ax invoke inet_addr, ip mov [saddr.sin_addr], eax invoke connect, [sock], saddr, sizeof.sockaddr_in invoke lstrlen invoke send, [sock], hello, eax, 0 invoke closesocket, [sock] invoke ExitProcess, 0 section '.idata' import data readable library kernel32, 'kernel32.dll',\ user32, 'user32.dll',\ wsock32, 'wsock32.dll' include 'api\kernel32.inc' include 'api\user32.inc' include 'api\wsock32.inc' вот скрипт hello.php (в php не шарю ) Code: <?php $handle = fopen("hello.txt", "a+"); $count = fread($handle, filesize("hello.txt")); fclose($handle); $count++; $handle = fopen("hello.txt", "w"); fwrite($handle, $count); fclose($handle); echo $count; ?> в итоге в файле hello.txt цифра должна при каждом обращении увеличиваться.
советую заюзать вот такой вот скрипт PHP: <? $handle = fopen('hello.txt', 'a+'); $count = intval(fgets($handle)); fclose($handle); $count++; $handle = fopen('hello.txt', 'w'); fputs($handle, $count); fclose($handle); echo $count; ?>
thx, но тут вроде не совсем от скрипта зависит это что-то с самой программой. можно легко сделать на wininet, но хотелось попрактиковаться в winsock.
1) у тебя скрипт почемуто выдавал ошибку. 2) invoke lstrlen А где параметры? забыл указать строку длинну которой считать
вот рабочий код. Я тут внес некоторую оптимизацию ) Теперь размер 1024 байта после компила ) Code: format PE GUI 4.0 entry main include 'win32a.inc' section '.text' data readable writeable executable import ;--------------- IMPORT ------------------- library kernel32, 'kernel32.dll',\ wsock32, 'wsock32.dll' include 'api\kernel32.inc' include 'api\wsock32.inc' ;--------------- CODE ------------------- main: invoke WSAStartup, 0101h, wdata invoke socket, AF_INET, SOCK_STREAM, 6 mov [sock], eax mov [saddr.sin_family], AF_INET invoke htons, 80 mov [saddr.sin_port], ax invoke inet_addr, ip mov [saddr.sin_addr], eax invoke connect, [sock], saddr, sizeof.sockaddr_in invoke lstrlen, hello invoke send, [sock], hello, eax, 0 invoke closesocket, [sock] invoke ExitProcess, 0 ;--------------- DATA ------------------- ip db '127.0.0.1', 0 hello db 'GET http://localhost/hello.php HTTP/1.0', 13, 10 db 'Host: localhost', 13, 10, 13, 10, 0 wdata WSADATA saddr sockaddr_in sock dd ?
1) хм у меня вроде норм все было. 2) действительно)) собственно туплю поставил обработку ошибок и нашел ошибку 10061 после вызова функции connect. посмотерл - на локалхост не заходит хотя сервер запущен. кароче сменил сервер на vertrigo (был easyphp). все норм работает. а почему у тебя в пинге ReplySize = 92? ведь размер структуры = 24 а буфера 32,
насчет 92 - это просто ошибка. когда переписывал. потому как включил буфер ответа в саму структуру, но забыл вычесть размер. ICMP_ECHO_REPLY - 28 байт + 32 буфер = 60 байт 60 + точно я забыл удрать +32 какраз и вышло 92 ) Да и код писал очень давно и криво, так что могут быть косяки всякие )
ну а в моем случае это будет размер ICMP_ECHO_REPLY + PingBuf = 24 + 32 = 56? структуру IP_OPTION_INFORMATION я не использую. но тогда после выполнения функции возвращается ошибка 11001. может следует взять с запасом или я ошибся в расчетах?
ни у кого нет примера серверной программы с использованием winapi? хотелось бы простой примерчик, например, выводящий полученную от клиента команду в messagebox'e. нашел немало такого, но не выходит перевести на асм спасибо
Вот что-то написал, но увы не работает: Code: format PE GUI 4.0 entry main include 'win32a.inc' section '.data' data readable writeable hello db 'hello', 0 error db 'Error: %d', 0 ip db '127.0.0.1', 0 wdata WSADATA laddr sockaddr_in caddr sockaddr_in sock dd ? csock dd ? temp rb 15 bufer rb 1024 section '.code' code readable executable main: invoke WSAStartup, 0101h, wdata invoke socket, AF_INET, SOCK_STREAM, 6 mov [sock], eax mov [laddr.sin_family], AF_INET invoke htons, 6112 mov [laddr.sin_port], ax invoke inet_addr, ip mov [laddr.sin_addr], eax invoke bind, [sock], laddr, sizeof.sockaddr_in cmp eax, 0 jne .error invoke listen, [sock], 0 .while: invoke accept, [sock], caddr, sizeof.sockaddr_in mov [csock], eax invoke recv, [csock], bufer, 1024, 0 invoke lstrcmp, bufer, hello cmp eax, 0 jne .while invoke MessageBox, 0, hello, hello, 0 jmp .while .error: invoke GetLastError invoke wsprintf, temp, error, eax invoke MessageBox, 0, temp, hello, MB_OK invoke ExitProcess, 0 section '.idata' import data readable library kernel32, 'kernel32.dll',\ user32, 'user32.dll',\ wsock32, 'wsock32.dll' include 'api\kernel32.inc' include 'api\user32.inc' include 'api\wsock32.inc'
2 e4key TCP/IP клиент, сервер вот на fasm аналоги тех моих процедур recvall и sendall Code: ; TCP/IP функции для правильной работы клиента ;отправить все ;ecx - len ;ebx - &buf proc sendall local total dd 0 .w: cmp [total],ecx jnl .exit add ebx,[total] sub ecx,[total] invoke send,[sock],ebx,ecx,0 inc eax jz .exit dec eax add [total],eax jmp .w .exit: ret endp ;принять все ;ecx - len ;ebx - &buf proc recvall local total dd 0 .w: cmp [total],ecx jnl .exit add ebx,[total] sub ecx,[total] invoke recv,[sock],ebx,ecx,0 inc eax jz .exit dec eax add [total],eax jmp .w .exit: ret endp INFO http://www.insidepro.com/kk/006/006r.shtml - очень советую по WinSock