Что нового

[Данные, строки, Winpcap]Прочитать выходной бинарный файл с пойманными пакетами

valldar

Новичок
Сообщения
32
Репутация
2
Начал осваивать библиотеку-сниффер Winpcap.

Мне нужно автоматизировать некоторые манипуляции на avit0.ru. Раньше я все делал с помощью замечательной библиотеки WinHTTP.au3. Но теперь запросы на авторизацию отправляются в зашифрованном виде и я не могу авторизоваться.

Помучав поисковики, нашел библиотеку Winpcap.au3.
Суть моего решения в том, чтобы сначала произвести авторизацию на сайте через IE посредством IE.au3, потом, отловив пару пакетов с помощью Winpcap, извлечь из них cookies, которые в свою очередь передаются в WinHTTP для дальнейших операций.

Код авторизации:
Код:
#include <Array.au3>
#include <Ie.au3>

If WinExists("[CLASS:IEFrame]") Then
	WinActivate("[CLASS:IEFrame]")
	$oShell = _IEAttach('Windows Internet Explorer', 'windowtitle')
	_IENavigate($oShell, 'http://www.avito.ru/profile')
Else
	$oShell = _IECreate('http://www.avito.ru/profile', 1, 1)
EndIf
$login = _IEGetObjByName($oShell, 'login')
$pass = _IEGetObjByName($oShell, 'password')
$submit = _IEGetObjByName($oShell, 'submit')
_IEFormElementSetValue($login, 'login')
_IEFormElementSetValue($pass, 'password')
Run(@ScriptDir & '\Test.Exe')   ; test.exe - заранее скомпилированный сниффер на базе Winpcap.au3
ProcessWait('Test.Exe')
Sleep(1000)
_IEAction($submit, 'click')
_IENavigate($oShell, 'http://www.avito.ru')
_IEQuit($oShell)
If ProcessWaitClose('Test.Exe') Then
	MsgBox(0, '', 'Process Closed')
EndIf
$file = FileOpen(@ScriptDir & '\mycapture.pcap')
$packets = FileRead($file)
FileClose($file)
$cookie = StringRegExp($packets, '(?si)Cookie:(.?)' & @LF)
;MsgBox(0, '', $packets)  ; выводит какие-то две строки

Код сниффера:
Код:
#include <Winpcap.au3>
#include <File.au3>
#include <array.au3>

$winpcap=_PcapSetup() ; initialise the Library
$pcap_devices=_PcapGetDeviceList() ; Get the interfaces list for which a capture is possible

; Start a capture on interface #0, in promiscuous mode, for http packets only
$pcap=_PcapStartCapture($pcap_devices[0][0],"dst host avito.ru and tcp port 80",1)

; Open pcap file for writting
$pcapfile=_PcapSaveToFile($pcap,"mycapture.pcap")
If ($pcapfile=0) Then MsgBox(16,"Pcap error !",_PcapGetLastError())

; Write all http traffic to the file while IE exists...
While WinExists('[CLASS:IEFrame]')
    $packet=_PcapGetPacket($pcap)
    If IsArray($packet) Then _PcapWriteLastPacket($pcapfile)
		 EndIf
Wend

_PcapStopCaptureFile($pcapfile) ; Close pcap file
_PcapStopCapture($pcap) ; Stop capture
_PcapFree() ; release ressources

И так в итоге получаем файл mycapture.pcap с отловленными пакетами. (см. приложение).
Файл бинарный. И вот тут тупик.
Я не могу прочитать данные из этого файла средствами Autoit. Пробовал BinaryToString, Encoding.au3 - все без результата.
При этом если открыть файл блокнотом, то там есть то что мне нужно (cookies) в наглядном виде. И если через меню "Сохранить как" выбрать UTF8, и потом открыть этот файл через Autoit - все нормально открывается.

Прошу вашей помощи в прочтении файла mycapture.pcap. Критика/предложения приветствуются :smile:
Если кто-то может предложить альтернативное решение, с радость его посмотрю.
 

InnI

AutoIT Гуру
Сообщения
4,949
Репутация
1,443
valldar [?]
извлечь из них cookies
Вот так у меня получилось
Код:
$text = FileRead("mycapture.pcap")
$cookie = StringRegExp($text, "Cookie: (.*)\r", 3)
If IsArray($cookie) Then ConsoleWrite($cookie[0] & @LF)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
valldar,
Или так.
Код:
$sFile = @ScriptDir & '\mycapture.pcap'
;~ $hFile = FileOpen($sFile, FileGetEncoding($sFile))
;~ $sText = FileRead($hFile)
;~ FileClose($hFile)
$sText = FileRead($sFile)
;~ $sCookie = StringRegExpReplace($sText, '(?is).*(cookie[^\r\n]+)\r?\n.*', '$1')
;~ $sCookie = StringRegExpReplace($sText, '(?is).*(cookie.+?)\r?\n.*', '$1')
$sCookie = StringRegExpReplace($sText, '(?ims).*^(cookie.+?)\r?$.*', '$1')
If @extended = 1 Then
	ConsoleWrite($sCookie & @LF)
Else
	ConsoleWrite('error' & @LF)
EndIf
 
Автор
V

valldar

Новичок
Сообщения
32
Репутация
2
Спасибо! Оба варианта действительно работают.
Но я не понимаю почему содержимое файла не отображается? Собственно именно это у меня и вызвало недоумение.
Код:
$text = FileRead(@ScriptDir & '\mycapture.pcap')
MsgBox(0,'',$text)     ; выводит белеберду типа ФГІЎ в одну строку
$cookie = StringRegExp($text, "Cookie: (.*)\r", 3)
If IsArray($cookie) Then ConsoleWrite($cookie[0] & @LF)


Вот так те же самые каракули:
Код:
$sFile = @ScriptDir & '\mycapture.pcap'
$hFile = FileOpen($sFile, FileGetEncoding($sFile))
$Text = FileRead($hFile)
MsgBox(0,'',$text)
$cookie = StringRegExp($text, "Cookie: (.*)\r", 3)
If IsArray($cookie) Then ConsoleWrite($cookie[0] & @LF)


Т.е. куки он извлекает, значит данные есть, но не отображает их :stars:
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Функция MsgBox вызывает WinAPI функцию MessageBoxA, которая считает признаком завершения строки символ 0. AutoIt никак не изменяет передаваемые в функцию значения. Попробуйте этот код:
Код:
$text = FileRead(@ScriptDir & '\mycapture.pcap')
MsgBox(0,'',StringReplace($text, Chr(0), ' '))     ; Заменяет символ 0 пробелом
 
Верх