В общем проблема такая, написал прогу для отправки POST на сервер. Открываю сокет, соединяюсь, отправляю сообщение, закрываю сокет. В Olly если трассирую по F8 все работает на ура. Как только запускаю вне дебаггера, нифига не работает. Я поставил проверки на socket, connect и send.Ни одна из них не вылазит, т.е. все нормально.
Прога под отладчиком обычно свободно пишет в секцию, которая при обычном запуске не имеет прав на запись. Проверь - не находятся ли у тебя записываемые структуры в инициализированных данных. Проще всего проверить - поставить всем секциям атрибут Writеable.
А как Вы узнаете, что "нифига не работает"? У Вас есть доступ к серверу? Или просто прога падает? Возможно, Вы слишком рано закрываете сокет. Удачное завершение вызова send не говорит о том, что данные отправлены в сеть. Хотя по идее, по умолчанию вызов closesocket приводит к "вежливому" завершению соединения. Обычно, такие вещи отлаживают с помощью сниферов/сетевых анализаторов.
Нет дружище, WSAStartup не забыл, т.к. не было бы и сокета без нее, а Olly тут ни при чем. Но спасибо все равно.
Насчет сокета, connect и send у меня идут друг за другом, т.е. я подразумеваю, что следующая функция не выполнится пока не выполниться предыдущая, так же после каждой проверка на ошибку. Так же ставил перед вызовом каждой ф-ии 20 сек задержку, я думал, что этого вполне достаточно. Подскажите какой сниф лучше или можно просто TCPView?
Нет все данные в секции data она rw, на всякий случай сделал секцию кода на запись. Результат тот же.
Я подразумеваю, что это связанно как-то с временем. Т.к. в дебаггере все намного медленнее делается, чем если прогу запустить. Но почему не вылазят ошибки я не понимаю. connect и socket проверяю на -1, а send проверяю на количество байт сообщения. Т.е. сколько отправлял, столько и должно отправиться.
send не отправляет данные ( как это ни странно звучит ) - он лишь отдает их транспортному драйверу, а тот их передаст когда ему будет удобно . А может вообще не передать. Например, из-за того, что сокет уже закрыт . Когда вы под отладчиком идете по шагам между вызовами send и closesocket успеет отправиться целый вагон данных, а без отладчика - все случается очень быстро.
А что такое бывает ??????????? ))))))))))))))))))))))) скорее проблема в задержке как уже сказали , но лучше код в студию , а то гадать так ...
Вот и собственно код Код (Text): format PE GUI 4.0 entry START include 'C:\Program files\Radasm\Assembly\fasm\include\win32a.inc' include 'C:\Program files\RadASM\Assembly\fasm\Projects\conststr.asm' section '.text' code readable writeable executable START: invoke GetModuleHandle,eax mov [hModule],eax invoke CreateThread,NULL,NULL,ThreadCounting,NULL,0,[hThread]; создаем тред ; для подсчета кол-ва символов invoke WSAStartup,VERSION1_1,lpWSADATA ; проверка установлена ли test eax,eax ; wsocks 1.1 push lpWinSockNotInstalled ; jnz CRITICERRORS ; invoke socket,AF_INET,SOCK_STREAM,PCL_NONE ; открываем сокет cmp eax,SOCKET_ERR ; проверка создался push lpSocketNotCreated ; ли сокет je CRITICERRORS ; mov [hSocket],eax ; сохраняем хэндл сокета mov [lpSOCKADDR.sock_family],AF_INET ; заполнение структуры SOCKADDR mov [lpSOCKADDR.sock_port],PORT ; mov [lpSOCKADDR.sock_addr],HOST_IP ; invoke connect,[hSocket],lpSOCKADDR,SIZE_OF_SOCKADDR; установка соединения cmp eax,SOCKET_ERR ; проверка установилось ли соединение push lpConnectionNotEstablished ; je CRITICERRORS ; invoke DialogBoxParam,[hModule],1,0,DlgProc,0 jmp EXIT CRITICERRORS: pop eax invoke MessageBox,0,eax,lpError,MB_ICONERROR EXIT: invoke ExitProcess,0 proc SMSSending invoke GetDlgItemText,[hDialog],EDT_NUMBER,lpSendingNumber,12 ;здесь проверка номера ; проверка онлайн ; если номер нормальный то продолжаем формирование запроса POST mov [lpSendingNumber+11],0x26 ; Записываем в POST запрос после номера телефона знак "&" ; т.к. предыдущая команда его затирает ;помещаем текст сообщения в POST запрос cld xor ecx,ecx lea esi,[lpMessageText] lea edi,[lpSendingThirdPart+7] mov byte cl,[lpMessageLenHex] rep movsb ;помещаем данные после текста СМС сообщения в POST запрос xor ebx,ebx mov byte bl,[lpMessageLenHex] lea esi,[lpSendingLastPart] lea edi,[lpSendingThirdPart+7+ebx] mov ecx,11 rep movsb lea esi,[lpMessageLenASCII] ; заполняем lea edi,[lpSendingThirdPart+7+ebx+11] ; поле Content-Length mov ecx,3 ; rep movsb ; xor eax,eax mov al,[lpMessageLenHex] add al,51 ; в eax длина передаваемого методом POST сообщения mov bl,0x0A ; этот блок переводит Hex значение числа символов в ASCII строку div bl ; делим на основание 10 add ah,0x30 ; прибавив 0x30 получим ASCII код цифры mov [lpPOSTMessageLenASCII+2],ah ; единицы xor ah,ah div bl add al,0x30 mov [lpPOSTMessageLenASCII],al ; сотни add ah,0x30 mov [lpPOSTMessageLenASCII+1],ah ; десятки lea esi,[lpPOSTMessageLenASCII] ; заполняем количество символов сообщения lea edi,[lpSendingStringLenASCII] ; в запросе POST mov ecx,3 rep movsb mov bl,[lpMessageLenHex] ; заполняем mov [lpSendingThirdPart+ebx+7+11+3],0x0D ; последние символы в строке POST mov [lpSendingThirdPart+ebx+7+11+4],0x0A ; запроса mov [lpSendingThirdPart+ebx+7+11+5],0x00 ; ;рассчет полной длины сообщения POST xor eax,eax mov al,[lpMessageLenHex] ; длина СМС сообщения add eax,0x1ED ; длина оставшейся части POST запроса mov ebx,eax ; копируем кол-во передаваемых байт в ebx ; ф-ия send возвращает в eax кол-во переданных байт invoke send,[hSocket],lpSendingFirstPart,ebx,0 cmp ebx,eax ; если количество отправленных и переданных бит не совпадает je SMSSENDED invoke GetLastError invoke MessageBox,0,lpNotSMSSended,lpCaption,MB_ICONERROR; то выводим сообщение об ошибке jmp SMSNOTSENDED SMSSENDED: invoke MessageBox,0,lpSMSSended,lpCaption,MB_OK SMSNOTSENDED: ret endp proc DeliveryChecking invoke MessageBox,0,lpTextDelivered,lpCaption,MB_OK ret endp proc ThreadCounting,param ; Процедура подсчета символов в сообщении xor eax,eax ; обнуляем счетчик символов COUNTOFCHARS: invoke GetDlgItemText,[hDialog],EDT_MSG,lpMessageText,162 xor ecx,ecx ; обнуляем счетчик символов промежуточный mov edi,lpMessageText ; записываем указатель на текст сообщения repne scas byte [edi] ; подсчитываем количество символов (результат в еах) cmp al,MSG_MAX_CHAR ; сравниваем с максимальным количеством символов в сообщении je OVERFLOW ; если перебор то обрабатываем mov [lpMessageLenHex],al mov byte cl,[lpMessageLenHex] mov al,0x0A0 sub al,cl mov bl,0x0A ; этот блок переводит Hex значение числа символов в ASCII строку div bl ; делим на основание 10 add ah,0x30 ; прибавив 0x30 получим ASCII код цифры mov [lpMessageLenASCII+2],ah ; единицы xor ah,ah div bl add al,0x30 mov [lpMessageLenASCII],al ; сотни add ah,0x30 mov [lpMessageLenASCII+1],ah ; десятки invoke SetDlgItemText,[hDialog],EDT_LEN,lpMessageLenASCII ; выводим количество символов invoke Sleep,100 ; с периодом 0.1 сек jmp COUNTOFCHARS OVERFLOW: mov [lpMessageText+MSG_MAX_CHAR-1],0x00 ; если переполнение то выводим сообщение и invoke SetDlgItemText,[hDialog],EDT_MSG,lpMessageText; не писать сообщение дальше invoke EnableWindow,[hDialog],FALSE ; Деактивация окна на время появления мессаджбокса invoke MessageBox,0,lpMessageOverflow,lpCaption,MB_ICONWARNING; МессаджБокс о превышении лимита в 160 сиволов invoke EnableWindow,[hDialog],TRUE ; ;Активация окна на время появления мессаджбокса ;invoke DefDlgProc,[hDialog],WM_ENABLE,1,0 jmp COUNTOFCHARS ret endp proc DlgProc,hWnd,uMsg,wParam,lParam mov eax,[uMsg] cmp eax,WM_COMMAND je COMMAND cmp eax,WM_INITDIALOG je INITDIALOG cmp eax,WM_CLOSE je CLOSEDIALOG xor eax,eax jmp ENDDLGPROC INITDIALOG: mov eax,[hWnd] mov [hDialog],eax invoke SetFocus,eax mov eax,TRUE jmp ENDDLGPROC COMMAND: mov eax,[wParam] cmp ax,BTN_SEND je BTNSEND cmp ax,BTN_DELIVERY je BTNDELIVERY BTNSEND: shr eax,16 cmp ax,BN_CLICKED jne ENDDLGPROC call SMSSending jmp ENDDLGPROC BTNDELIVERY: shr eax,16 cmp ax,BN_CLICKED jne ENDDLGPROC call DeliveryChecking jmp ENDDLGPROC CLOSEDIALOG: invoke EndDialog,[hWnd],0 mov eax,TRUE ENDDLGPROC: ret endp ;=========== секция данных========================= ; хэндлы hModule dd 0 ; хэндл основного модуля hDialog dd 0 ; хэндл диалогового окна hThread dd 0 ; хэндл треда hSocket dd 0 ; хэндл сокета ; текстовые строки lpCaption db "Отправка СМС",0 lpTextDelivered db "Сообщение доставлено",0 lpSMSSended db "Сообщение успешно отправлено",0 lpNotSMSSended db "Не удалось отправить сообщение",0 lpMessageOverflow db "Переполнено",0 lpError db "Ошибка!",0 lpWinSockNotInstalled db "Библиотека WinSock32 не установлена",0 lpSocketNotCreated db "Не удалось создать сокет",0 lpConnectionNotEstablished db "Не удалось установить соединение с сервером МТС",0 ; структуры lpWSADATA WSADATA lpSOCKADDR SOCKADDR lpMessageText db 161 dup(0),0 ; содержит само СМС сообщение lpMessageLenASCII db 3 dup(0),0 ; содержит длину сообщения в буквенном виде lpMessageLenHex db 0x00 ; содержит длину СМС сообщения lpPOSTMessageLenASCII db 3 dup(0),0 ; строки для создания POST запроса lpSendingLastPart db "&theLength=" lpSendingSMSLenASCII db 3 dup(0),0 lpSendingFirstPart db "POST /sms/submit.php HTTP/1.1",0x0D,0x0A,\ "Accept: */*",0x0D,0x0A,\ "Referer: http://здесь адрес куда отправляем сообщение",0x0D,0x0A,\ "Accept-Language: en-us",0x0D,0x0A,\ "Content-Type: application/x-www-form-urlencoded",0x0D,0x0A,\ "Accept-Encoding: gzip, deflate",0x0D,0x0A,\ "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QS 4.2.1.0; MRA 4.10 (build 01952); .NET CLR 2.0.50727; .NET CLR 1.1.4322)",0x0D,0x0A,\ "Host: 80.83.224.157",0x0D,0x0A,"Content-Length: " lpSendingStringLenASCII db 3 dup(0) lpSendingSecondPart db 0x0D,0x0A,"Connection: Keep-Alive",0x0D,0x0A,\ "Cache-Control: no-cache",0x0D,0x0A,\ 0x0D,0x0A,\ "prefix=%2B&txtAddr=" lpSendingNumber db 11 dup(0) lpSendingThirdPart db "&txtSM=" ;================================================== section '.idata' import data readable writeable library kernel32, 'KERNEL32.DLL',\ user32, 'USER32.DLL',\ wsock32, 'WSOCK32.DLL' import kernel32,\ GetModuleHandle,'GetModuleHandleA',\ ExitProcess, 'ExitProcess',\ CreateThread, 'CreateThread',\ Sleep, 'Sleep',\ GetLastError, 'GetLastError' import user32,\ DialogBoxParam, 'DialogBoxParamA',\ EndDialog, 'EndDialog',\ SendMessage, 'SendMessageA',\ SetFocus, 'SetFocus',\ MessageBox, 'MessageBoxA',\ GetDlgItemText, 'GetDlgItemTextA',\ SetDlgItemText, 'SetDlgItemTextA',\ PostMessage, 'PostMessageA',\ EnableWindow, 'EnableWindow' import wsock32,\ WSAStartup, 'WSAStartup',\ socket, 'socket',\ connect, 'connect',\ send, 'send' section '.rsrc' resource from 'SMS_SEND1.res' data readable