domenica 10 febbraio 2019

Proteggere il codice sorgente in .net

In questo post trovate illustrata una procedura per aggiungere un po' di protezione ai vostri sorgenti c# relativi ad applicazioni windows forms, in certe condizioni l'applicazione rende inutili sia decompilatori che deoffuscatori e protegge il codice sorgente anche non offuscato,
qui il progetto https://sourceforge.net/projects/winformsprotector/






Uno scenario possibile : abbiamo un eseguibile da far testare da altri ma non vogliamo cederlo per il momento, possiamo quindi crittografare l' eseguibile ed andare sulla macchina di prova con il nostro exe crittografato ed il software per decrittografarlo ovvero inserire la password per decrittografarlo e caricarlo in memoria .

 Si può procedere nel modo seguente mediante il software  WinFormsProtector :
 1) dopo aver selezionato il file eseguibile da proteggere (con il bottone "choose executable to encrypt") e scelta la password e premuto il bottone "choose path file to encrypt" per scegliere il percorso dove salvare il file, si può quindi procedere alla creazione del file crittografato premendo il bottone "encrypt file into path" ,il file creato si chiama "encryptedExe.encrypt"
 2) installazione di WinFormsProtector sulla macchina di test sul quale verrà caricato il file crittografato di cui sopra
 3) inserimento della password utilizzata per crittografare il file
 4) selezione del file da decrittografare premendo il bottone "choose file to decrypt"
 5) premere il pulsante  "decrypt file,load in ram and run"

quindi carichiamo il file in memoria e qui lo decrittografiamo e lo eseguiamo,in pratica carichiamo l'Assembly in questo modo :

Assembly assembly1 = Assembly.Load(exe);
dove exe è l'array di bytes che compone l'eseguibile
in questo modo sulla macchina non esiste il file che intendiamo proteggere in chiaro ma esiste solo crittografato oppure in memoria ,

nel file eseguibile che s' intende proteggere(l'exe chiamato) bisogna modificare il main in questo modo:
in pratica aggiungete un metodo Start() che chiama il primo Form della vostra applicazione

namespace Ethical_Hacking
{
    static class Program
   {
     [STAThread]
     static void Main()
    {
       Application.EnableVisualStyles();
       Application.SetCompatibleTextRenderingDefault(false);
     Start();
    }

//il metodo seguente permette di superare gli eventuali problemi con il metodo SetCompatibleTextRenderingDefault
   public static void Start()
  {
   Form1 f = new Form1();
   f.ShowDialog();
   }

 }
}

nell'exe chiamante avremo quindi :
Assembly assembly1 = Assembly.Load(exe);
var programType1 = assembly1.GetTypes().FirstOrDefault(c => c.Name == "Program");
MethodInfo method1 = programType1.GetMethod("Start", BindingFlags.Public | BindingFlags.Static);
method1.Invoke(null, new object[] { });

ovvero viene invocato il metodo Start() .

Se il file exe da proteggere usa dei riferimenti bisogna aggiungere questi riferimenti nel progetto (eseguibile) chiamante , ad esempio ,se usiamo NewtonSoft.json nel programma da proteggere anche il programma chiamante deve avere NewtonSoft.json nei suoi riferimenti

Nel codice sorgente troverete due progetti zippati :WindowsFormsProtector e Ethical_Hacking ,l primo è l'exe chiamante il secondo è l'exe chiamato (ovvero quello protetto) , qui il codice  https://sourceforge.net/projects/winformsprotector/

Qui altri programmi con lo stesso scopo

Crittografia e WCF per passare una password ( od una qualsiasi altra stringa (xml,json, etc.etc.) ) da un applicazione ad un' altra in sicurezza

 Il codice che segue è da considerarsi in alpha e da non utilizzare in un ambiente di produzione , qui potete trovare il  "progetto...