WF MSC kontrollieren - kleines Projekt

Hi,

hab mich bissel mit der Windows Firewall beschäftigt, und ein kleines Tool erstellt.

MFClose.jar (6,1 KB)

Es gibt eigentlich nur zwei Möglichkeiten, um die Firewall zu steuern. Entweder die WFP und hardcore C, oder über das UI (es gibt dabei Vor- und Nachteile).

Was macht MFClose.jar?

Ein Verzeichnis blockieren:

  • Doppelklick MFClose.jar
  • es wird nach allen .exe in dem ausgewählten Verzeichnis gesucht
  • es wird eine .bat erstellt mit Firewall Regeln
  • schaut euch die .bat mit einem Texteditor an
  • wenn ihr zufrieden seid, startet die .bat als Administrator
  • Regeln zum Blockieren werden angelegt
  • die Regeln habn eine bestimmte vierstellige Nummer, merkt euch diese
  • wenn ihr die Regeln wieder entfernen möchtet, dann wf.msc aufrufen und Regeln entfernen

Ein Verzeichnis erlauben:

  • Doppelklick MFClose.jar
  • es wird nach allen .exe in dem ausgewählten Verzeichnis gesucht
  • es wird eine .bat erstellt mit Firewall Regeln
  • schaut euch die .bat mit einem Texteditor an
  • wenn ihr zufrieden seid, startet die .bat als Administrator
  • Regeln zum Erlauben werden angelegt
  • die Regeln habn eine bestimmte vierstellige Nummer, merkt euch diese
  • wenn ihr die Regeln wieder entfernen möchtet, dann wf.msc aufrufen und Regeln entfernen

Was passiert, wenn ich ein Verzeichnis sowohl erlaube als auch blockiere? Dann wird es blockiert.

Werden wirklich alle blockiert? Ja schon… - Wenn ihr alle außer die erlaubten blockieren möchtet, dann wf.msc aufrufen, „Windows Defender Firewall-Eigenschaften“, Profil auswählen, „Ausgehende Verbindungen: Blockieren“, OK. - Aber was ist der Nachteil daran? Bei eingehenden Verbindungen ohne Regel fragt er, bei ausgehenden nicht.

Viel Spaß, Feedback gern, und (ich weiß nicht, ob ich das schreiben muss), ich kann natürlich keine Garantie für Schäden am System übernehmen.

Noch etwas? Firewall Regeln werden in der Registry hinterlegt, und können in ein .WFW file exportiert werden, aber nicht editiert werden. :frowning:

Noch etwas? Kann man nicht einen Kontextmenü-Eintrag bei Verzeichnissen hinzufügen? Ich fürchte, das wird schwierig werden…

Moin,

ich veröffentliche Version 2 des MFClose:

MFClose.jar (6,0 KB)

Was hat sich geändert?:

Diese vierstellige Nummer ist jetzt ein eindeutiger fünfstelliger Hash (+ 0 als Präfix), z. B.:

0-123 (Hashwert -123) oder
00654 (Hashwert +654) usw.

anhand des von euch gewählten Pfads.

Quelltext
package mfclose;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JFileChooser;

public class MFClose
{
  static ArrayList<File> files = new ArrayList();
  
  public static void main(String[] args)
    throws IOException, InterruptedException
  {
    JFileChooser jfc = new JFileChooser("C:\\Program Files\\Mozilla Firefox");
    jfc.setFileSelectionMode(1);
    jfc.setMultiSelectionEnabled(false);
    if (jfc.showOpenDialog(null) == 0)
    {
      File file = jfc.getSelectedFile();
      if ((file != null) && (file.isDirectory()))
      {
        Files.walkFileTree(file.toPath(), new SimpleFileVisitor()
        {
          public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
            throws IOException
          {
            File toFile = file.toFile();
            if ((toFile.isFile()) && (toFile.getName().endsWith(".exe"))) {
              MFClose.files.add(toFile);
            }
            return FileVisitResult.CONTINUE;
          }
        });
        int index = file.hashCode() % 1000;
        String form = String.format("0%04d", new Object[] { Integer.valueOf(index) });
        ArrayList<String> blocks = new ArrayList();
        ArrayList<String> allows = new ArrayList();
        for (Iterator localIterator = files.iterator(); localIterator.hasNext();)
        {
          f = (File)localIterator.next();
          name = f.getName();
          blocks.add("powershell.exe -Command New-NetFirewallRule -DisplayName '" + form + "_" + name + "_In_Block' -Direction Inbound -Program '" + f.getPath() + "' -Action Block");
          blocks.add("powershell.exe -Command New-NetFirewallRule -DisplayName '" + form + "_" + name + "_Out_Block' -Direction Outbound -Program '" + f.getPath() + "' -Action Block");
          allows.add("powershell.exe -Command New-NetFirewallRule -DisplayName '" + form + "_" + name + "_In_Allow' -Direction Inbound -Program '" + f.getPath() + "' -Action Allow");
          allows.add("powershell.exe -Command New-NetFirewallRule -DisplayName '" + form + "_" + name + "_Out_Allow' -Direction Outbound -Program '" + f.getPath() + "' -Action Allow");
        }
        String name;
        PrintWriter pw = new PrintWriter(form + "_" + file.getName() + "_Block.bat");File f = null;
        try
        {
          for (String block : blocks) {
            pw.println(block);
          }
          pw.println("PAUSE");
        }
        catch (Throwable localThrowable1)
        {
          f = localThrowable1;throw localThrowable1;
        }
        finally
        {
          if (pw != null) {
            if (f != null) {
              try
              {
                pw.close();
              }
              catch (Throwable localThrowable2)
              {
                f.addSuppressed(localThrowable2);
              }
            } else {
              pw.close();
            }
          }
        }
        PrintWriter pw = new PrintWriter(form + "_" + file.getName() + "_Allow.bat");f = null;
        try
        {
          for (String allow : allows) {
            pw.println(allow);
          }
          pw.println("PAUSE");
        }
        catch (Throwable localThrowable4)
        {
          f = localThrowable4;throw localThrowable4;
        }
        finally
        {
          if (pw != null) {
            if (f != null) {
              try
              {
                pw.close();
              }
              catch (Throwable localThrowable5)
              {
                f.addSuppressed(localThrowable5);
              }
            } else {
              pw.close();
            }
          }
        }
      }
    }
  }
}

