Hi zusammen,
nach den vorangegangenen hilfreichen Antworten hab ich mir die entsprechenden Schnipsel zusammengesucht und ein halbwegs brauchbares Skript erstellt.
Allerdings gibt es noch ein Problem mit dem ich absolut nicht zurecht komme.
In dem Skript wird ein TCP-Paket empfangen und ausgewertet.
Das funktioniert soweit perfekt.
Problematisch wird es jetzt wenn die HTTP-Sequenz aus mehreren TCP-Paketen besteht.
Manchmal funktioniert es durch Zufall das der Skript mir dann das komplette und vor allem korrekte Paket zusammen stückelt. Aber das funktioniert nur gefühlte 1 von 10 mal.
Was mache ich hier falsch?
Hier der komplette Code:
Code:
#include <Winpcap.au3>
#include <String.au3>
#include <Array.au3>
HotKeySet("^q", "verlassen")
$dll = DllOpen("user32.dll")
$Server="XYServer.net"
$ServerIP="000.00.000.00"
local $PaketType
$filter = "tcp port 80"
$filter = "src host "&$ServerIP
$winpcap=_PcapSetup()
If ($winpcap=-1) Then
MsgBox(16,"Pcap error !","WinPcap not found !")
exit
EndIf
$pcap_devices=_PcapGetDeviceList()
If ($pcap_devices=-1) Then
MsgBox(16,"Pcap error !",_PcapGetLastError())
exit
EndIf
$int = $pcap_devices[0][0]
$pcap = _PcapStartCapture($int, $filter, 0)
If ($pcap = -1) Then
MsgBox(16, "Pcap error !", _PcapGetLastError())
EndIf
$Endcheck=0
$PaketType=""
while $PaketType<>"Etwas bestimmtes"
If IsPtr($pcap) Then
$time0 = TimerInit()
While (TimerDiff($time0) < 5000)
$packet = _PcapGetPacket($pcap)
If IsInt($packet) Then ExitLoop
$sniff = sniff($packet[3])
if StringInStr($sniff, "Etwas bestimmtes") then ;Ich suche nur nach Paketen die "Etwas bestimmtes" enthalten
$PaketType="Etwas bestimmtes"
$Hauptinfo=StringMid($sniff, StringInStr($sniff, "{"))
$ContentLen1=_StringBetween($sniff, 'Content-Length: ', @CRLF)
$ContentLen=$ContentLen1[0]
$infoLen=stringlen($Hauptinfo)
;------------------------------------AB HIER.....
while $infoLen<$ContentLen
$packet = _PcapGetPacket($pcap)
If IsInt($packet) Then ExitLoop
$sniff = sniff($packet[3])
$Hauptinfo=$Hauptinfo & $sniff
$infoLen=stringlen($Hauptinfo)
WEnd
;------------------------------------....BIS HIER funktioniert es nicht immer genau wie ich es will
MsgBox(16,"Paket", $Hauptinfo & @CRLF _;$Hauptinfo & @CRLF _
& @CRLF _
& $ContentLen _
& @CRLF _
& $infoLen)
;hier käme noch die eigentliche Auswertung / Zersplittung von $Hauptinfo ist aber jetzt zu lang und hierfür nicht relevant
EndIf
WEnd
EndIf
WEnd
_PcapFree()
Func sniff($data)
Local $ipheaderlen = BitAND(_PcapBinaryGetVal($data, 15, 1), 0xF) * 4
Local $tcpoffset = $ipheaderlen + 14
Local $tcplen = _PcapBinaryGetVal($data, 17, 2) - $ipheaderlen ; ip total len - ip header len
Local $tcpheaderlen = BitShift(_PcapBinaryGetVal($data, $tcpoffset + 13, 1), 4) * 4
Local $tcpsrcport = _PcapBinaryGetVal($data, $tcpoffset + 1, 2)
Local $tcpdstport = _PcapBinaryGetVal($data, $tcpoffset + 3, 2)
Global $tcpsequence = _PcapBinaryGetVal($data, $tcpoffset + 5, 4)
Global $tcpflags = _PcapBinaryGetVal($data, $tcpoffset + 14, 1)
Local $httpoffset = $tcpoffset + $tcpheaderlen + 1
Global $httplen = $tcplen - $tcpheaderlen
$sniff_packet = BinaryMid($data, $httpoffset)
If $httplen = 0 Then Return False ; empty tcp packet
If $tcpsrcport = 80 Then
$String = _HexToString($sniff_packet)
Return $String;$sniff_packet ; server ==> client
EndIf
If $tcpdstport = 80 Then
$String = _HexToString($sniff_packet)
Return $String;$sniff_packet ; server ==> client
EndIf
EndFunc
Func verlassen()
_PcapFree() ; close winpcap
DllClose($dll)
exit
EndFunc