tcp verbindung beenden
-
hallo, gibt es eine möglichkeit die tcp verbindungen die man mit netstat unter windows aufgelistet bekommt zu schließen?
Ich will nicht den prozess schließen von dem die verbindung ausgeht sondern nur die bestimmte tcp verbindung.
ich hab das nette tool tcpview gefunden welches genau das ermöglicht. doch ich hab keine ahnung wie das tool es schafft die verbindungen zu schließen ohne den prozess zu killen.
wäre über anregungen sehr dankbar
lg
-
- Google
- Mark Russinovich fragen
- Reverse Code Engineering
- Mit Functions Hooks rumhantieren
-
Eine mögliche Variante:
DLL injection - Wenn die DLL in den Speicher gemappt wurde die Tcp-verbindungen auslesen und sie bei bedarf mit einem Tcp Packet mit gesetztem RST Flag beenden.
-
K.A. CloseHandle?
-
Wie würde man den das Socket Handle ermitteln?
-
Wenn du den Socket-Descriptor erstmal rausgefunden hast, dann müsste es mit
DuplicateHandle(... DUPLICATE_CLOSE_SOURCE ...)
gehen. Hier mit Beispielcode:http://tangentsoft.net/wskfaq/articles/passing-sockets.html
Wenn du den "newhandle" Socket aus dem Beispiel dort dann gleich wieder zu machst, dann sollte der Socket "ganz" weg sein.
Wobei es vielleicht besser wäre ohne
DUPLICATE_CLOSE_SOURCE
zu clonen und dannshutdown(s, SD_BOTH)
oderDisconnectEx()
aufzurufen. Dadurch würde das Handle das der andere Prozess verwendet nicht ungültig, sondern bloss der Verbindung beendet.
-
Und um das Socket-Handle + ID des "besitzenden" Prozesses rauszubekommen sollte sich GetTcpTable2 verwenden lassen.
Bzw. GetExtendedTcpTable müsste auch gehen...
ps: könnte auch sein dass man SetTcpEntry verwenden kann um die Verbindung zu kappen. Wenn ich die Doku richtig interpretiere ist das sogar mehr oder weniger der einzige Zweck den diese Funktion haben kann (abgesehen davon eine Connection schnell aus dem "TIME-WAIT" Status rauszubekommen, damit der Port wiederverwendet werden kann). Da du für
SetTcpEntry()
kein Socket-Handle brauchst, sondern nur das Connection 4-Tuple (Local-IP, Local-Port, Remote-IP, Remote-Port) wäre das vermutlich sogar die einfachste Möglichkeit.
-
SetTcpEntry ist die einfachste und die einzig richtige Methode...
Alles andere wäre zuviel des guten...
-
Wenn ich SetTcpEntry als erstes gefunden hätte, hätte ich vermutlich auch nimmer weiter gesucht
(Wobei die anderen Sachen auch interessant zu wissen sind, wenn auch in dem Fall sinnlos kompliziert)