Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7850[/thread]

Binäre und oder nicht im Netzwerk Socket



<< >> 4 Einträge, 1 Seite
jmb
 2006-04-02 13:01
#64339 #64339
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
Hallo Zusammen,

ich habe das Problem, dass ich Inhalt, der im Netzwerk zwischen verschiedenen Nodes ausgetauscht wird, erkennen, vergleichen und danach eine Aktion treffen muss.

Vorab zur Erklärung:
Es gibt eine Variable, die hält den Netzwerkverkehr so wie er im Netzwerk für Perl aussieht. Danach dekodiere ich den Payload des Paketes anhand des Protokolls (derzeit kann ich IP, TCP, UDP, ICMP, IGMP). Funktioniert soweit sehr gut (ausser ich erhalte mal ein komprimiertes Bild, aber das ist eine andere, sehr leidensvolle Geschichte).

Ein Beispiel:
Jemand schickt in einer Email den Begriff "Hallo du Schimpfwort". Schimpfwort ist nicht erlaubt und wird dann verworfen oder verändert.

Jemand schickt einen HTTP Request und will im Header die Variable menu_item auf a setzen, geht aber nicht, da nur integer werte zwischen X und Y erlaubt sind. Variablemwert wird "korriegiert".

Nach der Aktion wird (basierend auf der Aktion) das Paket - je nach Protokoll - neu assembliert, neu berechnet und wieder ins Netz gelassen (oder eben nicht).

Jetzt hab ich das Problem bei binären Paketinhalt (shell_binds, etc) - also Code, der nicht für die ausführende Applikation, sondern für den darunterliegenden Stack gedacht ist.

Um endlich mal zum Punkt zu kommen, hier mein Code Snippet:

Code: (dl )
1
2
3
4
5
6
7
8
        if($tcp_pkt_data =~ m/Inhalt\seinss/g)
{
# alles gut, paket ins netz
}
elsif($tcp_pkt_data =~ m/binärer\sinhalt/g)
{
# grosses problem, da es hier jetzt ätzend wird
}


Wie ihr seht, hab ich das Problem, dass die entsprechenden Schleifenkoerper, die anhand von Regex Paketinhalt erkennen sollen, nun ''binär'' matchen sollen. Hab ich aber jetzt zum Beispiel einen Windows Add New User Code, dann sieht der, wenn ich ihn mir ausgeben lasse (ich lass ihn quasi vor dem Schleifenkoerper ausgeben), foldermassen aus (ist jetzt um die Schwachsinnigen Parts wie Netzwerk Auth, Socket Bind etc gekuerzt):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
FFFFFFF0 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åX|3ÒÀnÉ&brvbar;¡ÈjËiVP'ÖIé|üÿÿpPGAWAlëðÞ­Q@ëö&frac34;ïQ@ëö&frac34;


Der obere Part sieht immer anders aus, der untere Part (also "&frac34;ïQ@ëö...") immer gleich. Problem ist jetzt natuerlich, dass das, was ich hier gepostet habe, die Integrepation meines Terminal Programms ist, das versucht, den binären Inhalt, so darzustellen, dass der dumme Mensch (ich), das lesen kann.

Und nun, endlich, komm ich zum Punkt:
1) Wie kann ich mein Problem lösen, dass ich binären Inhalt in der Regex matchen kann und gleichzeitig auch noch ACSII Inhalt (in einer anderen Regex und in einer anderen Schleife)
Problem ist ja, dass ich binären und nicht binären Inhalt dann in das Skript schreiben muss.

2) Wie kann ich mir den binären Inhalt, der über das Netzwerk geht, in einer Form ausgeben lassen, die Perl wieder erkennt danach. Problem ist ja, dass das Matchen nur dann funktioniert, wenn Perl weiss, was ich ueberhaupt will. Wenn ich jetzt aber den Part, der mir ausgegeben wird, nehmen wuerde, hab ich ja nicht den binaeren Code, wie Perl ihn sieht, sondern die Interpretation der BASH darauf.
Meine Überlegung war, dass ich es in ein file schreibe (im binary mode) und es dann einfach wieder draus lese. Prloblem ist dann nur wieder (jetzt wirds richtig haesslich), dass dieser Code auf Seitens des Configurations Clients gelesen werden muss und diese Kiste ist eine dot net Applikation.

So, mein Monolog ist nun vorbei ;)

