Вкратце опишу задачу.
Возникла необходимость перехватить запрос от некой программы. Для этого использовал известную библиотеку Winpcap.au3.
Собственно написал небольшой скрипт, направил перехват в файл.
Содержимое файла вот (текст подсократил):
Далее из этого файла необходимо извлечь определенный кусок информации, а именно "Tmpid = 03422610441214439293" (нужны цифры после знака равно). Ну тут вроде ничего сложного, составил регулярное выражение, вот что получилось в итоге.
Вроде бы всё просто и на первый взгляд работает, но на самом деле нет.
Удалось выяснить что ошибка возникает при выполнении этих строк:
Команда ConsoleWrite($link_cap) выдаёт вместо полного текста файла только это:
Почему не подцепляется полный текст файла ума не приложу.
Немного поэкспериментировал и выяснилось, что если созданный файл "loc.pcap" открыть например обычным блокнотом и просто ничего не изменяя сохранить, всё начинает работать и FileOpen/FileRead нормально отрабатывают.
Для тех кто хочет сам всё проверить прикладываю оригинальный файл "loc.pcap" (прикреплен во вложении в архиве loc.rar).
Для проверки можно использовать этот упрощенный скрипт (разумеется сам скрипт и файл loc.pcap из архива должны быть в одной папке):
Возникла необходимость перехватить запрос от некой программы. Для этого использовал известную библиотеку Winpcap.au3.
Собственно написал небольшой скрипт, направил перехват в файл.
Содержимое файла вот (текст подсократил):
Код:
ФГІЎ "ЋkTРN
B B !·oSXlрI
sП E 4l@ ЂAАЁ„_ЈVG
{ P€ Ђ # ґ"ЋkTЎk
B B lрI
sП !·oSX E 4z,@ |Ѓ_ЈVGАЁ„ P
{ЁKNќ€ЂBђ Џ ґ "ЋkTпk
6 6 !·oSXlрI
sП E (m@ ЂLАЁ„_ЈVG
{ P€ЁKNћP@)LБ "ЋkTYl
» » !·oSXlрI
sП E n@ Ђ|ЖАЁ„_ЈVG
{ P€ЁKNћP@)¶Ќ POST /cgi-bin/websrv.exe/UserUpdate?t=15197804 HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: ru-RU
Content-Type: application/x-www-form-urlencodedrn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; .NET4.0C; .NET4.0E)
Host: polymorf.ru
Content-Length: 26
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: hb=%DF_%C1%E5%E4%E0
tmpid=03422610441214439293"ЋkTЯЉ
Џ Џ lрI
sП !·oSX E Ѓz2@ |._ЈVGАЁ„ P
{ЁKNћЉЉP@?Z HTTP/1.1 100 Continue
Server: Microsoft-IIS/5.0
Date: Tue, 18 Nov 2014 18:21:18 GMT
"ЋkT'‹
6 6 !·oSXlрI
sП E (o@ ЂJАЁ„_ЈVG
{ PЉЉЁKNчP@Iъ #ЋkTeн Ф Ф lрI
sП !·oSX E Ж}4@ |з_ЈVGАЁ„ P
{ЁKNчЉЉP@>J HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Tue, 18 Nov 2014 18:21:19 GMT
Connection: close
Content-Type: text/html
Content-Length: 568
Content:
#ЋkT¦н 6 6 !·oSXlрI
sП E (p@ ЂIАЁ„_ЈVG
{ PЉЉЁKO•P?лIѓ #ЋkT¤п n n lрI
sП !·oSX E `}:@ |G_ЈVGАЁ„ P
{ЁKO•ЉЉP@eЎ <html><head><meta http-equiv='Content-Type'content='text/html; charset=windows-1251'></head>AutoriseTrue
2492
Malderin
123456
Суперов
Алексей
Александрович
2
575066546
10
8
1977
Рыбинск
750
60
0
8
4681
46810
0
119
0
10809
1009121354153433
-18976
176.15.225.13
03422610441214439293
0
2
575337015
60
41
80664
1755
0
20.01.2007
80
24
3647
5726
5551
0
2
0
-2
0
2000000000000000
1000000000000000
3
EndAutoriseTrue
#ЋkTГп 6 6 !·oSXlрI
sП E (q@ ЂHАЁ„_ЈVG
{ PЉЉЁKQОP?]GШ #ЋkT35 6 6 !·oSXlрI
sП E (r@ ЂGАЁ„_ЈVG
{ PЉЉЁKQОP?]GЧ #ЋkT'P < < lрI
sП !·oSX E (}@ | !_ЈVGАЁ„ P
{ЁKQОЉ‹P@G) #7#ЋkTkт B B !·oSXlрI
sП E 4t@ Ђ9АЁ„_ЈVG
| P*=lG Ђ 2Ї ґ#ЋkT•
B B lрI
sП !·oSX E 4Ѓr@ |;_ЈVGАЁ„ P
|™—і=*=lHЂBђГ: ґ #ЋkTМ
6 6 !·oSXlрI
sП E (u@ ЂDАЁ„_ЈVG
| P*=lH™—і>P@)m #ЋkT
Z Z !·oSXlрI
sП E Lv@ Ђ}АЁ„_ЈVG
| P*=lH™—і>P@)`Ї GET /cgi-bin/websrv.exe/inventory?tmpid=03422610441214439293&t=15198803 HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: ru-RU
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; .NET4.0C; .NET4.0E)
Host: polymorf.ru
Connection: Keep-Alive
$ЋkT7 Ц Ц lрI
sП !·oSX E ИЃЕ@ |T_ЈVGАЁ„ P
|™—і>*=nlP@lЖ# HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Tue, 18 Nov 2014 18:21:19 GMT
Connection: close
Content-Type: text/html
Content-Length: 60080
Content:
Далее из этого файла необходимо извлечь определенный кусок информации, а именно "Tmpid = 03422610441214439293" (нужны цифры после знака равно). Ну тут вроде ничего сложного, составил регулярное выражение, вот что получилось в итоге.
Код:
#include <Winpcap.au3>
Local $res_cap=0
$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],"tcp port 80",1)
; Open pcap file for writting
$pcapfile=_PcapSaveToFile($pcap,"loc.pcap")
If ($pcapfile=0) Then MsgBox(16,"Pcap error !",_PcapGetLastError())
While $res_cap = 0
$packet = _PcapGetPacket($pcap)
If IsArray($packet) Then _PcapWriteLastPacket($pcapfile)
$sFile = FileOpen(@ScriptDir&"\loc.pcap", 0)
$link_cap = FileRead($sFile)
ConsoleWrite($link_cap)
$tmpid = StringRegExp($link_cap, "(?s)(?i).*?tmpid=\d+?.*", 0)
;Если tmpd появилось в файле, то извлекаем его значение далее и выходим из цикла
If $tmpid = 1 then ;Если tmpd появилось в файле, то извлекаем егозначение далее и выходим из цикла
$tmpid = StringRegExpReplace($link_cap, "(?s)(?i).*?.*tmpid=(\d+).*", "$1")
$res_cap = 1
EndIf
Sleep(100)
Wend
ConsoleWrite($tmpid)
_PcapStopCaptureFile($pcapfile) ; Close pcap file
_PcapStopCapture($pcap) ; Stop capture
_PcapFree() ; release ressources
Вроде бы всё просто и на первый взгляд работает, но на самом деле нет.
Удалось выяснить что ошибка возникает при выполнении этих строк:
Код:
$sFile = FileOpen(@ScriptDir&"\loc.pcap", 0)
$link_cap = FileRead($sFile)
Команда ConsoleWrite($link_cap) выдаёт вместо полного текста файла только это:
Код:
ФГІЎ
Почему не подцепляется полный текст файла ума не приложу.
Немного поэкспериментировал и выяснилось, что если созданный файл "loc.pcap" открыть например обычным блокнотом и просто ничего не изменяя сохранить, всё начинает работать и FileOpen/FileRead нормально отрабатывают.
Для тех кто хочет сам всё проверить прикладываю оригинальный файл "loc.pcap" (прикреплен во вложении в архиве loc.rar).
Для проверки можно использовать этот упрощенный скрипт (разумеется сам скрипт и файл loc.pcap из архива должны быть в одной папке):
Код:
#include <Winpcap.au3>
Local $res_cap=0
While $res_cap = 0
$sFile = FileOpen(@ScriptDir&"\loc.pcap", 0)
$link_cap = FileRead($sFile)
ConsoleWrite($link_cap)
$tmpid = StringRegExp($link_cap, "(?s)(?i).*?tmpid=\d+?.*", 0)
If $tmpid = 1 then
$tmpid = StringRegExpReplace($link_cap, "(?s)(?i).*?.*tmpid=(\d+).*", "$1")
$res_cap = 1
EndIf
Sleep(100)
Wend
ConsoleWrite($tmpid)