Что нового

Как правильно использовать FileOpen/FileRead в конкретном примере

Malderin

Новичок
Сообщения
68
Репутация
1
Вкратце опишу задачу.
Возникла необходимость перехватить запрос от некой программы. Для этого использовал известную библиотеку 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)
 

Вложения

  • loc.rar
    2.6 КБ · Просмотры: 11

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Как правильно использовать FileOpen на конкретном примере

Malderin,
У меня все работает.
Код:
$sTxt = FileRead(@ScriptDir & '\loc.pcap')
$sID = StringRegExpReplace($sTxt, '(?s).*tmpid=(\d+?)\D.*', '$1')
ConsoleWrite(@extended & @TAB & $sID & @LF)
$sTxt = ''
$sID = ''
;~ ----
$hFile = FileOpen(@ScriptDir & '\loc.pcap', 0)
$sTxt = FileRead($hFile)
FileClose($hFile)
$sID = StringRegExpReplace($sTxt, '(?s).*tmpid=(\d+)\D.*', '$1')
ConsoleWrite(@extended & @TAB & $sID & @LF)

В консоли:
Код:
1	03422610441214439293
1	03422610441214439293
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
Re: Как правильно использовать FileOpen на конкретном примере

madmasles сказал(а):
Malderin,
У меня все работает.
Код:
$sTxt = FileRead(@ScriptDir & '\loc.pcap')
$sID = StringRegExpReplace($sTxt, '(?s).*tmpid=(\d+?)\D.*', '$1')
ConsoleWrite(@extended & @TAB & $sID & @LF)
$sTxt = ''
$sID = ''
;~ ----
$hFile = FileOpen(@ScriptDir & '\loc.pcap', 0)
$sTxt = FileRead($hFile)
FileClose($hFile)
$sID = StringRegExpReplace($sTxt, '(?s).*tmpid=(\d+)\D.*', '$1')
ConsoleWrite(@extended & @TAB & $sID & @LF)

В консоли:
Код:
1	03422610441214439293
1	03422610441214439293

Файл loc.pcap взят из аттача или создан самостоятельно ? Если из аттача, не открывался для сохранения случайно ?

У меня ваш скрипт выдает примерно то же что и мой (прикрепил скрин).
 

Вложения

  • Снимок.JPG
    Снимок.JPG
    68.3 КБ · Просмотры: 24

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Malderin [?]
Файл loc.pcap взят из аттача или создан самостоятельно ?
Еще раз скачал Ваш файл, проверил на версиях 3.3.8.1 и 3.3.12.0, результат такой же.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
проверил на версии 3.3.12.0, скрипт от madmasles работает нормально
файл из первого сообщения не открывал до проверки
 

gora

Знающий
Сообщения
315
Репутация
19
Malderin [?]
Если из аттача, не открывался для сохранения случайно ?
А как это можно сделать не сохраняя? Файл в архиве, значит сначала он распаковывается и сохраняется на моем компьютере, а потом уже тестируется скриптом. Вот если Вы сообщите кеш Вашего файла (на Вашем компьютере), то его можно будет проверить на моем.
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
Откровенно говоря я пробовал менять версии, когда у меня вылезла эта ошибка я скачал последнюю версию что смог найти (бету) и на ней проверил, было то же самое, на этом и успокоился. Сейчас проверил на 3.3.12.0 и да, результат выдает как положено, хотя если пытаюсь вывести в консоль результат команды FileRead, выводит не текст прочитанного файла, а по прежнему первые несколько символов.
В общем цель пусть и не до конца, но достигнута, всем большое спасибо!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Malderin [?]
если пытаюсь вывести в консоль результат команды FileRead, выводит не текст прочитанного файла, а по прежнему первые несколько символов.
В консоли отображаются только символы до первого Chr(0):
Код:
Local $sStr = 'test '

ConsoleWrite($sStr & $sStr & @LF)
ConsoleWrite($sStr & Chr(0) & $sStr & @LF)
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
Может я не понял что то, но я имел ввиду что если написать вот так:

Код:
$sTxt = FileRead(@ScriptDir & '\loc.pcap')
ConsoleWrite($sTxt)


То вместо текста из файла, который по идее должен целиком попасть в консоль, выпадает всего несколько первых символов (по типу тех что на скрине в одном из моих предыдущих сообщений).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Malderin,
Код:
$sTxt = FileRead(@ScriptDir & '\loc.pcap')
$sTxt = StringReplace($sTxt, Chr(0), '')
;~ $sTxt = StringRegExpReplace($sTxt, '[[:cntrl:]]', '\.')
ConsoleWrite($sTxt & @LF)
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
madmasles сказал(а):
Malderin,
Код:
$sTxt = FileRead(@ScriptDir & '\loc.pcap')
$sTxt = StringReplace($sTxt, Chr(0), '')
;~ $sTxt = StringRegExpReplace($sTxt, '[[:cntrl:]]', '\.')
ConsoleWrite($sTxt & @LF)
Теперь до меня дошло, спасибо!


Добавлено:
Сообщение автоматически объединено:

И к стати сказать, если убрать Chr(0) из открываемого текстового файла, то дальше всё прекрасно работает, т.е. если написать пример от madmasles таким образом:
Код:
#include <WinAPI.au3>

Local $sTxt = FileRead(@ScriptDir & '\loc.pcap')
$sTxt = StringReplace($sTxt, Chr(0), '')
$sID = StringRegExpReplace($sTxt, '(?s).*tmpid=(\d+?)\D.*', '$1')
ConsoleWrite(@extended & @TAB & $sID & @LF)
$sTxt = ''
$sID = ''
;~ ----
$hFile = FileOpen(@ScriptDir & '\loc.pcap', 0)
$sTxt = FileRead($hFile)
$sTxt = StringReplace($sTxt, Chr(0), '')
FileClose($hFile)
$sID = StringRegExpReplace($sTxt, '(?s).*tmpid=(\d+)\D.*', '$1')
ConsoleWrite(@extended & @TAB & $sID & @LF)


То всё и в моей старой версии автоита прекрасно работает.
Похоже в старых версиях для StringRegExpReplace символ Chr(0) является помехой, дальше него обработка не идет
 
Верх