Bin um jeden Tipp dankbar, der mir mit dem Problem hier weiterhelfen kann. Hoffe, die Erklaerungen kann man einigermassen nachvollziehen.

Jmb

Edit renee: Ich habe die letzte Zeile zwecks Übersichtlichkeit etwas gekürzt. Die ïQ@ëö&frac34; kommen noch einige Male mehr vor...\n\n

<!--EDIT|renee|1143975769-->
bloonix
 2006-04-03 16:26
#64340 #64340
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo jmb,

[quote=jmb,02.04.2006, 11:01]ich habe das Problem, dass ich Inhalt, der im Netzwerk zwischen verschiedenen Nodes ausgetauscht wird, erkennen, vergleichen und danach eine Aktion treffen muss.[/quote]

ich bin kein Netzwerkspezialist, aber ich versuch es mal...

Korrigiere mich, falls ich etwas falsch verstanden habe.

[quote=jmb,02.04.2006, 11:01]Vorab zur Erklärung:
Es gibt eine Variable, die hält den Netzwerkverkehr so wie er im Netzwerk für Perl aussieht. Danach dekodiere ich den Payload des Paketes anhand des Protokolls (derzeit kann ich IP, TCP, UDP, ICMP, IGMP).

..........

Ein Beispiel:
Jemand schickt in einer Email den Begriff "Hallo du Schimpfwort". Schimpfwort ist nicht erlaubt und wird dann verworfen oder verändert.[/quote]

Prüfst du jedes einzelne Paket? Wenn die komplette eMail in
ein TCP/IP Paket passt, klappt das, ansonsten könntest du ein
Problem bekommen. Oder wartest du, bis die gesamten Daten
angekommen sind und prüfst sie dann?

[quote=jmb,02.04.2006, 11:01]Wie ihr seht, hab ich das Problem, dass die entsprechenden Schleifenkoerper, die anhand von Regex Paketinhalt erkennen sollen, nun ''binär'' matchen sollen. Hab ich aber jetzt zum Beispiel einen Windows Add New User Code ...[/quote]

Nicht nur das. Wenn es sich zum Beispiel immer um 32 Bit
Codierungen handelt, ist eine Umzuwandeln mit pack/unpack
recht einfach, aber wie schaut es mit 8 oder 16 Bit aus.
Wie möchtest du das Codierungsformat feststellen, das je nach
Datentyp unterschiedlich sein kann?

Greez,
opi
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
jmb
 2006-04-03 17:00
#64341 #64341
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
Hi opi,

Quote
ich bin kein Netzwerkspezialist, aber ich versuch es mal...

Korrigiere mich, falls ich etwas falsch verstanden habe.


Kein Problem.

Quote
Prüfst du jedes einzelne Paket? Wenn die komplette eMail in
ein TCP/IP Paket passt, klappt das, ansonsten könntest du ein
Problem bekommen. Oder wartest du, bis die gesamten Daten
angekommen sind und prüfst sie dann?


Du sprichst "Sessioning" an. Ich mache folgendes, ich kopiere dsa komplette Paket in den Speicher, merke mir die unique identifier, an denen ich die verschiedenen Sessions wieder zusammenbauen kann. Abhängig vom Paket. Bei ICMP z.B. bin ich session-los, bei TCP session basierend. Auch Fragmentierungen beachte ich. Langer Rede kurzer Sinn, die Pakete, die reinkommen, kann ich einer Session zuordnen. Hilft mir nur leider nichts bei meinem Problem ;)

Code: (dl )
1
2
3
4
5
Nicht nur das. Wenn es sich zum Beispiel immer um 32 Bit
Codierungen handelt, ist eine Umzuwandeln mit pack/unpack
recht einfach, aber wie schaut es mit 8 oder 16 Bit aus.
Wie möchtest du das Codierungsformat feststellen, das je nach
Datentyp unterschiedlich sein kann?


Die Codierung hab ich dank RFCs sehr gut im Griff. Codiert jemand natuerlich innerhalb eines TCP frames seinen Mist anders, als ich ihn lesen kann, hab ich ein Problem. Aber das ist okay + normal.

Jmb
bloonix
 2006-04-04 13:13
#64342 #64342
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
mhmm... mich interessiert die Lösung dieses Problems ebenfalls.

Hat denn keiner einer Idee?
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< >> 4 Einträge, 1 Seite



View all threads created 2006-04-02 13:01.