![]() |
mini Firewall programmieren ??
moin moin
also ich wollte mal eine mini firewall programmieren und zwar will ich nur einen Port sperren und wieder freigeben wie mache ich sowas ?? wie läuft sowas generrell ?? lg, gigant |
Re: mini Firewall programmieren ??
einen port kannst du ganz einfach sperren, indem du ihn belegst.
du musst nur einen socket erstellen und an dem port lauschen lassen. |
Re: mini Firewall programmieren ??
klingt sehr sehr interresant
aber was ist wenn der port schon von einer anderen software belegt ist ?? dann kann ich ihn ja nicht mehr belegen wie kann ich denn den port für mich wieder freimachen ?? wenn ich lausche kann ich ja auch rausfinden welche ip mich auf den port pingen will und wie gehe ich sowas an ich habe das noch nie gemacht lg, |
Re: mini Firewall programmieren ??
auch wenns schon alt ist pushe :) ich mal die frage von gigant 02 bzw. ich will das gleiche wissen!
|
Re: mini Firewall programmieren ??
der zweite Push
|
Re: mini Firewall programmieren ??
Schau dir mal "Layered Service Provider" (kurz: LSP) an, damit kann man genau so etwas machen.
|
Re: mini Firewall programmieren ??
kannste mir da n link auser suchseiten :) geben???
|
Re: mini Firewall programmieren ??
Um eine Firewall für Windows zu programmieren, benötigt man schon recht tiefgreifende Kenntnisse von WinSock und der darunterliegenden NDIS Treiberschicht.
Man müsste einen NDIS Intermediate Driver programmieren. Ab Windows XP und höher ist die Windows Firewall API verfügbar, was die Arbeit deutlich erleichtet. http://msdn2.microsoft.com/en-us/library/aa366453(VS.85).aspx Trotzdem ist das nichts für Anfänger. |
Re: mini Firewall programmieren ??
![]() Für Anfänger sicher nicht zu empfehlen, aber ich bin ganz gut damit zurechtgekommen. Unter Vista habe ich es noch nicht getestet. Viel Spaß damit, Andreas |
Re: mini Firewall programmieren ??
gibtsfür die windows firewall api n download bzw. ne aleitung/tutorial???
|
Re: mini Firewall programmieren ??
Steht doch alles im MSDN: http://msdn2.microsoft.com/en-us/library/aa366415(VS.85).aspx
|
Re: mini Firewall programmieren ??
Ich hab hier mal was für dich:
Delphi-Quellcode:
Credits dafür an x000x.
unit DropAllU;
{ Aufruf: InstallFW('192.168.0.2'); und zum schluss: RemoveFW; } interface procedure InstallFW(MyIP: String); procedure RemoveFW; implementation uses Windows; const IPHLPAPI = 'IPHLPAPI.DLL'; type PFFORWARD_ACTION = Integer; PPFFORWARD_ACTION = ^PPFFORWARD_ACTION; // INTERFACE_HANDLE = Pointer; // PFADDRESSTYPE = Integer; PPFADDRESSTYPE = ^PFADDRESSTYPE; // TByteArray = Array [0..Pred(MaxInt)] of Byte; PByteArray = ^TByteArray; TIpBytes = Array [0..3] of Byte; const PF_ACTION_DROP = 1; const PF_IPV4 = 0; function PfCreateInterface( dwName: DWORD; inAction: PFFORWARD_ACTION; outAction: PFFORWARD_ACTION; bUseLog: BOOL; bMustBeUnique: BOOL; var ppInterface: INTERFACE_HANDLE): DWORD; stdcall; external IPHLPAPI name '_PfCreateInterface@24'; function PfDeleteInterface( pInterface: INTERFACE_HANDLE): DWORD; stdcall; external IPHLPAPI name '_PfDeleteInterface@4'; function PfBindInterfaceToIPAddress( pInterface: INTERFACE_HANDLE; pfatLinkType: PFADDRESSTYPE; IPAddress: PByteArray): DWORD; stdcall; external IPHLPAPI name '_PfBindInterfaceToIPAddress@12'; function PfUnBindInterface( pInterface: INTERFACE_HANDLE): DWORD; stdcall; external IPHLPAPI name '_PfUnBindInterface@4'; var Handle_Interface : INTERFACE_HANDLE = nil; function StrToInt(S: PChar): Integer; begin Result := 0; if S = '' then Exit; while S^ in ['0'..'9'] do begin Result := Result * 10 + Integer(S^) - Integer('0'); Inc( S ); end; end; function StrToIpBytes( IpStr: String ): TIpBytes; var N : Integer; begin N := 0; while Pos('.', IpStr)>0 do begin Result[N] := StrToInt(@Copy(IpStr, 1, Pos('.', IpStr) - 1)[1]); Delete(IpStr, 1, Pos('.', IpStr)); Inc(N); end; Result[N] := StrToInt(@IpStr[1]); end; procedure InstallFW(MyIP: String); var IpLocal : TIpBytes; begin if (MyIP <> '') and Not Assigned(Handle_Interface) then begin FillChar(IpLocal, 4, #0); IpLocal := StrToIpBytes(MyIP); PfCreateInterface(0, PF_ACTION_DROP, PF_ACTION_DROP, False, False, Handle_Interface); PfBindInterfaceToIPAddress(Handle_Interface, PF_IPV4, @ipLocal); end; end; procedure RemoveFW; begin if Assigned(Handle_Interface) then begin PfUnBindInterface(Handle_Interface); PfDeleteInterface(Handle_Interface); Handle_Interface := nil; end; end; end. Das schließt allerdings alle ports. Doch ich will auch irgendwie hinbekommen damit es nur einen einzigen schließt. Doch ich kriegs nich hin :gruebel: |
Re: mini Firewall programmieren ??
und was muss ich daüfr an uses einbinden??? und wenn man das dann macht, wird dann auch zb der internetaufbau von firefox gestoppt oder können sich diese programme dem wiedersetzen???
|
Re: mini Firewall programmieren ??
Larsi, ich möchte Dir ja nicht zu Nahe treten, aber ich denke, dass eine eigene Firewall doch noch etwas zu hoch für Dich ist.
Wie Andreas schon erwähnt hat, braucht man einiges an Wissen und wenn Du nicht mal Imstande bist, Dir Informationen selbst zu ergoogln (siehe Deine Posts #7 und #10), ist Dein Vorhaben schon von vorneherein zum Scheitern verurteilt. |
Re: mini Firewall programmieren ??
da hast du wohl rech aber es wäre trotzdem nett wenn mir jemand sagen könnte was ich in die usues einbinden soll :lol:
|
Re: mini Firewall programmieren ??
Du hast eine komplette (funktionierende) Unit. Da brauchst Du nichts mehr in Uses einbinden. Du musst letztendlich nur diese Unit in Dein Programm einbinden und die entsprechenden Funktionen aufrufen.
|
Re: mini Firewall programmieren ??
ok. in dem code da stand ja ganz oben als kommentar sowas wie 192.22.2.3 sperren oder so. dann wird doch da gar nicht alles gesperrt oder???
|
Re: mini Firewall programmieren ??
Wenn Du lesen würdest, was k4ni geschrieben hat:
Zitat:
|
Re: mini Firewall programmieren ??
Speicher die unit unter DropAllU.pas ab und füge es am besten in den ordner des projects ein.
Dann einfach DropAllU zu uses hinzufügen und um die Firewall zu aktivieren benützt du InstallFw('local ip here'); und zum entfernen bzw. deaktivieren benützt du RemoveFw(); Um die local ip zu ermitteln hab ich hier noch was für dich:
Delphi-Quellcode:
Hab ich bin
uses .., .., WinSock;
.. function LocalIP:string; var WSA : TWSAData; ILen : integer; PHst : PChar; PHEn : PHostEnt; begin WSAStartup( $0101, WSA ); ILen := $FF; PHst := StrAlloc( ILen ); gethostname( PHst, ILen ); PHEn := gethostbyname( PHst ); with PHEn^ do result:=format( '%d.%d.%d.%d', [ord(h_addr^[ 0 ]), ord(h_addr^[ 1 ]), ord(h_addr^[ 2 ]), ord(h_addr^[ 3 ])] ); {Nuke the string} StrDispose( PHst ); {Dust and Clean} WSACleanup; end; ![]() |
Re: mini Firewall programmieren ??
Zitat:
Zitat:
EDIT: Da hat ein kleines rotes etwas wohl mal wieder Urlaub |
Re: mini Firewall programmieren ??
Lars, Du bist gute 2 Stunden zu spät und hast wohl auch die zweite Seite nicht gesehen? :zwinker:
|
Re: mini Firewall programmieren ??
Zitat:
'n paar Studen durchgehend Mathe zu machen scheint wohl dem Gehirn der Aufmerksamkeit zu schaden :wink: |
Re: mini Firewall programmieren ??
Weis jemand von euch wie man die InstallFW function von DropAllU auf einzelne ports eingrenzen kann?
|
Re: mini Firewall programmieren ??
Liste der Anhänge anzeigen (Anzahl: 1)
Moin moin,
ich hab die Unit von oben mal so angepasst, dass eben nur ein Port geblockt wird. In meinem Fall: Alle ausgehenden Pakete, die als Ziel eine beliebige IP haben und dort auf Port 80 wollen Alle eingehenden Pakete, die von einer beliebigen IP kommen und deren Quellport eben 80 ist. Ansonsten wird nix geblockt. Das Beispiel ist ohne Fehlerbehandlung - ich denke das kann jeder selber einbauen und anpassen...
Delphi-Quellcode:
PS: Es handelt sich hier NICHT um eine Firewall, sondern lediglich nur um einen Paketfilter!
procedure InstallFW(MyIP: String);
var IpLocal : TIpBytes; ipOther : TIpBytes; ipOtherMask : TIpBytes; ipMy : TIpBytes; ipMyMask : TIpBytes; begin if (MyIP <> '') and Not Assigned(Handle_Interface) then begin FillChar(IpLocal, 4, #0); IpLocal := StrToIpBytes(MyIP); PfCreateInterface(0, PF_ACTION_FORWARD, PF_ACTION_FORWARD, False, False, Handle_Interface); PfBindInterfaceToIPAddress(Handle_Interface, PF_IPV4, @ipLocal); // ipMy := StrToIpBytes(PChar(MyIP)); ipMyMask := StrToIpBytes('255.255.255.255'); // ipOther := StrToIpBytes('0.0.0.0'); ipOtherMask := StrToIpBytes('0.0.0.0'); // Eingehende Pakete ZeroMemory(@ipFltIn, SizeOf(ipFltIn)); ipFltIn.dwFilterFlags := 0; ipFltIn.dwRule := 0; ipFltIn.pfatType := PF_IPV4; ipFltIn.fLateBound := 0; ipFltIn.dwProtocol := FILTER_PROTO_TCP; ipFltIn.wDstPort := FILTER_TCPUDP_PORT_ANY; ipFltIn.wDstPortHighRange := FILTER_TCPUDP_PORT_ANY; ipFltIn.DstAddr := @ipMy; ipFltIn.DstMask := @ipMyMask; ipFltIn.wSrcPort := 80; ipFltIn.wSrcPortHighRange := 80; ipFltIn.SrcAddr := @ipOther; ipFltIn.SrcMask := @ipOtherMask; // Ausgehende Pakete ZeroMemory(@ipFltOut, SizeOf(ipFltOut)); ipFltOut.dwFilterFlags := 0; ipFltOut.dwRule := 0; ipFltOut.pfatType := PF_IPV4; ipFltOut.fLateBound := 0; ipFltOut.dwProtocol := FILTER_PROTO_TCP; ipFltOut.wDstPort := 80; ipFltOut.wDstPortHighRange := 80; ipFltOut.DstAddr := @ipOther; ipFltOut.DstMask := @ipOtherMask; ipFltOut.wSrcPort := FILTER_TCPUDP_PORT_ANY; ipFltOut.wSrcPortHighRange := FILTER_TCPUDP_PORT_ANY; ipFltOut.SrcAddr := @ipMy; ipFltOut.SrcMask := @ipMyMask; PfAddFiltersToInterface(Handle_Interface, 1, @ipFltIn, 1, @ipFltOut, nil); end; end; |
Re: mini Firewall programmieren ??
Danke danke danke danke!!
Das hät ich in 100 jahren nicht hinbekommen :D Vielen dank! |
Re: mini Firewall programmieren ??
Hi,
hab das njetzt nochmal ausprobiert aber irgendwie kommt beim compilen immer dieser Fehler: [Pascal Fehler] DropallU.pas(24): E2086 Typ 'PPFFORWARD_ACTION' ist nicht vollständig definiert [Pascal Fataler Fehler] Unit3.pas(7): F2063 Verwendete Unit 'DropallU.pas' kann nicht compiliert werden |
Re: mini Firewall programmieren ??
Moin moin,
kommt der Fehler auch, wenn du mein Beispielcode unverändert kompilierst? |
Re: mini Firewall programmieren ??
Ja, ich hab nichts verändert! Kann mir jemand mal ne exe hochladen ich möchte mal sehen ob's geht :) :) :) Also jetzt von dem was alle blockiert
|
Re: mini Firewall programmieren ??
Liste der Anhänge anzeigen (Anzahl: 1)
Moin moin,
hab dann keine Ideen... Hab kein Turbo Delphi hier um des zu testen. Aber die kompilierte EXE kannste haben... Wie gesagt, blockt nur Port 80 und WinXP SP2 ist Vorraussetzung. Unter Vista wird es nicht funktionieren. |
Re: mini Firewall programmieren ??
funktioniert ja schon extrem gut!
nur hab ich die Geschichte mit dem Regeln-Erstellen nicht so ganz verstanden... Wie würde es dann z.B. aussehen, wenn ich alle Ports -bis auf ein paar (von mir ausgewählte)- sperren wollte? Würd mich über ne Antwort sehr freuen!! :P |
Re: mini Firewall programmieren ??
Moin moin,
in dem du das Interface mit Parameter PF_ACTION_DROP erstellst. Also
Delphi-Quellcode:
Jetzt wird von Haus aus alles geblockt, nur die Pakete die deinen Regeln entsprechen, werden durchgelassen.
PfCreateInterface(0, PF_ACTION_DROP, PF_ACTION_DROP, False, False, Handle_Interface);
|
Re: mini Firewall programmieren ??
Okay, wie ich alle Ports blockiere, wusste ich schon, nur haperts bei mir daran, spezielle Ports wieder freizugeben.
Wie sieht denn so ein "Filter" aus, der spezielle Ports durchlässt? In deinem Beispiel auf Seite 2 war der Filter ja dafür verantwortlich, dass die Ports zu einer bestimmten IP "geforwardet" *g* werden, das kann ich hier sicher so nicht verwenden, oder? |
Re: mini Firewall programmieren ??
Edit: OMG...da hingen ja noch ein paar Seiten hinten dran...sorry...Bis ebens tand hier noch obsoleter, überflüssiger Quatsch.
Sherlock |
Re: mini Firewall programmieren ??
Doch kannst du. Wenn du genau das Beispiel nimmst und nur PF_ACTION_FORWARD durch PF_ACTION_DROP ersetzt,
werden alle Pakete die von irgendeiner IP mit QuellPort 80 kommen durchgelassen. Und alle Pakete die deinen Rechner verlassen wollen und als Zielport 80 haben, werden ebenfalls durchgelassen. Wenn du genau dieses Beispiel testen willst, solltest du auch noch den Port 53 dazunehmen, da sonst die Namensauflösung nicht funktioniert (ist ja ebenfalls geblockt). |
Re: mini Firewall programmieren ??
Hmmm, dann bin ich da wohl zu blööd zu ;-)
Delphi-Quellcode:
Da sollte er doch eigentlich alle Ports blockieren, außer 3389, richtig?
procedure netzsperren(MyIP: String);
var IpLocal : TIpBytes; ipOther : TIpBytes; ipOtherMask : TIpBytes; ipMy : TIpBytes; ipMyMask : TIpBytes; begin if (MyIP <> '') and Not Assigned(Handle_Interface) then begin FillChar(IpLocal, 4, #0); IpLocal := StrToIpBytes(MyIP); PfCreateInterface(0, PF_ACTION_DROP, PF_ACTION_DROP, False, False, Handle_Interface); PfBindInterfaceToIPAddress(Handle_Interface, PF_IPV4, @ipLocal); ipMy := StrToIpBytes(PChar(MyIP)); ipMyMask := StrToIpBytes('255.255.255.255'); // ipOther := StrToIpBytes('0.0.0.0'); ipOtherMask := StrToIpBytes('0.0.0.0'); // Eingehende Pakete ZeroMemory(@ipFltIn, SizeOf(ipFltIn)); ipFltIn.dwFilterFlags := 0; ipFltIn.dwRule := 0; ipFltIn.pfatType := PF_IPV4; ipFltIn.fLateBound := 0; ipFltIn.dwProtocol := FILTER_PROTO_TCP; ipFltIn.wDstPort := FILTER_TCPUDP_PORT_ANY; ipFltIn.wDstPortHighRange := FILTER_TCPUDP_PORT_ANY; ipFltIn.DstAddr := @ipMy; ipFltIn.DstMask := @ipMyMask; ipFltIn.wSrcPort := 3389; ipFltIn.wSrcPortHighRange := 3389; ipFltIn.SrcAddr := @ipOther; ipFltIn.SrcMask := @ipOtherMask; // Ausgehende Pakete ZeroMemory(@ipFltOut, SizeOf(ipFltOut)); ipFltOut.dwFilterFlags := 0; ipFltOut.dwRule := 0; ipFltOut.pfatType := PF_IPV4; ipFltOut.fLateBound := 0; ipFltOut.dwProtocol := FILTER_PROTO_TCP; ipFltOut.wDstPort := 3389; ipFltOut.wDstPortHighRange := 3389; ipFltOut.DstAddr := @ipOther; ipFltOut.DstMask := @ipOtherMask; ipFltOut.wSrcPort := FILTER_TCPUDP_PORT_ANY; ipFltOut.wSrcPortHighRange := FILTER_TCPUDP_PORT_ANY; ipFltOut.SrcAddr := @ipMy; ipFltOut.SrcMask := @ipMyMask; PfAddFiltersToInterface(Handle_Interface, 1, @ipFltIn, 1, @ipFltOut, nil); //portfreigeben(3389,MyIP); //RDP {portfreigeben(137,MyIP); //NetBIOS Name Service portfreigeben(139,MyIP); //NetBIOS File and Printer Sharing portfreigeben(445,MyIP); //NetBIOS File and Printer Sharing portfreigeben(135,MyIP); //RPC portfreigeben(1025,MyIP); //RPC portfreigeben(2049,MyIP); //NFS portfreigeben(1080,MyIP); //SOCKS portfreigeben(7,MyIP); //PING Request portfreigeben(8700,MyIP); //DER SERVER!!!} end; end; Bin über RDP auf dem Rechner drauf, auf dem ich das Programm ausführe, die Verbindung wird trotzdem unterbrochen... Gedankenfehler von mir? |
Re: mini Firewall programmieren ??
Liste der Anhänge anzeigen (Anzahl: 1)
Moin moin,
ja sollte es und macht es bestimmt auch. Ich kenne mich mit dem RDP Protokoll nicht wirklich aus, evtl. wird aber der Port 3389 nur zur Verbindung genutzt und die Session läuft über einen anderen Port? Ich habe dir die DropAllU.pas mal so angepasst, das nur noch Namensauflösung und Port 80 funktionieren. Wenn das auch nicht bei dir funktionieren sollte, dann liegts an :gruebel: ... |
Re: mini Firewall programmieren ??
Vielen Dank für deine Mühe,
hat allerdings ebenfalls nicht funktioniert, komme, sobald ich InstallFW aufrufe, nicht über Port 80 raus. Was mir aber aufgefallen ist (wurde glaub ich auch schon ne Seite vorher besprochen)... bei
Delphi-Quellcode:
bekomme ich folgende Meldung:
type
PFFORWARD_ACTION = Integer; PPFFORWARD_ACTION = ^PPFFORWARD_ACTION; Zitat:
Hab das dann mal in
Delphi-Quellcode:
geändert, dann ist die Meldung weg.
type
PFFORWARD_ACTION = Integer; PPFFORWARD_ACTION = ^PFFORWARD_ACTION; hat das vielleicht damit etwas zutun? Ich habe bestimmt irgendwas übersehen... IP: 192.168.44.241 Subnetzsmaske: 255.255.255.0 ist da etwas entscheidend? Gruß Morphie |
Re: mini Firewall programmieren ??
Moin moin,
jo, da haste nen Fehler entdeckt. Hatte die Teile aus einer Fltdefs.pas kopiert, und da ist es auch schon falsch drinne. Ändere mal folgendes ab:
Delphi-Quellcode:
Damit sollte es dann jetzt aber funktionieren.
//..
// rausnehmen und dafür... // PFFORWARD_ACTION = Integer; // PPFFORWARD_ACTION = ^PFFORWARD_ACTION; // dies rein _PfForwardAction = ( PF_ACTION_FORWARD, PF_ACTION_DROP ); PFFORWARD_ACTION = _PfForwardAction; PPFFORWARD_ACTION = ^_PfForwardAction; //.. // und das jetzt ganz weg //const // PF_ACTION_FORWARD = 0; // PF_ACTION_DROP = 1; |
Re: mini Firewall programmieren ??
Okay, großen Schritt weiter...
Das öffnen der Ports funzt! Besten Dank ;) Allerdings hab ich immer noch nicht raus, warum RDP bei mir abbricht, wenn ich Port 3389 öffne... Habe im Netz nichts darüber gefunden, dass irgendein anderer Port ebenfalls genutzt wird... :( Wenn da nun noch jemand ne Lösung für hat, wär ich unglaublich dankbar ;) Morphie |
Re: mini Firewall programmieren ??
Hm, dann schau doch mal mit netstat welche Ports/IPs/Protokolle bei dir belegt/benutzt werden, wenn du eine aktive RDP Session hast.
Evtl. weisst du dann mehr?! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz