Laden...

Wie funktioniert die Obfuscation in diesem Beispiel?

Erstellt von cprogrammer vor 8 Monaten Letzter Beitrag vor 8 Monaten 680 Views
Thema geschlossen
C
cprogrammer Themenstarter:in
73 Beiträge seit 2023
vor 8 Monaten
Wie funktioniert die Obfuscation in diesem Beispiel?

Hallo, normalerweise werden bei Obfuscation ja codeteile verändert, aber sind (mit gewissem Aufwand) immer noch lesbar.

Hier ist etwas, was scheinbar bullet proof ist.

Alle Methoden der Applikation sind leer und gekennzeichnet mit:

[MethodImpl(MethodImplOptions.NoInlining)]
    protected override void OnConnectionStatusUpdate(ConnectionStatusEventArgs status)
    {
    }

zu den Referenzen gehören u.a.

kernel32.dd

AgileDotNetRT64Pro.dll

AgileDotNetRTPro.dll

Letztere dll stellt eine Klasse mit Methoden bereit, mit denen die eigentliche (geschützte) Applikation scheinbar Initialisiert und geladen wird, fraglich ist nur wie und von wo, letztlich wird sie ja ausgeführt:

internal static IntPtr Load()
    {
        WindowsImpersonationContext windowsImpersonationContext = WindowsIdentity.Impersonate(IntPtr.Zero);
        Type typeFromHandle;
        Monitor.Enter(typeFromHandle = typeof(global::<AgileDotNetRTPro>));
        string text = ((IntPtr.Size != 4) ? "AgileDotNetRT64Pro.dll" : "AgileDotNetRTPro.dll");
        string text2 = Path.Combine(Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath), text);
        if (!File.Exists(text2))
        {
            text2 = text;
        }
        IntPtr result = LoadLibraryA(text2);
        windowsImpersonationContext.Undo();
        Monitor.Exit(typeFromHandle);
        return result;
    }
 internal static int InitializeThroughDelegate(IntPtr P_0)
    {
        IntPtr intPtr = Load();
        IntPtr procAddress = GetProcAddress(intPtr, "_Initialize");
        global::InitializeDelegate initializeDelegate = (global::InitializeDelegate)Marshal.GetDelegateForFunctionPointer(procAddress, typeof(global::InitializeDelegate));
        return initializeDelegate(P_0);
    }

Kann jemand was dazu sagen, wie das hier funktionieren könnte, wäre zu Lehrzwecken schon recht interessant ?

Hinweis von Abt vor 8 Monaten

Wäre toll, wenn Du irgendwann mal Titel verwendest, die man nicht anpassen muss 😃

6.912 Beiträge seit 2009
vor 8 Monaten

Hallo cprogrammer,

was scheinbar bullet proof ist.

Ist es nicht.
Sobald der Code ausgeführt wird, lässt sich das mit einem Debugger rekonstruieren. "Bullet proof" geht hier nicht, aber das solltest du über die Forensuche, etc. schon gefunden haben 😉

wäre zu Lehrzwecken schon recht interessant ?

Ein gut gemeinter Rat: zu Lehrzwecken wären die Grundlagen von C# / .NET interessanter als irgendwelche komischen Dinge die eh nicht funktionieren.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

4.962 Beiträge seit 2008
vor 8 Monaten

Das hat nichts mit Obfuscation zu tun, sondern im Code wird einfach eine native DLL dynamisch per LoadLibraryA geladen.

Und mit GetProcAddress wird dann die Adresse einer Funktion bestimmt (in deinem Code explizit für _Initialize) und (in diesem Fall per Delegate) ausgeführt.

Zur Auflistung der Funktionsnamen einer DLL kann ich dir die beiden in meinem Beitrag in DLL (wahrscheinlich C++ native?) durch eine C# ersetzen? Geht das? erwähnten Tools empfehlen.

C
cprogrammer Themenstarter:in
73 Beiträge seit 2023
vor 8 Monaten

Oben wurde geschrieben: "Sobald der Code ausgeführt wird, lässt sich das mit einem Debugger rekonstruieren."

Wo und wie setzt du hier den Einstieg, denn du hast ja weder den Sourcecode, noch das pdb file ?

Insgesamt wäre es dennoch interessant zu wissen wie das funktioniert.

Die obfuscated Klassen sehen nach der Obfuscation beispielhaft so aus:


internal sealed class XYZ
{
    internal SortedList<double, abc> Name { get; set; }

    [MethodImpl(MethodImplOptions.NoInlining)]
    internal YXZ()
    {
    }
    [MethodImpl(MethodImplOptions.NoInlining)]
    internal void Method1(XYZ name zone)
    {
    }
    [MethodImpl(MethodImplOptions.NoInlining)]
    internal void AddMethod()
    {
    }
    [MethodImpl(MethodImplOptions.NoInlining)]
    internal void RemoveMethod()
    {
    }
    [MethodImpl(MethodImplOptions.NoInlining)]
    static XYZ()
    {
        <AgileDotNetRTPro>.Initialize();
        <AgileDotNetRTPro>.PostInitialize();
    }
}

Also alle Methoden leer und die untere Methode wird aufgerufen.

Als Assemly existiert eine AgileDotNetRTPro.dll, welche mit dem ursprünglichen Projekt nix zu tun hat.

Die letzte static Methode wurde hinzugefügt.

16.861 Beiträge seit 2008
vor 8 Monaten

Zitat von cprogrammer

Als Assemly existiert eine AgileDotNetRTPro.dll, welche mit dem ursprünglichen Projekt nix zu tun hat.

Die letzte static Methode wurde hinzugefügt.

Und das verstehst, wenn Du Dir einfach 5 Min das Zeug des Herstellers durchliest: das ist ein durch den Obfuscator erstellter Code-Container, damit Du nicht an den originalen Source Code kommst.

Da Du hier offenbar versuchst ein kommerzielles Produkt zu Reverse-Engineeren, was in der EU verboten ist, und nicht nur für Dich sondern leider auch für myCSharp unschöne Folgen haben kann, mache ich hier dicht.

Thema geschlossen