Не могу никак отправить простой запрос с помощью Winhttp. Вроде все идеально написано, каждый параметр сверил с МСДН, в олли никаких ерроров, а сниффер показывает, что не стучит. Что за ерунда. В инете нет ни одного годного примера кода для масм, для Си есть, но портировать его не могу. 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
WinHttp.inc (взят на форуме Хатча + константы взяты откуда-то с Си файлов). Ачат почему-то ругается на инклуд, посему разместил тут http://paste.org.ru/?ky1b28 WinHttp.Lib - http://rootkits.su/winhttp.lib Взял с студии.
А что ты ждешь? В коде ведь нет вызовов WinHttpOpenRequest и WinHttpSendRequest. Вполне вероятно, что фактически коннект не будет установлен до вызова этих функций
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. Только что посмотрел логи на принимающем сервере (поменял яндекс на другой), там вроде бы запрос пришел. Но снифферы не видят ничего, ни у меня, ни на дедиках. Почему так? винхттп нельзя перехватить?