Condividi tramite


Ridenominazione dei metodi con Overload Induction

Per la ridenominazione dei metodi, Dotfuscator implementa una tecnologia brevettata denominata Overload Induction™. Mentre la maggior parte dei sistemi di ridenominazione si limita ad assegnare un nuovo nome per ciascun nome precedente (ad esempio, "getX()" diventa "a()" e "getY()" diventa "b()"), Overload Induction ottimizza l'overload dei metodi. Il principio di base consiste nel tentativo dell'algoritmo di rinominare il maggior numero possibile di metodi utilizzando esattamente lo stesso nome. Secondo le segnalazioni di numerosi utenti, il 33% di tutti i metodi viene rinominato in "a()". In questi casi, ciò corrisponde al 50% di tutti i metodi rinominabili. Esistono infatti metodi che per definizione non possono essere rinominati, quali i costruttori, i "costruttori di classe" e i metodi che devono essere chiamati dal runtime.

In seguito a tale offuscamento, la logica risulta completamente incomprensibile, sebbene non venga distrutta. Nell'esempio seguente viene illustrata l'efficacia della tecnica di Overload Induction.

Codice sorgente originale prima dell'offuscamento
private void CalcPayroll(SpecialList employeeGroup) {
   while (employeeGroup.HasMore()) {
        employee = employeeGroup.GetNext(true);
        employee.UpdateSalary();
        DistributeCheck(employee);
    }
}
Codice sorgente decodificato dopo l'offuscamento con la funzionalità Overload Induction di Dotfuscator
private void a(a b) {
    while (b.a()) {
        a = b.a(true);
        a.a();
        a(a);
    }
}

Nell'esempio viene dimostrato che il codice offuscato è più compatto. Un effetto positivo della ridenominazione è infatti costituito da una riduzione delle dimensioni. Se ad esempio si rinomina come a() un nome costituito da 20 caratteri, viene risparmiato lo spazio corrispondente a 19 caratteri, conservando allo stesso tempo le voci di heap delle stringhe. La ridenominazione di ogni nome in "a" implica la memorizzazione di "a" una sola volta. Ogni metodo o campo ridenominato in "a" punterà pertanto a tale voce memorizzata. La tecnica di Overload Induction potenzia ulteriormente tale effetto, in quanto gli identificatori più brevi vengono continuamente riutilizzati.

Questa metodologia presenta diversi vantaggi.

  1. La ridenominazione è utilizzata da molto tempo per rendere difficilmente comprensibile l'output decompilato. La ridenominazione in caratteri non stampabili o in nomi non validi nel linguaggio di origine di destinazione si rivela inutile, poiché i decompilatori possono essere facilmente dotati delle funzionalità necessarie per rinominare tali identificatori. Poiché Overload Induction può convertire in un unico nome tre nomi di metodo "a()", la comprensione dell'output decompilato risulta notevolmente più complessa.
  2. Overload Induction non presenta limitazioni aggiuntive rispetto a quelle esistenti in tutti i sistemi di ridenominazione. Tali limitazioni verranno illustrate più avanti.
  3. Poiché la tecnica di Overload Induction consente di utilizzare la stessa lettera con maggiore frequenza, i nomi di lunghezza maggiore (ad esempio aa, aaa e così via) vengono utilizzati più raramente, ottenendo così un ulteriore risparmio in termini di spazio.

L'algoritmo brevettato di Overload Induction individua tutti i possibili conflitti di ridenominazione ed esegue l'overload dei metodi solo quando l'operazione può essere eseguita in modo sicuro. È dimostrato che questa procedura è irreversibile. In altri termini, è impossibile ricostruire le relazioni con i nomi di metodo originali, anche eseguendo nuovamente Overload Induction.

© 2002-2007 PreEmptive Solutions. Tutti i diritti riservati.