Tool eazFuscator 2023 string decryptor

insidehackers

Utente Gold
28 Giugno 2013
641
30
222
318
Cosi per gioco un collega stava creando un applicazione in C# vantandosi della robusteza dell'offuscatore da lui utilizzato appunto Eazfuscator.NET scaricabile da qui per fare i vostri test
Eazfuscator.NET Download

Per la decompilazione ho usato dnSpy e per la scrittura del decryptor ho utilizzato System.Reflection e la libreria dnlib, a me interessava decryptare le stringhe quindi debuggando un po il codice mi sono accordo che Eazfuscator convertiva le stringhe in (int32) e tramite la chiamata ad una funzione le riconvertiva in stringhe a runtime quindi è stato abbastanza semplice, questo è il metodo che viene chiamato per decryptare le stringhe come parametro in input vuole un int32 e tira fuori una stringa
1699804551121.png

Questo metodo a sua volta chiama un altro metodo che in effetti è proprio quello che decrypta la stringa cioè questo:
1699804737624.png

L'ho tagliato perchè non ci interessa cosa fa ma ci basta passargli i parametri e chiamare il metodo e prendere la stringa in output, per farlo ho caricato il modulo con dnlib e mi sono fatto una lista di tutti i metodi presenti nell'applicativo, poi per ogni metodo vado a controllare ogni istruzione per trovare tutte le chiamate al metodo \u0002(int \u0002),
una volta che mi trovo in un metodo che contiene la chiamata vado semplicemente a recuperare il parametro dall'istruzione precedente, chiamo la funzione con il parametro e vado a patchare l'applicativo sostituento la call con un ldstr e la stringa che mi è uscita fuori

C#:
foreach (MethodDef method in methodList)
{
    if(method.HasBody == false) { continue; }
    for (int i = 0; i < method.Body.Instructions.Count; i++)
    {
        var instruction = method.Body.Instructions[i];
        if (instruction.OpCode.Name == "call" && instruction.Operand == DecryptMethod )
        {
            Int32 value = (Int32)method.Body.Instructions[i - 1].Operand;
            String decryptedString = (String)assembly.GetModules()[0].ResolveMethod(ActualDecryptMethod.MDToken.ToInt32()).Invoke(null, new object[] { value, false });
            //Patch
            method.Body.Instructions[i - 1].OpCode = OpCodes.Ldstr;
            method.Body.Instructions[i - 1].Operand = decryptedString;
            instruction.OpCode = OpCodes.Nop;
            File.AppendAllText(args[0] + "_strings.txt", decryptedString + "\n");
        }
    }
}

Il codice sorgente lo potete scaricare da qui:
EazDefuscatorCore GitHub
 
L'ho provato e mi piace quest'approccio, lo uso spesso con diversi packer per la rapidità, colgo l'occasione per ricordare a tutti che queste cose vanno fatte in VM altrimenti prima o poi potreste imbattervi in un sample tipo:
C#:
using System.Diagnostics;

namespace EazDefuscatorRce
{
    internal class Program
    {
        static Program() { }

        static string Poison(int k, bool b)
        {
            if (k == 123)
                Process.Start(new ProcessStartInfo("https://www.youtube.com/watch?v=dQw4w9WgXcQ") { UseShellExecute = true });

            return string.Empty;
        }

        static string FakeDecrypt(int k)
        {
            bool b = false;
            string s = Poison(k, b);
            return s;
        }

        static void Main(string[] args)
        {
            FakeDecrypt(1);
            FakeDecrypt(5);
            if (args.Length > 99999)
                FakeDecrypt(123);

            FakeDecrypt(125);
        }
    }
}
:asd:
 
  • Love
Reazioni: insidehackers
L'ho provato e mi piace quest'approccio, lo uso spesso con diversi packer per la rapidità, colgo l'occasione per ricordare a tutti che queste cose vanno fatte in VM altrimenti prima o poi potreste imbattervi in un sample tipo:
C#:
using System.Diagnostics;

namespace EazDefuscatorRce
{
    internal class Program
    {
        static Program() { }

        static string Poison(int k, bool b)
        {
            if (k == 123)
                Process.Start(new ProcessStartInfo("https://www.youtube.com/watch?v=dQw4w9WgXcQ") { UseShellExecute = true });

            return string.Empty;
        }

        static string FakeDecrypt(int k)
        {
            bool b = false;
            string s = Poison(k, b);
            return s;
        }

        static void Main(string[] args)
        {
            FakeDecrypt(1);
            FakeDecrypt(5);
            if (args.Length > 99999)
                FakeDecrypt(123);

            FakeDecrypt(125);
        }
    }
}
:asd:
😂😂