Schlagwort: Technik

CCC-Fahrplan aktualisiert 👍 👎

Meine Variante des CCC-Fahrplans wurde erneut aktualisiert und enthält nun auch Informationen zum 35c3.

Die Daten werden regelmäßig aktualisiert; für verbindliche Angaben halte dich bitte an den offiziellen Fahrplan.

Traceroute per C# 👍 👎

In früheren Beiträgen hatte ich bereits erläutert, wie man per C# auf eine Konsolenausgabe zugreifen und programmatisch einen Ping durchführen kann. Dieser Beitrag soll nun ein einfaches Tracerouting per C# nachbilden. Dazu implementieren wir im Folgenden eine einfache (und wie üblich auf das Wesentliche reduzierte) Klasse, welche die Funktionalität durch sukzessive Erhöhung des TTL-Wertes für schlichte Ping-Pakete umsetzt.
Klasse implementieren
01020304050607080910111213141516171819202122232425
public class Traceroute : IDisposable {    private static readonly byte[] buffer = new byte[] {        0x01, 0x03, 0x03, 0x07    };  // Daten zur Übertragung
private readonly Ping ping = new Ping();

public IEnumerable<PingReply> Send(string hostNameOrAddress, int timeout = 3000) { // Paket mit TTL=1 initialisieren PingOptions pingOptions = new PingOptions(1, false);
PingReply pingReply = null;
do { pingReply = this.ping.Send(hostNameOrAddress, timeout, Traceroute.buffer, pingOptions);
// TTL für nächsten Schritt inkrementieren pingOptions.Ttl++;
yield return pingReply; } while(pingReply.Status != IPStatus.Success); }
public void Dispose() => this.ping.Dispose();}
Die Verwendung gestaltet sich nun sehr einfach:
Klasse verwenden (exkl. Namensauflösung)
0102030405
using(Traceroute traceroute = new Traceroute()) {    foreach(PingReply pingReply in traceroute.Send("coders-online.net")) {        Console.WriteLine(pingReply.Address);    }}
Um die entsprechenden Hostnamen zu den jeweiligen IP-Adressen zu ermitteln, kann beispielsweise die Methode Dns.GetHostEntry(…) dienen:
Klasse verwenden (inkl. Namensauflösung)
0102030405060708091011
using(Traceroute traceroute = new Traceroute()) {    foreach(string hostNameOrAddress in traceroute.Send("coders-online.net").Select(pR => {        try {            return Dns.GetHostEntry(pR.Address).HostName;        } catch {            return pR.Address.ToString();        }    })) {        Console.WriteLine(hostNameOrAddress);    }}

Syslog-Nachrichten mit C# versenden 👍 👎

Syslog beschreibt einen Protokollierungsstandard. Dieser Beitrag soll die beispielhafte Implementierung eines C#-Clients aufzeigen. Dazu werden UDP-basierte Nachrichten im (älteren) BSD-Format nach RFC 3164 erzeugt.

In einem früheren Beitrag hatte ich bereits mein NAS von Synology erwähnt. Sofern ihr ebenfalls ein solches besitzt, könnt ihr dieses sehr einfach als Server einrichten und somit direkt für die Beispiele (und mehr) nutzen.
Syslog-Klasse implementieren
010203040506070809101112131415161718192021222324252627282930313233343536
public class Syslog : IDisposable {    private const int Facility = 1;  // user-level messages    private const int FacilityFactor = 8;
private readonly UdpClient udpClient;

public Syslog(string hostname = "localhost", int port = 514) { this.udpClient = new UdpClient(hostname, port); }
public void Send(Severity severity, string message, [CallerMemberName] string caller = null) { byte[] data = Encoding.UTF8.GetBytes(String.Format("<{0}>{1} {2} {3}", ((Syslog.Facility * Syslog.FacilityFactor) + (int) severity), DateTime.Now.ToString("MMM dd HH:mm:ss"), Dns.GetHostName(), ((!String.IsNullOrWhiteSpace(caller)) ? (caller + " ") : (String.Empty)) + message ));
this.udpClient.Send(data, data.Length); }
public void Dispose() => this.udpClient?.Dispose();

public enum Severity { Emergency, // [0] system is unusable Alert, // [1] action must be taken immediately Critical, // [2] critical conditions Error, // [3] error conditions Warning, // [4] warning conditions Notice, // [5] normal but significant condition Informational, // [6] informational messages Debug, // [7] debug-level messages } // https://tools.ietf.org/html/rfc3164}
Es handelt sich hierbei – wie üblich – um eine minimale Implementierung ohne Fehlerbehandlung, welche außerdem keine Konfiguration des Facility-Wertes ermöglicht. Die Verwendung gestaltet sich nun jedoch sehr einfach:
Syslog-Klasse verwenden
01020304
using(Syslog syslog = new Syslog("syslog.example.net")) {    syslog.Send(Severity.Notice, "Dies ist eine weniger interessante Meldung.");    syslog.Send(Severity.Warning, "Dies ist eine sehr interessante Meldung.", "MyApp");}

CCC-Fahrplan aktualisiert 👍 👎

Mein im letzten Jahr gestarteter CCC-Fahrplan wurde aktualisiert und enthält nun Informationen zum 34c3.

Die Daten werden regelmäßig aktualisiert; für verbindliche Angaben halte dich bitte an den offiziellen Fahrplan.

Windows Defender mit C# ansprechen 👍 👎

Windows stellt unter der Bezeichnung Antimalware Scan Interface native Funktionalität zur Interaktion mit Windows Defender bereit. Wir werden für C# also – wieder einmal – auf DllImport setzen:
Wrapper implementieren
01020304050607080910111213141516171819202122232425262728293031
public static class AmsiWrapper {    public static Result Scan(string content, string name = null) {        AmsiInitialize(nameof(AmsiWrapper), out IntPtr context);        AmsiScanString(context, content, name, IntPtr.Zero, out Result result);        AmsiUninitialize(context);
return result; }
public enum Result { Clean = 0, NotDetected = 1, Detected = 32768 }

[DllImport("Amsi")] private static extern int AmsiInitialize(string appName, out IntPtr amsiContext);
[DllImport("Amsi")] private static extern int AmsiScanString( IntPtr amsiContext, string @string, string contentName, IntPtr session, out Result result );
[DllImport("Amsi")] private static extern void AmsiUninitialize(IntPtr amsiContext);}
Die Verwendung der empfohlenen Funktion AmsiResultIsMalware ist kurioserweise leider nicht möglich, da diese schlicht nicht in Amsi.dll gefunden werden kann. Es gilt also die Hinweise von AMSI_RESULT zu beachten.

Die Überprüfung gestaltet sich nun jedoch grundsätzlich äußerst einfach durch Übergabe des fraglichen Inhalts:
Wrapper verwenden
0102030405
if(AmsiWrapper.Scan("sehrGefährlicherInhalt") == AmsiWrapper.Result.Detected) {    /* Inhalt als Bedrohung erkannt */} else {    /* Inhalt nicht als Bedrohung erkannt */}
Zum Test der Erkennung potentiell bedrohlicher Inhalte kann beispielsweise die EICAR-Testdatei dienen.

Vor einem tatsächlichen Einsatz sollten mindestens noch Überprüfungen der Rückgabewerte (→ HRESULT) mit entsprechender (Fehler-)Behandlung ergänzt werden.

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche