DLL Side Loading in VB.net

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von VB-Fan.

    DLL Side Loading in VB.net

    Hallo,

    Aus Sicherheitsgründen möchte ich verhindern, dass DLLs standardmäßig aus meinem Anwendungsverzeichnis geladen werden. Ich würde mein Applikationsverzeichnis nicht ausschliessen, aber bevorzugt mit System32 usw. beginnen um eventuelles DLL side loading im Applikationsverzeichnis zu verhindern.

    Ich habe schon einiges (eigentlich sehr viel) im Netz gesucht, aber irgendwie keine Lösung gefunden. Auch DefaultDllImportSearchPaths mit DllImportSearchPath hat mich da nicht weitergebracht, da hier kein Parameter da ist, der z.B. System32 priorisiert.

    Wenn ich mit Process Monitor mitschaue, wird z.B. immer CRYPTBASE.dll im Anwendungsverzeichnis zuerst gesucht. Auch wenn ich die Authenticode Signatur von der Microsoft DLL testweise entferne, wird die DLL auch genutzt, wenn ich sie vom System32 Verzeichnis ins Anwendungsverzeichnis kopiere.

    Habe da auch schon in Richtung SetDllDirectory (erfolglos) getestet, ich vermute, das ist aber zu spät, da wird schon auf die DLL zugegriffen. Wenn ich sicherstellen könnte, dass nur signierte DLLs geladen werden, wäre das vielleicht auch eine Variante.

    Hat da jemand eine Idee bzw. einen Ansatz, in welche Richtung ich da suchen muss?
    Was du versuchen könntest, ist in deiner Applikation folgendes Event zu abonnieren:

    C#-Quellcode

    1. AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;


    Und darin kannst du dann prüfen, wie der Pfad der Assembly ist.

    C#-Quellcode

    1. private Assembly? CurrentDomain_AssemblyResolve(object? sender, ResolveEventArgs args) {
    2. var appFolder = Path.GetDirectoryName(args.RequestingAssembly?.Location); // das hier wäre der Pfad der Assembly, welches versucht eine .dll zu laden
    3. var asmName = new AssemblyName(args.Name);
    4. if (File.Exists(Path.Combine(appFolder, asmName.Name)) {
    5. // es wird versucht, eine Assembly aus deinem Applikationsordner zu laden
    6. }
    7. }
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    -Franky- schrieb:



    Vielen Dank, diese Seite kenne ich, lande bei meiner Suche irgendwie immer wieder dort. Da geht es hauptsächlich um das CWD, das hilft mir da leider nicht weiter.

    @siycah:
    Vielen Dank, das AssemblyResolve Event dürfte aber nur auftreten, wenn die DLL nicht "resolved" werden kann. Da die Datei ja im PE-Verzeichnis existiert oder ggf. im System32, tritt das Event nicht auf. Ich habe das auch mit dem AssemblyLoad Event versucht und auch das Event (dieses Projekt ist in VB schon frühzeitig im ApplicationEvents.vb zu definieren, aber noch bevor das der Event Handler gesetzt wird, erfolgt schon der Zugriff.

    Ich habe das mit einem neuen blanken .net Projekt getestet, da wird lt. Process Monitor immer z.B. nach Wldp.dll, profapi, CRYPTBASE.dll usw. gesucht, obwohl hier keine Referenz definiert ist.
    Wie kann ich die Suche mit SettDLLDirectory, LoadLibrary oder LoadlibraryEx usw. beeinflussen, wenn .net hier diese DLLs schon vorab in meinem PE-App-Verzeichnis sucht?



    Also lt. ich meinen Recherchen dürften die Wldp.dll, profapi, CRYPTBASE.dll, ... durch die als "Known DLL" definierte advapi32.dll geladen werden. Die advapi32.dll wird korrekt aus System32 geladen, die "ge-forward-eten" wie die CRYPTBASE.DLL aber dann wieder nach der Verzeichnis Suche im App-Verzeichnis zuerst. Da kann man anscheinend im .NET machen was man will, der zugriff erfolgt anscheinend noch bevor man im Code überhaupt eingreifen kann.

    Falls noch jemand Input dazu hat bzw. eine Lösung wäre es natürlich toll.

    Beiträge zusammengefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()