send работает только в Olly, при запуске exe не работает

Тема в разделе "WASM.NETWORKS", создана пользователем CheGuevara, 28 ноя 2007.

  1. CheGuevara

    CheGuevara New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    6
    В общем проблема такая, написал прогу для отправки POST на сервер. Открываю сокет, соединяюсь, отправляю сообщение, закрываю сокет. В Olly если трассирую по F8 все работает на ура. Как только запускаю вне дебаггера, нифига не работает. Я поставил проверки на socket, connect и send.Ни одна из них не вылазит, т.е. все нормально.
     
  2. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    Прога под отладчиком обычно свободно пишет в секцию, которая при обычном запуске не имеет прав на запись. Проверь - не находятся ли у тебя записываемые структуры в инициализированных данных. Проще всего проверить - поставить всем секциям атрибут Writеable.
     
  3. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    А как Вы узнаете, что "нифига не работает"? У Вас есть доступ к серверу? Или просто прога падает?

    Возможно, Вы слишком рано закрываете сокет. Удачное завершение вызова send не говорит о том, что данные отправлены в сеть. Хотя по идее, по умолчанию вызов closesocket приводит к "вежливому" завершению соединения. Обычно, такие вещи отлаживают с помощью сниферов/сетевых анализаторов.
     
  4. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    может забыл WSAStartup ? А оля его вызывает (возможно)
     
  5. CheGuevara

    CheGuevara New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    6
    Нет дружище, WSAStartup не забыл, т.к. не было бы и сокета без нее, а Olly тут ни при чем. Но спасибо все равно.
     
  6. CheGuevara

    CheGuevara New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    6
    Насчет сокета, connect и send у меня идут друг за другом, т.е. я подразумеваю, что следующая функция не выполнится пока не выполниться предыдущая, так же после каждой проверка на ошибку. Так же ставил перед вызовом каждой ф-ии 20 сек задержку, я думал, что этого вполне достаточно. Подскажите какой сниф лучше или можно просто TCPView?
     
  7. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    TCPView просто показывает текущие коннекты.

    Попробуй Ethereal.
     
  8. CheGuevara

    CheGuevara New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    6
    Нет все данные в секции data она rw, на всякий случай сделал секцию кода на запись. Результат тот же.
     
  9. CheGuevara

    CheGuevara New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    6
    Я подразумеваю, что это связанно как-то с временем. Т.к. в дебаггере все намного медленнее делается, чем если прогу запустить. Но почему не вылазят ошибки я не понимаю. connect и socket проверяю на -1, а send проверяю на количество байт сообщения. Т.е. сколько отправлял, столько и должно отправиться.
     
  10. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    send не отправляет данные ( как это ни странно звучит :) ) - он лишь отдает их транспортному драйверу, а тот их передаст когда ему будет удобно :). А может вообще не передать. Например, из-за того, что сокет уже закрыт :). Когда вы под отладчиком идете по шагам между вызовами send и closesocket успеет отправиться целый вагон данных, а без отладчика - все случается очень быстро.
     
  11. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    А что такое бывает ??????????? ))))))))))))))))))))))) скорее проблема в задержке как уже сказали , но лучше код в студию , а то гадать так ...
     
  12. CheGuevara

    CheGuevara New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    6
    Вот и собственно код
    Код (Text):
    1. format PE GUI 4.0
    2. entry START
    3.  
    4. include 'C:\Program files\Radasm\Assembly\fasm\include\win32a.inc'
    5. include 'C:\Program files\RadASM\Assembly\fasm\Projects\conststr.asm'
    6.  
    7.  
    8. section '.text' code readable writeable executable
    9.  
    10. START:
    11.     invoke GetModuleHandle,eax
    12.     mov [hModule],eax
    13.    
    14.     invoke CreateThread,NULL,NULL,ThreadCounting,NULL,0,[hThread]; создаем тред
    15.                                                                  ; для подсчета кол-ва символов
    16.    
    17.     invoke WSAStartup,VERSION1_1,lpWSADATA          ; проверка установлена ли
    18.     test eax,eax                                    ; wsocks 1.1
    19.     push lpWinSockNotInstalled                      ;
    20.     jnz CRITICERRORS                                ;
    21.    
    22.     invoke socket,AF_INET,SOCK_STREAM,PCL_NONE      ; открываем сокет
    23.     cmp eax,SOCKET_ERR                              ; проверка создался
    24.     push lpSocketNotCreated                         ; ли сокет
    25.     je CRITICERRORS                                 ;
    26.     mov [hSocket],eax                               ; сохраняем хэндл сокета
    27.    
    28.     mov [lpSOCKADDR.sock_family],AF_INET            ; заполнение структуры SOCKADDR
    29.     mov [lpSOCKADDR.sock_port],PORT                 ;
    30.     mov [lpSOCKADDR.sock_addr],HOST_IP              ;
    31.     invoke connect,[hSocket],lpSOCKADDR,SIZE_OF_SOCKADDR; установка соединения
    32.     cmp eax,SOCKET_ERR                              ; проверка установилось ли соединение
    33.     push lpConnectionNotEstablished                 ;      
    34.     je CRITICERRORS                                 ;
    35.    
    36.    
    37.     invoke DialogBoxParam,[hModule],1,0,DlgProc,0
    38.     jmp EXIT
    39.    
    40.  
    41. CRITICERRORS:
    42.     pop eax
    43.     invoke MessageBox,0,eax,lpError,MB_ICONERROR
    44.      
    45. EXIT:
    46.     invoke ExitProcess,0
    47. proc SMSSending
    48.    
    49.     invoke GetDlgItemText,[hDialog],EDT_NUMBER,lpSendingNumber,12
    50.     ;здесь проверка номера
    51.    
    52.     ; проверка онлайн
    53.    
    54.     ; если номер нормальный то продолжаем формирование запроса POST
    55.    
    56.    
    57.     mov [lpSendingNumber+11],0x26   ; Записываем в POST запрос после номера телефона знак "&"
    58.                                     ; т.к. предыдущая команда его затирает
    59.    
    60.     ;помещаем текст сообщения в POST запрос
    61.     cld
    62.     xor ecx,ecx
    63.     lea esi,[lpMessageText]
    64.     lea edi,[lpSendingThirdPart+7]
    65.     mov byte cl,[lpMessageLenHex]
    66.     rep movsb
    67.    
    68.     ;помещаем данные после текста СМС сообщения в POST запрос
    69.     xor ebx,ebx
    70.     mov byte bl,[lpMessageLenHex]
    71.     lea esi,[lpSendingLastPart]
    72.     lea edi,[lpSendingThirdPart+7+ebx]
    73.     mov ecx,11
    74.     rep movsb
    75.    
    76.    
    77.     lea esi,[lpMessageLenASCII]                 ; заполняем
    78.     lea edi,[lpSendingThirdPart+7+ebx+11]       ; поле Content-Length
    79.     mov ecx,3                                   ;
    80.     rep movsb                                   ;
    81.                                
    82.     xor eax,eax
    83.     mov al,[lpMessageLenHex]
    84.     add al,51                                   ; в eax длина передаваемого методом POST сообщения
    85.    
    86.    
    87.     mov bl,0x0A                                 ; этот блок переводит Hex значение числа символов в ASCII строку
    88.     div bl                                      ; делим на основание 10
    89.     add ah,0x30                                 ; прибавив 0x30 получим ASCII код цифры
    90.     mov [lpPOSTMessageLenASCII+2],ah            ; единицы
    91.     xor ah,ah
    92.     div bl
    93.     add al,0x30
    94.     mov [lpPOSTMessageLenASCII],al              ; сотни
    95.     add ah,0x30
    96.     mov [lpPOSTMessageLenASCII+1],ah            ; десятки
    97.    
    98.    
    99.     lea esi,[lpPOSTMessageLenASCII]             ; заполняем количество символов сообщения
    100.     lea edi,[lpSendingStringLenASCII]           ; в запросе POST
    101.     mov ecx,3
    102.     rep movsb
    103.    
    104.    
    105.     mov bl,[lpMessageLenHex]                    ; заполняем
    106.     mov [lpSendingThirdPart+ebx+7+11+3],0x0D    ; последние символы в строке POST
    107.     mov [lpSendingThirdPart+ebx+7+11+4],0x0A    ; запроса
    108.     mov [lpSendingThirdPart+ebx+7+11+5],0x00    ;
    109.    
    110.    
    111.     ;рассчет полной длины сообщения POST
    112.     xor eax,eax
    113.     mov al,[lpMessageLenHex]                    ; длина СМС сообщения
    114.     add eax,0x1ED                               ; длина оставшейся части POST запроса
    115.     mov ebx,eax                                 ; копируем кол-во передаваемых байт в ebx
    116.                                                 ; ф-ия send возвращает в eax кол-во переданных байт
    117.    
    118.     invoke send,[hSocket],lpSendingFirstPart,ebx,0
    119.     cmp ebx,eax                     ; если количество отправленных и переданных бит не совпадает
    120.     je SMSSENDED
    121.     invoke GetLastError
    122.     invoke MessageBox,0,lpNotSMSSended,lpCaption,MB_ICONERROR; то выводим сообщение об ошибке
    123.     jmp SMSNOTSENDED
    124. SMSSENDED:
    125.     invoke MessageBox,0,lpSMSSended,lpCaption,MB_OK
    126. SMSNOTSENDED:  
    127.     ret
    128. endp
    129. proc DeliveryChecking
    130.     invoke MessageBox,0,lpTextDelivered,lpCaption,MB_OK
    131.    
    132.     ret
    133. endp
    134. proc ThreadCounting,param
    135. ; Процедура подсчета символов в сообщении   
    136.         xor eax,eax             ; обнуляем счетчик символов
    137. COUNTOFCHARS:  
    138.         invoke GetDlgItemText,[hDialog],EDT_MSG,lpMessageText,162
    139.         xor ecx,ecx             ; обнуляем счетчик символов промежуточный
    140.         mov edi,lpMessageText   ; записываем указатель на текст сообщения
    141.         repne scas byte [edi]   ; подсчитываем количество символов (результат в еах)
    142.         cmp al,MSG_MAX_CHAR     ; сравниваем с максимальным количеством символов в сообщении
    143.         je OVERFLOW             ; если перебор то обрабатываем
    144.         mov [lpMessageLenHex],al
    145.        
    146.        
    147.         mov byte cl,[lpMessageLenHex]
    148.         mov al,0x0A0
    149.         sub al,cl
    150.                
    151.         mov bl,0x0A             ; этот блок переводит Hex значение числа символов в ASCII строку
    152.         div bl                  ; делим на основание 10
    153.         add ah,0x30             ; прибавив 0x30 получим ASCII код цифры
    154.         mov [lpMessageLenASCII+2],ah    ; единицы
    155.         xor ah,ah
    156.         div bl
    157.         add al,0x30
    158.         mov [lpMessageLenASCII],al      ; сотни
    159.         add ah,0x30
    160.         mov [lpMessageLenASCII+1],ah    ; десятки
    161.        
    162.         invoke SetDlgItemText,[hDialog],EDT_LEN,lpMessageLenASCII ; выводим количество символов
    163.         invoke Sleep,100                                     ; с периодом 0.1 сек
    164.         jmp COUNTOFCHARS
    165. OVERFLOW:        
    166.         mov [lpMessageText+MSG_MAX_CHAR-1],0x00              ; если переполнение то выводим сообщение и
    167.         invoke SetDlgItemText,[hDialog],EDT_MSG,lpMessageText; не писать сообщение дальше
    168.         invoke EnableWindow,[hDialog],FALSE                  ; Деактивация окна на время появления мессаджбокса
    169.         invoke MessageBox,0,lpMessageOverflow,lpCaption,MB_ICONWARNING; МессаджБокс о превышении лимита в 160 сиволов
    170.         invoke EnableWindow,[hDialog],TRUE                   ; ;Активация окна на время появления мессаджбокса
    171.         ;invoke DefDlgProc,[hDialog],WM_ENABLE,1,0
    172.         jmp COUNTOFCHARS
    173. ret
    174. endp   
    175. proc DlgProc,hWnd,uMsg,wParam,lParam
    176.        
    177.     mov eax,[uMsg]
    178.     cmp eax,WM_COMMAND
    179.     je  COMMAND
    180.     cmp eax,WM_INITDIALOG
    181.     je  INITDIALOG
    182.     cmp eax,WM_CLOSE
    183.     je  CLOSEDIALOG
    184.     xor eax,eax  
    185.     jmp ENDDLGPROC
    186.  
    187. INITDIALOG:
    188.     mov eax,[hWnd]
    189.     mov [hDialog],eax
    190.     invoke SetFocus,eax
    191.     mov eax,TRUE
    192.     jmp ENDDLGPROC
    193.    
    194. COMMAND:
    195.     mov eax,[wParam]
    196.     cmp ax,BTN_SEND
    197.     je  BTNSEND
    198.     cmp ax,BTN_DELIVERY
    199.     je  BTNDELIVERY
    200.    
    201.     BTNSEND:
    202.         shr eax,16
    203.         cmp ax,BN_CLICKED
    204.         jne ENDDLGPROC
    205.         call SMSSending
    206.     jmp ENDDLGPROC
    207.  
    208.     BTNDELIVERY:
    209.         shr eax,16
    210.         cmp ax,BN_CLICKED
    211.         jne ENDDLGPROC
    212.         call DeliveryChecking
    213.     jmp ENDDLGPROC
    214.  
    215. CLOSEDIALOG:
    216.     invoke EndDialog,[hWnd],0
    217.     mov eax,TRUE
    218. ENDDLGPROC:
    219.     ret
    220. endp
    221.     ;=========== секция данных=========================
    222. ; хэндлы
    223. hModule dd 0    ; хэндл основного модуля
    224. hDialog dd 0    ; хэндл диалогового окна
    225. hThread dd 0    ; хэндл треда
    226. hSocket dd 0    ; хэндл сокета
    227.  
    228.  
    229. ; текстовые строки
    230. lpCaption               db "Отправка СМС",0
    231. lpTextDelivered         db "Сообщение доставлено",0
    232. lpSMSSended             db "Сообщение успешно отправлено",0
    233. lpNotSMSSended          db "Не удалось отправить сообщение",0
    234. lpMessageOverflow       db "Переполнено",0
    235. lpError                 db "Ошибка!",0
    236. lpWinSockNotInstalled   db "Библиотека WinSock32 не установлена",0
    237. lpSocketNotCreated      db "Не удалось создать сокет",0
    238. lpConnectionNotEstablished db "Не удалось установить соединение с сервером МТС",0
    239.  
    240. ; структуры
    241. lpWSADATA WSADATA
    242. lpSOCKADDR SOCKADDR
    243.  
    244.  
    245.  
    246. lpMessageText           db 161 dup(0),0             ; содержит само СМС сообщение
    247. lpMessageLenASCII       db 3 dup(0),0               ; содержит длину сообщения в буквенном виде
    248. lpMessageLenHex         db 0x00                     ; содержит длину СМС сообщения
    249. lpPOSTMessageLenASCII   db 3 dup(0),0
    250.  
    251. ; строки для создания POST запроса
    252. lpSendingLastPart   db "&theLength="
    253. lpSendingSMSLenASCII db 3 dup(0),0   
    254.  
    255. lpSendingFirstPart db "POST /sms/submit.php HTTP/1.1",0x0D,0x0A,\
    256.              "Accept: */*",0x0D,0x0A,\
    257.              "Referer: http://здесь адрес куда отправляем сообщение",0x0D,0x0A,\
    258.              "Accept-Language: en-us",0x0D,0x0A,\
    259.              "Content-Type: application/x-www-form-urlencoded",0x0D,0x0A,\
    260.              "Accept-Encoding: gzip, deflate",0x0D,0x0A,\
    261.              "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,\
    262.              "Host: 80.83.224.157",0x0D,0x0A,"Content-Length: "  
    263.  
    264. lpSendingStringLenASCII db 3 dup(0)
    265.  
    266.  
    267. lpSendingSecondPart     db  0x0D,0x0A,"Connection: Keep-Alive",0x0D,0x0A,\
    268.                         "Cache-Control: no-cache",0x0D,0x0A,\
    269.                         0x0D,0x0A,\
    270.                         "prefix=%2B&txtAddr="
    271.  
    272. lpSendingNumber     db 11 dup(0)
    273. lpSendingThirdPart  db "&txtSM="
    274.  
    275.  
    276. ;==================================================
    277.  
    278. section '.idata' import data readable writeable
    279.  
    280.   library kernel32, 'KERNEL32.DLL',\
    281.           user32,   'USER32.DLL',\
    282.           wsock32,  'WSOCK32.DLL'
    283.  
    284.     import  kernel32,\
    285.         GetModuleHandle,'GetModuleHandleA',\
    286.         ExitProcess,      'ExitProcess',\
    287.         CreateThread,     'CreateThread',\
    288.         Sleep,            'Sleep',\
    289.         GetLastError,     'GetLastError'
    290.  
    291.     import  user32,\
    292.         DialogBoxParam, 'DialogBoxParamA',\
    293.         EndDialog,    'EndDialog',\
    294.         SendMessage,      'SendMessageA',\
    295.         SetFocus,         'SetFocus',\
    296.         MessageBox,   'MessageBoxA',\
    297.         GetDlgItemText, 'GetDlgItemTextA',\
    298.         SetDlgItemText, 'SetDlgItemTextA',\
    299.         PostMessage,    'PostMessageA',\
    300.         EnableWindow,   'EnableWindow'
    301.        
    302.     import  wsock32,\
    303.         WSAStartup,     'WSAStartup',\
    304.         socket,         'socket',\
    305.         connect,        'connect',\
    306.         send,           'send'
    307. section '.rsrc' resource from 'SMS_SEND1.res' data readable
     
  13. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) ok vecherkom posmotru kak rabotaet