Weiterentwicklung möglich nur, wenn ihr mich fragt.

Feedback natürlich gern…

Ich wollte mich bedanken für das Programm, das hat mir vermutlich ein paar Stunden Zeit gespart.

Mein Anwendungsfall:

Paketierung von Ansys - die Standardinstallation von Ansys bringt ca. 2300 EXE Dateien mit wovon sehr viele eine Firewallabfrage beim ersten Start generieren. Dank deinem Programm kann ich das sehr easy handeln. Früher habe ich die Firewallrichtlinien händisch pro EXE angelegt und von Ansys kommt jedes halbe Jahr eine neue Version mit leicht geändertem Programmpfad raus.

Falls ich mich irgendwie erkenntlich zeigen kann dann her damit.

Eine mögliche Weiterentwicklung wäre die Aufteilung der erstellten Batchdateien in ein- und ausgehend.

mfg Sascha

Eiii, das hatte ich ja gar nicht mehr auf dem Schirm, aber es funktioniert immer noch. :slight_smile:

Gern geschehen.

Es ist schön, mal von einem sinnvollen Use-Case zu hören.

Also dann 4 bat-Dateien: ..._Block_In.bat, ..._Block_Out.bat, ..._Allow_In.bat, ..._Allow_Out.bat.

Ich setze es mal auf die To-Do-Liste.

Thx for your feedback. :upside_down_face:

Falls du 0.1 LTC übrig hast, kannst du mir diese senden. Dann rutscht das auf der To-Do-Liste ein paar Plätze nach oben. :sweat_smile: Nur Spaß!

Hier dann Version 3:

import javax.swing.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Locale;
import java.util.stream.Stream;

public class MFClose {
    public static void main(final String[] args) throws IOException {
        JFileChooser jfc = new JFileChooser();
        jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        jfc.setMultiSelectionEnabled(false);
        int o = jfc.showOpenDialog(null);
        if (o == JFileChooser.APPROVE_OPTION && jfc.getSelectedFile() != null && jfc.getSelectedFile().canRead()) {
            Path path = jfc.getSelectedFile().toPath();
            String id = String.format("0%05d", path.hashCode() % 10_000);
            try (Stream<Path> stream = Files.walk(path, FileVisitOption.FOLLOW_LINKS)) {
                List<Path> paths = stream.filter(p -> p.getFileName().toString().toLowerCase(Locale.ROOT).endsWith(".exe")).sorted().toList();
                try (PrintWriter writer = new PrintWriter(String.format("%s_%s_Block_In.bat", id, path.getFileName()), Charset.defaultCharset())) {
                    paths.forEach(p -> writer.println(
                            "powershell.exe -Command New-NetFirewallRule -DisplayName '" + id + "_" + p.getFileName() + "_Block_In' -Direction Inbound -Program '" + p + "' -Action Block"
                    ));
                }
                try (PrintWriter writer = new PrintWriter(String.format("%s_%s_Block_Out.bat", id, path.getFileName()), Charset.defaultCharset())) {
                    paths.forEach(p -> writer.println(
                            "powershell.exe -Command New-NetFirewallRule -DisplayName '" + id + "_" + p.getFileName() + "_Block_Out' -Direction Outbound -Program '" + p + "' -Action Block"
                    ));
                }
                try (PrintWriter writer = new PrintWriter(String.format("%s_%s_Allow_In.bat", id, path.getFileName()), Charset.defaultCharset())) {
                    paths.forEach(p -> writer.println(
                            "powershell.exe -Command New-NetFirewallRule -DisplayName '" + id + "_" + p.getFileName() + "_Block_Out' -Direction Inbound -Program '" + p + "' -Action Allow"
                    ));
                }
                try (PrintWriter writer = new PrintWriter(String.format("%s_%s_Allow_Out.bat", id, path.getFileName()), Charset.defaultCharset())) {
                    paths.forEach(p -> writer.println(
                            "powershell.exe -Command New-NetFirewallRule -DisplayName '" + id + "_" + p.getFileName() + "_Block_Out' -Direction Outbound -Program '" + p + "' -Action Allow"
                    ));
                }
            }
        }
    }
}

Ach Mensch, der DisplayName in Zeile 35 und 40 ist noch falsch… und editieren geht nicht. :point_up:

das sind ja nur 6 Euro - das kann ich nicht mal als Spende absetzen :wink:

kein Stress, brauch ich erst in einem halben Jahr frühestens :grinning:

Aber mit Potenzial nach oben :wink:

ok :slight_smile: