Comment bloqué un port ou une IP

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Arbrakan
Messages : 34
Inscription : lun. 24/janv./2011 10:52
Localisation : Genève
Contact :

Comment bloqué un port ou une IP

Message par Arbrakan »

Bonjour à tous,

J'ai la tête dans le code depuis hier sur un petit projet de sniffeur, plus proche d'un firewall au final, histoire d'avoir une vue d'ensemble de ce qui transite sur mon PC et d'en avoir le contrôle. Mais j'ai 2-3 questions qui reste sans réponses, alors je viens trouvé de l'aide dans le coins.

Jusqu’à maintenant, j'arrive a obtenir le port source et le port de destination ainsi que l'adresse ip de la machine qui se connecte a mon ordi. Mon but serrai de créer une petit programme qui permet de géré l'ouverture des port ainsi que bloqué certaines IP via un fichier externe.

Et ce que c'est possible de bloqué un port et adresse IP sous Wndow (7) en PB ?

Je pense que je doit me dirigé du coté de l'API Window, mais je n'ai rien trouvé, ni sur Google, ni sur l'historique du forum Français ou Anglais.

Merci d'avance pour tout piste ou aide :)

Cordialement,

Arbrakan
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Comment bloqué un port ou une IP

Message par blendman »

je me demande si dans la droppy lib, il n'y a pas des fonctions liées aux IP, mais je ne suis pas certain.

Tu as un début de code sinon ?
Avatar de l’utilisateur
Arbrakan
Messages : 34
Inscription : lun. 24/janv./2011 10:52
Localisation : Genève
Contact :

Re: Comment bloqué un port ou une IP

Message par Arbrakan »

Merci ! je vais y jeter un oeil, Ça semble bien complet comme lib, pleins de nouvelles fonctions, génial.
Tu as un début de code sinon ?
Yep, pour le moment ça donne ça :

(Un grand merci a lepiaf31 pour sont bout de code :wink: )

Code : Tout sélectionner


Enumeration
  #Menu
  #Panel
  #ListeOpenPort
  #ListeSniffer
  #LoadBarre
  #WSA_VER = $202
  #SIO_RCVALL=$98000001
  #TcpProtocol = 6
  #BufferSize = 4096
  
  #ListeSnifferPopMenu
  
  #Console_m
  #MyIp
EndEnumeration

Structure IpHeader
  IhlVersion.b
  typeOfService.b
  totalLength.w
  ID.w
  flagOffset.b
  fragOffset.b
  timeToLive.b
  protocol.b
  checksum.w
  source.l
  destination.l
EndStructure

Structure TcpHeader
  portSource.w
  portDestination.w
  seqNum.l
  ackNum.l
  dataOffset.b
  flags.b
  window.w
  checksum.w
  urgentPointer.w
EndStructure  
  
Structure SniffArg
    buffer.i
    size.i
EndStructure

Structure snifferInfos
    Connexion.s
    PortSource.i
    PortDest.i
EndStructure
  
InitNetwork()


Global Dim A_Port.l(0)
Global Dim A_sniffer.snifferInfos(0)

Global A_size.i
Global A_sniffer_size.i
Global busy.b

Global sourcePort
Global resConnexion$
Global resPortSource$
Global resPortDest$

Global sock.l

Global SniffData.SniffArg


Global ConsoleOn = 0


Procedure manageData(*SniffData.SniffArg)
  Protected ipHeader.IPHeader, tcpHeader.TcpHeader, sourcePort.i, destinationPort.i

    ;récupération de l'en-tete IP
    CopyMemory(*SniffData\buffer, @ipHeader, SizeOf(IpHeader))
    If ipHeader\protocol = #TcpProtocol ;Connexions TCP seulement
     
      ;récupération de l'en-tete TCP
      CopyMemory(*SniffData\buffer+SizeOf(IpHeader), @tcpHeader, SizeOf(TcpHeader))
     
      ;Ports
      sourcePort = ntohs_(tcpHeader\portSource)
      destinationPort = ntohs_(tcpHeader\portDestination)
      
      
      If ConsoleOn=1
      PrintN("Connexion: "+IPString(ipHeader\source)+" -> "+IPString(ipHeader\destination))
      PrintN("Port Source: "+Str(sourcePort))
      PrintN("Port Destination: "+Str(destinationPort))
      PrintN("")
      EndIf
    
      If A_sniffer_size>0
      For i=0 To A_sniffer_size-1
        resPort_A = CountString(Str(A_sniffer(i)\PortSource), Str(sourcePort))
        If resPort_A>0 : Break : selectElement=i : EndIf
      Next i
      EndIf

      Debug selectElement
        If resPort_A>0 
          SetGadgetItemText(#ListeSniffer, selectElement, A_sniffer(i)\Connexion, 0)
          SetGadgetItemText(#ListeSniffer, selectElement, Str(A_sniffer(i)\PortSource), 1)
          SetGadgetItemText(#ListeSniffer, selectElement, Str(A_sniffer(i)\PortDest), 2)
          SetGadgetItemColor(#ListeSniffer, selectElement, #PB_Gadget_BackColor, RGB(226,244,126), -1)
          UpdateWindow_(MainWIn)
          For i=0 To 255
            If Rcolor<29 : Rcolor=Rcolor+1 : EndIf
            If Gcolor<11 : Gcolor=Gcolor+1 : EndIf
            If Bcolor<129 : Bcolor=Bcolor+1 : EndIf
            SetGadgetItemColor(#ListeSniffer, selectElement, #PB_Gadget_BackColor, RGB(226+Rcolor,244+Gcolor,126+Bcolor), -1)
            Delay(20)
          Next
        Else
          A_sniffer(A_sniffer_size)\Connexion = IPString(ipHeader\source)+" -> "+IPString(ipHeader\destination)
          A_sniffer(A_sniffer_size)\PortSource = sourcePort
          A_sniffer(A_sniffer_size)\PortDest = destinationPort
          AddGadgetItem (#ListeSniffer,0,A_sniffer(A_sniffer_size)\Connexion+Chr(10)+Str(A_sniffer(A_sniffer_size)\PortSource)+Chr(10)+Str(A_sniffer(A_sniffer_size)\PortDest))

          A_sniffer_size=A_sniffer_size+1
          ReDim A_sniffer(A_sniffer_size)
          UpdateWindow_(MainWIn)
          For i=0 To 255
            If Rcolor<29 : Rcolor=Rcolor+1 : EndIf
            If Gcolor<11 : Gcolor=Gcolor+1 : EndIf
            If Bcolor<129 : Bcolor=Bcolor+1 : EndIf
            SetGadgetItemColor(#ListeSniffer, selectElement, #PB_Gadget_BackColor, RGB(226+Rcolor,244+Gcolor,126+Bcolor), -1)
            Delay(20)
          Next
        EndIf
      ;ClearStructure(*SniffData, SniffArg)
      ;FreeMemory(*SniffData)
      ;ProcedureReturn *SniffData\buffer

    EndIf

EndProcedure

Procedure sniff()
  ;Protected ip.i, wsaData.WSADATA, sin.SOCKADDR_IN, promiscuous_mode.l, sock.i, *buffer, size.i
  Define wsaData.WSADATA, sin.SOCKADDR_IN, promiscuous_mode.l
  promiscuous_mode = 1
 
  ;récupération de l'IP

    ExamineIPAddresses()
    ip = NextIPAddress()
 
  ;Démarrage
  If WSAStartup_(#WSA_VER, @wsaData)
    WSACleanup_()
    ProcedureReturn 0
  EndIf
 
  ;Creation du socket
  sock = SOCKET_(#AF_INET, #SOCK_RAW, #IPPROTO_IP)
  If sock = #INVALID_SOCKET
    WSACleanup_()
    ProcedureReturn 0
  EndIf
  sin\sin_family = #AF_INET
  sin\sin_addr = ip
 
  ;mode sniffing
  If bind_(sock, @sin, SizeOf(SOCKADDR_IN))
    WSACleanup_()
    ProcedureReturn 0
  EndIf
  If ioctlsocket_(sock, #SIO_RCVALL, @promiscuous_mode)
    WSACleanup_()
    ProcedureReturn 0
  EndIf
 
 
  *buffer = AllocateMemory(#BufferSize) ;allocation de la memoire de reception

    ;size = recv_(sock, *buffer, #BufferSize, 0)
    ;CallFunctionFast(*function, *buffer, size) ;traitement des données
    
ProcedureReturn *buffer
EndProcedure

Procedure sniffLook(*SniffData.SniffArg)
  Repeat
  ;Debug *SniffData\buffer
  *SniffData\size = recv_(sock, *SniffData\buffer, #BufferSize, 0)
  If *SniffData\size>40
    ;Debug *SniffData\size
    manageData(*SniffData.SniffArg)
  EndIf
  ;Debug *SniffData\size
  ForEver
  ;ProcedureReturn *SniffData\size
EndProcedure
  
Procedure.l port(port)
  If CreateNetworkServer(0, Port)
    busy=0
    CloseNetworkServer(0)
  Else
    busy=1
  EndIf
  ProcedureReturn busy;1=busy(another program manage that port already opened /  0=free,not opened)
EndProcedure

; --
    If CreatePopupMenu(#ListeSnifferPopMenu) 
      MenuItem(1,"Blackliste IP")
      MenuItem(2,"Close port")
      MenuItem(3,"Propreties")
    EndIf
    

; ---
MainWIn = OpenWindow(0, 0, 0, 450, 40, "1602", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
SetWindowColor(0, RGB(30, 30, 30)) 

SmartWindowRefresh(0, 1) 
        
  ProgressBarGadget(#LoadBarre, 10, 10, 430, 20, 0, 100)
  UpdateWindow_(MainWIn)

Define i
For i=1 To 65535
  If(port(i))
    
    A_Port(A_size)=i
    A_size = A_size+1
    ReDim A_Port(A_size)
    SetGadgetState(#LoadBarre, i/580)
    UpdateWindow_(MainWIn)
  Else
     ;Debug Str(i)+"=closed" ;unmark comment to see closed ports
  EndIf
Next

PanelGadget(#Panel, 0, 0, 0, 0)
    OpenGadgetList(#Panel)
    AddGadgetItem(#Panel, 0, "Stats")
      ;TextGadget(#MyIp, 10, 10, 200, 240, "my IP: "+StringField(GetHTTPHeader("http://h3x0r.ath.cx/Sonstiges/ShowMyIp12.php"), 2, Chr(34)))
    
    CloseGadgetList()
    AddGadgetItem(#Panel, 1, "Open Port")
    ListIconGadget(#ListeOpenPort, 0, 0,0, 0, "Open Port",220, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_HeaderDragDrop )
    
    CloseGadgetList()
    OpenGadgetList(#Panel)
    AddGadgetItem(#Panel, 2, "Sniffer")
    
    ListIconGadget(#ListeSniffer, 0, 0,0, 0, "Connexion",300, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_HeaderDragDrop )
      AddGadgetColumn(#ListeSniffer, 1, "Port Source", 120)
      AddGadgetColumn(#ListeSniffer, 2, "Port Destination", 120)
      
    CloseGadgetList()


FreeGadget(#LoadBarre)
Delay(20)

  CreateMenu(#Menu, WindowID(0))
        MenuTitle("File")
            MenuItem(1, "Fermer"  +Chr(9)+"Ctrl+F")
          MenuTitle("Options")
            MenuItem(#Console_m, "Console"  +Chr(9)+"F9")
          MenuTitle("About")
          
Define DeskW, DeskH
ExamineDesktops()
DeskW=DesktopWidth(0)
DeskH=DesktopHeight(0)

i=300 ;For i=40 To 300
  ResizeWindow(0, DeskW/2-i*1.5, DeskH/2-i, i*3, i*2)
  ResizeGadget(#Panel,1,0, i*3, i*2-24)
  ResizeGadget(#ListeOpenPort,5,8, i*3-18, i*2-64)
  ResizeGadget(#ListeSniffer,5,8, i*3-18, i*2-64)
  UpdateWindow_(MainWIn)
;Next

For i=0 To A_size
  AddGadgetItem (#ListeOpenPort,0,Str(A_Port(i)))
  UpdateWindow_(MainWIn)
Next


;Shortcut
AddKeyboardShortcut(0, #PB_Shortcut_F9, #Console_m)

UpdateWindow_(MainWIn)


*SniffData.SniffArg = AllocateMemory(SizeOf(SniffArg))
*SniffData\buffer = sniff()

Sniff_T=CreateThread(@sniffLook(),*SniffData)



        Repeat
          
          Event = WindowEvent()
          
          ;Debug *SniffData\size
          ;Debug IsThread(Data_T)
          
          Select EventMenu()
            Case #Console_m :
              OpenConsole()
              ConsoleOn=1
          EndSelect
          
         Select Event
       
         Case #PB_Event_Gadget
           Select EventGadget()
             Case #ListeSniffer
               Select EventType()
                 Case #PB_EventType_RightClick 
                   ;Debug GetGadgetState(#ListeSniffer)
                   If GetGadgetState(#ListeSniffer)>-1
                     DisplayPopupMenu(#ListeSnifferPopMenu,WindowID(0))
                  EndIf
                 Case #PB_EventType_LeftDoubleClick  : Debug "Double-clic avec le bouton gauche de la souris"
               EndSelect
           EndSelect
           
                    Select EventMenu() 
                       Case 1
                         Debug "1"
                         SetGadgetItemColor(#ListeSniffer, GetGadgetState(#ListeSniffer), #PB_Gadget_BackColor, RGB(253,127,51), -1)
                       Case 2
                         Debug "2"
                         SetGadgetItemColor(#ListeSniffer, GetGadgetState(#ListeSniffer), #PB_Gadget_BackColor, RGB(30,30,30), -1)
                       Case 3
                         Debug "3"
                         SetGadgetItemColor(#ListeSniffer, GetGadgetState(#ListeSniffer), #PB_Gadget_BackColor, RGB(30,30,30), -1)
                    EndSelect
       EndSelect
       
       
  Until Event = #PB_Event_CloseWindow
  

CloseNetworkServer(0)
;If MemorySize(*buffer)>0 : FreeMemory(*buffer) : EndIf
;KillThread(Sniff_T)
;KillThread(Data_T)
Avatar de l’utilisateur
Arbrakan
Messages : 34
Inscription : lun. 24/janv./2011 10:52
Localisation : Genève
Contact :

Re: Comment bloqué un port ou une IP

Message par Arbrakan »

J'ai rien trouvé qui répondes a mon problème dans droppy lib, (bien que j'ai trouvé pleins de jolies fonctions qui me donne pleins d'idée de projets).
Je suis entrain de regarder le fonctionnement de ws2_32.dll, je pense que je doit partir dans cette direction, api window-> ws2_32.dll ?

merci.
salutcava
Messages : 34
Inscription : lun. 10/juin/2013 12:01

Re: Comment bloqué un port ou une IP

Message par salutcava »

Bonjour/bonsoir Arbrakan et tout le monde.

J'ai bien lu ta question, à savoir :
"Et ce que c'est possible de bloqué un port et adresse IP sous Wndow (7) en PB ?"
et concernant cette interressante question, j'ai une bonne et une mauvaise nouvelle.
je commence par la bonne nouvelle :

En faisant un API-Hook global sur la fonction ACCEPT (de ws2_32.dll), tu arriveras a tes fins.
Concernant l'aspect global de l'api-hook tu as le choix, soit produire du code qui injecte ta dll dans tous les processus existant et dans les nouveaux processus créés, soit tu utilises la base de registre. ( Je te conseille la seconde option, c'est plus rapide, et c'est d'ailleurs selon cette methode que le firewall OutpostFW d'Agnitum procede pour injecter sa dll dans les processus et fait son travail de Firewall.)
A propos de la base de registre, tu trouveras aisement de la documentation disant que les clefs de registres "LoadAppInit_DLLs"(REG_DWORD), "AppInit_DLLs"(REG_SZ) et "RequireSignedAppInit_DLLs"(REG_DWORD) , se trouvant à :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT \CurrentVersion\Windows
te permettront d'injecter ta dll dans tous les processus.
Un petit résumé :
-LoadAppInit_DLLs (0 ou 1) active ou desactive AppInit_DLLs.
-AppInit_DLLs : liste des dll à injecter dans tous les processus (séparés par un espace ou une virgule) la dll doit etre mentionnée avec son chemin complet (chemin DOS 8 characteres maxi pour les dossiers et le fichier)
-RequireSignedAppInit_DLLs (0 ou 1) : 0 charge n'importe quelle DLL et 1 charge uniquement les dll au code-signé.

(le chemin de ces clefs est pour XP, je suppose sans prendre de risques que c'est le meme chemin pour seven)

Et puis sinon pour le code de ta dll qui fera office de firewall, il y a tout ce qu'il faut sur le forum (je te donne un lien on ne sait jamais : http://purebasic.fr/french/viewtopic.php?f=6&t=9949 )

Maintenant, la mauvaise nouvelle : Je n'ai pas de mauvaise nouvelle :'( :'( :'(

J'oubliais, hooker la fonction ACCEPT, c'est dans le cas de connexion entrantes, pour les connexions sortantes c'est plutot du coté de la fonction CONNECT qu'il faudra agir.

Bonne journée !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment bloqué un port ou une IP

Message par Backup »

.....
Dernière modification par Backup le lun. 18/août/2014 16:38, modifié 1 fois.
salutcava
Messages : 34
Inscription : lun. 10/juin/2013 12:01

Re: Comment bloqué un port ou une IP

Message par salutcava »

@Dobro:
Ah oui c'est plus simple, mais je ne suis pas sur que ta réponse convienne à la question qui etait : "Et ce que c'est possible de bloqué un port et adresse IP sous Wndow (7) en PB ?"
Entre bloquer une connexion qui correspond à un critere et fermer tout le programme si la connexion particuliere est detectée, je crois qu'il y a un monde entre les deux.
Nous verrons ce qu'en pense Arbrakan.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment bloqué un port ou une IP

Message par Backup »

ben, pour bloquer un port , t'es obligé de le fermer !!
ou de l'ouvrir (l'occuper) avec un autre prg ,pour empêcher sa disponibilités (et encore je suis pas sur de ça )
Avatar de l’utilisateur
Arbrakan
Messages : 34
Inscription : lun. 24/janv./2011 10:52
Localisation : Genève
Contact :

Re: Comment bloqué un port ou une IP

Message par Arbrakan »

Hé ben, merci pour vos superbe réponses détaillée. :)
Je regarde en profondeur tout ça ce soir, ça semble réponde a ma question, voir plus :).
Ça m'ouvre de nouvelles perceptives et un sacré terrain de jeu...

Je vous tiens au jus.

Merci !

Abrakan
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Comment bloqué un port ou une IP

Message par Mesa »

En fait, sous Windows, on ne peut pas fermer un port avec une API...
On demande à un firewall de fermer un port.
C'est assez différent.

Dans une invite de commande (fenêtre noire) avec droit administrateur (faire clic-droit pour Windows vista et +), tape ceci: netsh firewall ?
Et fait des essais, ça permet de gérer le firewall de Windows, sinon sur cette page t'as ce qu'il faut :
http://support.microsoft.com/kb/947709/fr

Et notamment cet exemple
Exemple 3:
Ancienne commande (XP)
Supprimer des programmes autorisés
netsh firewall delete allowedprogram C:\MonApp\MonApp.exe

Supprimer des ports
netsh firewall delete portopening protocol=UDP port=500

-------------------------------------------------------------

Nouvelle commande (vista, 7 et+)
Supprimer des programmes autorisés
netsh advfirewall firewall delete rule name =nom de la règle programme ="C:\MyApp\MyApp.exe" "

Supprimer des ports
netsh advfirewall firewall delete rule name =nom de la règle protocole = udp Port_Local = 500


Pour plus d'informations sur la façon de supprimer des règles de pare-feu, exécutez la commande suivante :
netsh advfirewall firewall delete rule ?

Voilà, t'as plus qu'a bossé la bibliothèque 'Process' de PureBasic, surtout la fonction 'RunProgram".
Tu peux faire un tour sur le site http://www.purearea.net/pb/english/index.htm et jette un coup d’œil sur ce code http://www.purearea.net/pb/CodeArchiv/I ... eOutput.pb
qui permet de récupérer les infos d'une console dans un gadget.

Mais si tu utilises un firewall (pare-feu) qui est livré avec un antivirus, là ça risque d'être compliqué.

Mesa.
Avatar de l’utilisateur
Atlante
Messages : 337
Inscription : mer. 29/juin/2011 18:35
Localisation : Paris

Re: Comment bloqué un port ou une IP

Message par Atlante »

Modérateur
Config : Intel I5 4670K, Nvidia Geforce GTX 1060, 16go RAM, SSD 256go, DD 2000go
Avatar de l’utilisateur
Arbrakan
Messages : 34
Inscription : lun. 24/janv./2011 10:52
Localisation : Genève
Contact :

Re: Comment bloqué un port ou une IP

Message par Arbrakan »

Merci Atlante :) Je vais y jeter un oeil.
Répondre