Winhttp+masm

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Flisk, 22 Mar 2012.

  1. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    Не могу никак отправить простой запрос с помощью Winhttp. Вроде все идеально написано, каждый параметр сверил с МСДН, в олли никаких ерроров, а сниффер показывает, что не стучит. Что за ерунда. В инете нет ни одного годного примера кода для масм, для Си есть, но портировать его не могу. :mad:

    Code:
    .386
    .model flat, stdcall
    option casemap:none
     
    include  E:\masm32\include\windows.inc
    include  E:\masm32\include\kernel32.inc
    include  E:\masm32\include\user32.inc
    include  E:\masm32\include\winhttp.inc
     
    includelib  \masm32\lib\kernel32.lib
    includelib  \masm32\lib\user32.lib
    includelib  \masm32\lib\winhttp.lib
     
     
    .data
    txtOne          db      'Work started...',13d,10d
    txtTwo          db      'WinHttpOpen Ok...',13d,10d
    txtThree        db      'WinHttpConnect Ok...',13d,10d
    txtFour         db      'WHC closed.',13d,10d
    txtFive         db      'WHO closed.',13d,10d
    txtOk           db      'All ok(:',13d,10d
    txtFail         db      'Fail):',13d,10d
    userAgent       db      'Opera/9.60 (Windows NT 5.1; U; en) Presto/2.1.1',0
    
    serverName1 dw '7', '7', '.', '8', '8', '.', '2', '1', '.', '3', 0 ;айпи яндекса, для этих функций нужен юникод
     
     
    .data?
    stdout          dd      ?
    whoHandle       dd      ?
    whcHandle       dd      ?
    cWritten        dd      ?
     
    .code
    start:
        invoke GetStdHandle, STD_OUTPUT_HANDLE          ;получаем дескриптор стандартного устройства вывода
        mov stdout, eax                                 ;записываем его в stdout
       
        invoke WriteConsoleA, stdout, ADDR txtOne, SIZEOF txtOne, ADDR cWritten, NULL           ;выводим сообщение о начале работы
       
        invoke WinHttpOpen, ADDR userAgent, WINHTTP_ACCESS_TYPE_NO_PROXY,\                       
                    WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, NULL
                                    ;запускаем фукцию без прокси
                                   
        mov whoHandle, eax      ;записываем результат функции в переменную
       
        cmp eax,0               ;проверяем, правильно ли отработала функция
        jz failedConnection     ;если нет-отправляем на выход
       
        invoke WriteConsoleA, stdout, ADDR txtTwo, SIZEOF txtTwo, ADDR cWritten, NULL           ;выводим сообщение о WinHttpOpen
       
        invoke WinHttpConnect, whoHandle, ADDR serverName1,\
                    INTERNET_DEFAULT_HTTP_PORT, NULL        ;запускаем присоединение к серверу
        mov whcHandle, eax      ;записываем результ в переменную
     
        cmp eax,0               ;проверяем, правильно ли отработала функция
        jz failedConnection     ;если нет-отправляем на выход
       
        invoke WriteConsoleA, stdout, ADDR txtThree, SIZEOF txtThree, ADDR cWritten, NULL   ;выводим сообщение о WinHttpConnect
       
        invoke WinHttpCloseHandle, whcHandle        ;пробуем закрыть хэндл   
       
        cmp eax, 0                  ;сравниваем результат отработки функции с 0
        jz failedConnection         ;если он == 0 =>не закрыт
       
        invoke WriteConsoleA, stdout, ADDR txtFour, SIZEOF txtFour, ADDR cWritten, NULL ;выводим сообщение о WinHttpClose(whc)
       
        invoke WinHttpCloseHandle, whoHandle        ;пробуем закрыть хэндл   
       
        cmp eax, 0                  ;сравниваем результат отработки функции с 0
        jz failedConnection         ;если он == 0 =>не закрыт
       
        invoke WriteConsoleA, stdout, ADDR txtFive, SIZEOF txtFive, ADDR cWritten, NULL ;выводим сообщение о WinHttpClose(who)
       
        invoke WriteConsoleA, stdout, ADDR txtOk,\
                    SIZEOF txtOk, ADDR cWritten, NULL           ;выводим сообщение о том, что всё ок
       
        jmp exit            ;выходим
        failedConnection:
            invoke WriteConsoleA, stdout, ADDR txtFail,\
                            SIZEOF txtFail, ADDR cWritten, NULL         ;выводим сообщение об ошибке
        exit:
            invoke ExitProcess, 0
    end start
     
  2. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    443
    Reputations:
    288
    где инклуд брал?запили инклуд,посмотрим.
     
  3. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    WinHttp.inc (взят на форуме Хатча + константы взяты откуда-то с Си файлов). Ачат почему-то ругается на инклуд, посему разместил тут
    http://paste.org.ru/?ky1b28

    WinHttp.Lib - http://rootkits.su/winhttp.lib
    Взял с студии.
     
  4. AnGeI

    AnGeI Elder - Старейшина

    Joined:
    8 Dec 2008
    Messages:
    395
    Likes Received:
    79
    Reputations:
    16
    Не отправляется, - проверил у себя.
    Если найдешь решение, плз скинь в тему, тоже интересно.
     
    #4 AnGeI, 23 Mar 2012
    Last edited: 23 Mar 2012
  5. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    А что ты ждешь? В коде ведь нет вызовов WinHttpOpenRequest и WinHttpSendRequest. Вполне вероятно, что фактически коннект не будет установлен до вызова этих функций
     
    _________________________
  6. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    Kaimi, спасибо.

    Добавил эти функции. Теперь фаервол показывает, что коннект вроде бы есть, но сниффер почему-то его не видит. Как можно все таки понять, рабочий код или нет?

    Добавил в код такие строки:

    Code:
    .data
    uri dw '\',0
    
    .data?
    whrHandle 		dd 		?
    
    .code
       invoke WinHttpOpenRequest,whcHandle,NULL,addr uri,NULL,WINHTTP_NO_REFERER,WINHTTP_DEFAULT_ACCEPT_TYPES,WINHTTP_FLAG_REFRESH
       
       mov whrHandle,eax
      invoke WinHttpSendRequest,whrHandle,WINHTTP_NO_ADDITIONAL_HEADERS,NULL,NULL,0,0,0 
    В инклуд:
    Code:
    WINHTTP_NO_REFERER equ 0
    WINHTTP_DEFAULT_ACCEPT_TYPES equ 0
    WINHTTP_NO_ADDITIONAL_HEADERS equ 0
    
    
    WINHTTP_FLAG_BYPASS_PROXY_CACHE equ 100h
    WINHTTP_FLAG_REFRESH equ WINHTTP_FLAG_BYPASS_PROXY_CACHE 
    upd. Только что посмотрел логи на принимающем сервере (поменял яндекс на другой), там вроде бы запрос пришел. Но снифферы не видят ничего, ни у меня, ни на дедиках. Почему так? винхттп нельзя перехватить? :eek:
     
    #6 Flisk, 23 Mar 2012
    Last edited: 23 Mar 2012