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
Questo metodo a sua volta chiama un altro metodo che in effetti è proprio quello che decrypta la stringa cioè questo:
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
Il codice sorgente lo potete scaricare da qui:
EazDefuscatorCore GitHub
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
Questo metodo a sua volta chiama un altro metodo che in effetti è proprio quello che decrypta la stringa cioè questo:
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