Написал небольшую библиотеку на ассемблере (MASM32) для работы с http-протоколом.
Реализованы следующие функции (stdcall):
1.SendPacket PROC \
http_ans_buffer :DWORD, \
http_ans_buffer_len :DWORD, \
http_host :DWORD, \
http_data :DWORD, \
http_service_uri :DWORD, \
http_cookies :DWORD, \
http_method :DWORD, \
http_referer :DWORD, \
http_add_headers :DWORD, \
http_proxy_ip :DWORD, \
http_proxy_port :DWORD, \
http_proxy_type :DWORD, \
http_proxy_user :DWORD, \
http_proxy_pass :DWORD, \
http_port :DWORD, \
http_answer_size :DWORD
Позволяет отправлять на сайты запрос и считывать ответ. Поддерживает прокси, сокс5, прокси и сокс5 с авторизацией.
http_ans_buffer - указатель на буфер, куда будет записан ответ сервера.
http_ans_buffer_len - длина этого буфера.
http_host - указатель на строку: хост, например, "ya.ru"
http_data - указатель на строку: данные для POST- или GET-запроса, например, "name=vasya&surname=pupkin"
http_service_uri - указатель на строку: service_uri, например, "/index.php". Могут быть 0, тогда используется значение по умолчанию "/"
http_cookies - указатель на строку: Cookies. Может быть 0.
http_method - метод - 0: GET или 1: POST
http_referer - указатель на строку: Http-Referer. Может быть 0.
http_add_headers - указатель на строку: дополнительные заголовки, после каждого заголовка должны идти символы перевода строки и возврата каретки (\r\n). Может быть 0.
http_proxy_ip - указатель на строку: IP-адрес прокси, может быть 0.
http_proxy_port - порт используемого прокси, должно быть 0, если прокси не используется
http_proxy_type - типа прокси: 0 - proxy, 1 - socks5.
http_proxy_user - указатель на строку: имя пользователя прокси, может быть 0
http_proxy_pass - указатель на строку: пароль прокси, может быть 0.
http_port - порт сайта, если 0, то используется порт 80.
http_answer_size - указатель на DWORD - сюда функция запишет размер принятого контента с заголовками. Может быть 0.
Возвращаемое значение:
0 - успех
1 - ошибка резолвинга доменного имени
2 - ошибка создания сокета
3 - ошибка подключения сокета
4 - ошибка выделения памяти
5 - ошибка отправки данных в сокет
6 - ошибка чтения из сокета
7 - недопустимый IP-адрес прокси-сервера
8 - ошибка отправки пакета авторизации socks5
9 - ошибка получения пакета авторизации socks5
10 - ошибка сокс5-сервера (недопустимый ответ)
11 - неверный логин или пароль socks5-сервера
14 - ошибка подключения к socks5-серверу
15 - socks5-сервер требует авторизацию, но логин и пароль не указаны
2.base64_encode PROC \
string_to_encode :DWORD, \
result_buffer :DWORD, \
result_buffer_length :DWORD, \
data_length :DWORD
Вычисляет base64 от блока данных.
string_to_encode - указатель на данные для кодирования.
result_buffer - указатель на буфер для записи результата.
result_buffer_length - длина буфера для записи результата.
data_length - длина данных для кодирования.
Функция не возвращает значения.
3.base64_decode PROC \
string_to_decode :DWORD, \
result_buffer :DWORD, \
result_buffer_length :DWORD
Вычисляет декодированные данные из base64-строки.
string_to_decode - указатель на ANSI-строку для раскодирования.
result_buffer - указатель на буфер для записи результата.
result_buffer_length - длина буфера для записи результата.
Возвращаемое значение:
0 - успех
1 - ошибка выделения памяти
4.SocketInit PROC
Вызывается перед началом работы с интернетом.
Функция не возвращает значения.
5.SocketCleanup PROC
Вызывается после завершения работы с интернетом.
Функция не возвращает значения.
6.urlencodeW PROC text_to_convert :DWORD, result_buffer :DWORD, result_buffer_len :DWORD
Функция для url-кодирования Unicode-строки.
text_to_convert - указатель на Unicode-строку для кодирования.
result_buffer - указатель на буфер для записи результата.
result_buffer_length - длина буфера для записи результата.
Возвращаемое значение:
0 - успех
1 - ошибка выделения памяти
2 или 3 - ошибка конвертирования Unicode в UTF-8
7.urlencode PROC text_to_convert :DWORD, result_buffer :DWORD, result_buffer_len :DWORD
Функция для url-кодирования ANSI-строки.
text_to_convert - указатель на ANSI-строку для кодирования.
result_buffer - указатель на буфер для записи результата.
result_buffer_length - длина буфера для записи результата.
Функция не возвращает значения.
8.GetHttpHeader PROC content :DWORD, result_buffer :DWORD, result_buffer_len :DWORD
Функция, выделяющая заголовки из ответа сервера.
content - указатель на ответ сервера.
result_buffer - указатель на буфер для записи результата.
result_buffer_length - длина буфера для записи результата.
Функция не возвращает значения.
9.GetHttpBody PROC content :DWORD, result_buffer :DWORD, result_buffer_len :DWORD
Функция, выделяющая тело ответа из ответа сервера (только для текстовых данных).
content- указатель на ответ сервера.
result_buffer - указатель на буфер для записи результата.
result_buffer_length - длина буфера для записи результата.
Функция не возвращает значения.
9.GetHttpBodyEx PROC content :DWORD, content_length :DWORD, result_buffer :DWORD, result_buffer_len :DWORD
Функция, выделяющая тело ответа из ответа сервера (для любых данных, в том числе бинарных).
content - указатель на ответ сервера.
content_length - длина ответа сервера (можно использовать последний параметр из SendPacket).
result_buffer - указатель на буфер для записи результата.
result_buffer_length - длина буфера для записи результата.
Функция не возвращает значения.
10.GetCookies PROC headers :DWORD, result_buffer :DWORD, result_buffer_len :DWORD
Функция, выделяющая Cookies из заголовков ответа сервера.
headers - указатель на заголовки ответа сервера.
result_buffer - указатель на буфер для записи результата.
result_buffer_length - длина буфера для записи результата.
Функция не возвращает значения.
11.GetHTTPAnswer PROC content :DWORD
Функция, возвращающая код ответа сервера по тексту ответа сервера.
content - указатель на ответ или на заголовки ответа сервера.
Функция возвращает код ответа (DWORD).
12.MD5 PROC string :DWORD, result_buffer :DWORD
Функция, вычисляет MD5 от строки.
headers - указатель на ANSI-строку.
result_buffer - указатель на буфер для записи результата.
Возвращаемое значение:
0 - успех
1 - ошибка получения контекста шифрования
2 - ошибка создания MD5
3 - ошибка хеширования
4 - ошибка получения параметра хеша
Пример вызова использования библиотеки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
main PROC LOCAL buf[2048] :BYTE LOCAL buf2[2048] :BYTE .data yandex db "ya.ru",0 .code invoke SocketInit invoke SendPacket,addr buf,2048,offset yandex,0,0,0,0,0,0,0,0,0,0,0,0,0 invoke GetHttpBodyEx,addr buf,alen,addr buf2,2048 invoke MessageBox,0,addr buf2,offset yandex,0 ;выводим тело ответа invoke SocketCleanup invoke ExitProcess,0 ret main ENDP |
Скачать библиотеку и исходные коды можно тут: ZIP
Прикольная тема, да и еще на ассемблере! Спасибо!
Спасибо это то что мне надо! А то родные функции от винды складали какие-то мазохисты!
или у меня браузер глючит, или тут действительно желтый шрифт на белом фоне
Можно примеров побольше. Что то не догоняю пока как ей пользоваться, пока на экране одни ерроры рисуются. Я то понимаю , что сам что то намудил, вот и прошу побольше примеров.
Мне надо отправить POST данные (пароль,логин) и вернуть страничку в окошко.
Дело в том, что я зарегистрирован во многих партнерках, но в каждый раз заходить на их сайты это гемор, вот решил замутить чтобы все партнерки были в программке, тыкнул на ссылку и получил статистику.
Но как сделать,теоретически то понятно, но на практике нифига не прет.
Вот помощи буду от ВАС ждать.
DX, Подскажи, или опубликуй еще парочку примерчиков с этой библиотечкой.
Работает все хорошо, но никак не пойму, как принять страничку нормальной, а то у меня возвращаются теги HTML, а мне надо чтоб отображалась как буд-то в браузере.
Подскажи пожайлуста.
Эта либа не позволяет парсить каким-то образом хтмл-код, она контент возвращает как есть. Функции обработки сюда не включены.
Не плохо. Однако для реального применения не очень подходит.
Нет поддрежки асинхроного режима. (послал запрос и код продолжил выполнение а как будет получен ответ то вызовется кэлбек, это нужно для однопоточных программ, где программеры не имеют возможности или просто не хотят заморачиватся с потоками)
Нет поддержки https.
Нет поддержки gzip.
Нету движка для обработки кукисов, есть тока функция для из получения.
Для меня особо критичны первые два пункта остальное, так пожелания.
Допиши сам или юзай wininet/winhttp (для извращенцев - винсок).
Автор и так проделал огромную работу, под этот асм никто ничего путного не пишет вообще.
Спасибо, автор думаю не будет против, если я перепишу либру под FASM?
Не за что, переписывай, не жалко)