Software Development
Italiano | English

FORUM
::  Menù Principale - Sito Web
del Geom. Marcello Cantelmo :: Un'Azienda. Molte Soluzioni !
 
:: In Primo Piano
< settembre 2010 >
L
M
M
G
V
S
D
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
     
             

Profilo Facebook di Marcello Cantelmo
Cerca per parola chiave
 


Titolo
In che modo Proteggi il tuo software?

 Chiave Hardware
 Chiave Software
 Nessuna Protezione




10/09/2010 @ 20.53.39
script eseguito in 16 ms


Valid XHTML 1.0 / CSS
\\ Home Page : Storico : Goliath .NET Obfuscator (inverti l'ordine)
Di seguito gli interventi pubblicati in questa sezione, in ordine cronologico.
 
 

Vengono presentate, in breve, le tecniche di protezione utilizzate in Goliath .NET Obfuscator

La maggior parte di queste tecniche sono state poi "copiate" ed inserite in prodotti concorrenti (tecniche "spudoratamente" simili verrano -adeguatamente- segnalate).

ENCRYPTION DELLE STRINGHE:

 è un'ulteriore tecnica da adottare per la protezione del ns codice. In Goliath .NET Obfuscator si è avuta una naturale evoluzione tra le varie release 1.x, 2.x, 3.x e 4.x.

Nella release 2.x -invece di cifrare la stringa byte-per-byte- si è scelto di implementare un'evoluzione di StackCrypt (tecnica rilasciata pubblicamente su CodeProject qui e qui a luglio'2004...da notare, all'epoca,  la mia mente ancora "inquinata" da codice vb6! : - D) che consente anche la "compressione" delle stesse.

Quindi, per ogni stringa, viene creato un metodo contenente la stringa da ricostruire a runtime. Ad esempio per una generica stringa "hello world!":

Dim txt As String = CryptMethod()

Function CryptMethod() As String
     Dim stack As New Stack(2)
    
Dim startCode As Integer = &H29BCA4A
     
'<<<
    
With stack
          startCode = startCode
Xor 1895280235
          .Push(startCode)
          startCode = startCode
Xor 491524942
          .Push(startCode)
          startCode = startCode
Xor 121969411
          .Push(startCode)
    
End With
     
'+++
    
Dim retValue As Byte() = STACKED_BYTES(stack)
    
Return System.Text.Encoding.UTF8.GetString(retValue)
End Function

Private Function STACKED_BYTES(ByVal st As Stack) As Byte()
    
Dim asmPos As Integer = 0
    
Dim tempValue((st.Count * 4) - 1) As Byte
     '<<<
    
For ik As Integer = 1 To st.Count
         
Dim arr As Byte() = BitConverter.GetBytes(DirectCast(st.Pop, Integer))
         
'---------------------------------------------------------------------
         
For ij As Integer = 3 To 0 Step -1
              
If arr(ij) > 0 Then
                   
tempValue(asmPos) = arr(ij)
                    asmPos += 1
              
End If
         
Next
    
Next
     '<<<
    
Dim retValue(asmPos - 1) As Byte
    
Array.Copy(tempValue, retValue, asmPos)
    
Return retValue
End Function

...la generazione casuale impedisce -anche al sottoscritto- qualsiasi previsione dei risultati di codifica! Ne consegue che ad un aggressore non basta "invertire" un solo algoritmo ma deve ricostruire N-metodi (metodi offuscati) contenenti N-stringhe! : - D

Nelle successive release l'encryption delle stringhe è legato all'offuscazione del codice! ; - )

 

CONTROL-FLOW OBFUSCATION (Spaghetti-Code)
[continua]

 

Vengono presentate, in breve, le tecniche di protezione utilizzate in Goliath .NET Obfuscator

La maggior parte di queste tecniche sono state poi "copiate" ed inserite in prodotti concorrenti (tecniche "spudoratamente" simili verrano -adeguatamente- segnalate).

RENAMING DEI SIMBOLI:

è una delle prime tecniche da adottare per la protezione del ns codice. Alcuni prodotti basano la protezione sul solo renaming (leggi DF). Sfortunatamente per noi -ad un aggressore che non conosce il ns programma- un metodo che si chiami "serialnumber" o "a0" poco importa...il codice interno è sempre leggibile! Il risultato è che in poco tempo è stato facile vedere solo "cloni di prodotti" (suite di controlli, ect.)

Comunque, per applicare il renaming:

goliath assembly.[exe][dll] ed utilizzare i seguenti parametri:

/renaming+
/chr
:[4][6][8][16][32][U][P][D] ...output rispettivamente di 4, 6, 8, 16 o 32 caratteri stampabili. [U]=1 carattere non stampabile, [P]=1 carattere stampabile, [D]=si usa un dizionario esterno

in abbinamento al parametro /chr:[4][6][8][16][32][D] è possibile utilizzare, per comodità, anche il parametro /optchr ed ottenere un risaltato di questo tipo: 61aa2b307ae4cb8b, 61Aa2b307ae4cb8b, 61aA2b307ae4cb8b ...simili per confondere la lettura di chi "spia" ma diversi nella sostanza. In un eventuale dump su file -nomi uguali- vengono sovrascritti.

In automatico, poi, si applica l'overloads dei simboli a metodi, proprietà, field, ect. (nomi uguali a simboli diversi). Questa tecnica risulta valida perchè consentita solo in assembler IL ma non in un linguaggio di alto livello (c#, vb).

 Dato che il range di caratteri utilizzabili è: 0123456789abcdef si può anche personalizzare l'output utilizzando il parametro:

/tbl:a=#,b=?

cioè le "a" dovranno essere convertite in "#" e tutte le "b" in "?".esempio:

61aa2b307ae4cb8b diventa: 61##2?307#e4c?8?

mentre utilizzando: /tbl:a=\1,b=\2 si specifica l'utilizzo di caratteri non stampabili: chr(1), chr(2), ect.

 

ENCRYPTION DELLE STRINGHE:

[continua a breve

 
Di Marcello Cantelmo (del 05/01/2010 @ 17:32:43, in Goliath .NET Obfuscator, linkato 261 volte)

Utilizzando il nuovo Goliath .NET Obfuscator rel. 4.x è possibile "unire" gli assembly in un unico exe o dll.

Pur disponendo di un valido prodotto bisogna, però, anche saperlo usare correttamente!

Chissà perchè poi un qualsiasi "fallimento" viene sempre imputato all'offuscatore!

Nello specifico mi riferisco all'ostinazione di alcuni utenti americani che cercano di unire i propri programmi con librerie di terze parti (un esempio su tutti è la suite di controlli DOTNETBAR).

N.B.: l'unione di librerie di terze parti porta ad una violazione della licenza d'uso delle stesse. Verificare sempre le condizioni di utilizzo!

Ad esempio, in DOTNETBAR, si usano alcune tecniche per l'assegnazione delle proprietà (nomi passati come stringa):

TypeDescriptor.GetProperties(page)["BackColor"].SetValue(page, Color.White); TypeDescriptor.GetProperties(page)["CanvasColor"].SetValue(page, Color.White);

quindi da qualche altra parte del codice ci sono le proprietà:

- BackColor
- CanvasColor

Risulta immediatamente chiaro a tutti (?) che -per una corretta protezione- le proprietà "BackColor" e "CanvasColor" NON DEVONO ESSERE RINOMINATE!

A questo punto si può decidere:

1) di non rinominare utilizzando /renaming- ed usare sola offuscazione del codice;
2) decorare con l'attributo ObfuscationAttribute(Exclude:=True) solo i metodi e proprietà che devono essere escluse dalla fase di renaming;
3) modificare il codice

Come sempre detto: LA PROTEZIONE DEVE NASCERE CON IL PROGETTO!!!

Il non voler e/o saper modificare opportunamente il codice fa dire che Goliath .NET Obfuscator NON funziona e provocare un danno di immagine a CANTELMO SOFTWARE!

A mio avviso, invece, conviene dire: "per incapacità professionale non sono riuscito a proteggere il mio programma!"

 
Di Marcello Cantelmo (del 12/10/2009 @ 13:53:10, in Goliath .NET Obfuscator, linkato 338 volte)
 
Di Marcello Cantelmo (del 28/02/2009 @ 09:38:59, in Goliath .NET Obfuscator, linkato 554 volte)

Continua l'evoluzione del nuovo prodotto (rel. 3.0.7) con l'inserimento di nuovi eccezionali parametri di protezione:

--clickonce
--fakeint
--fakecall
--chr:[u] o [p]

Parametro: --clickonce:[template] per la generazione automatica del ClickOnce Manifest direttamente da Goliath .NET Obfuscator senza passare da VS e/o MAGE;

esempio di template:
; -------------------------------------------------------------------
; Goliath .NET Obfuscator rel. 3.0.7 - Enterprise Edition
; The Ultimate Secure Obfuscator for .NET Platform
; Copyright (c) 2003-2009 CANTELMO SOFTWARE
; -------------------------------------------------------------------
[Application]
ProductName=clickOnce_Test

[Signing]
Certificate=d:\mypfx\myKey.pfx
CertificatePwd=12345

[Publish] Language=neutral
FolderLocation=d:\myOutFolder\
Version=1.0.0.1
...
[cut]

Parametro: --fakeint per il camuffamento dei valori booleani e di tutti i valori interi;

Parametro: --fakecall:[Fw.Namespaces] per il camuffamento delle chiamate alle funzioni interne di un determinato namespaces del Framework;

esempio d'utilizzo: --fakecall:#d:\project\myprj.txt

con il simbolo '#' -come al solito- si indica di andare a leggere il contenuto di un file (es.: myprj.txt) che contiene, ad esempio:

System.Console
System.String

N.B.: non necessariamente devono essere inseriti tutti i namespaces!

risultati ottenibili in un progetto console:

sub 'originale':

Public Shared Sub Main()
     Console.WriteLine(String.Concat("Hello", " World!")) 
     Console.ReadLine
End Sub

sub 'modificata' SENZA l'encryption delle stringhe:

Public Shared Sub a()
     a.a(a.a("Hello", " World!")) 
     a.A
End Sub

sub 'modificata' CON l'encryption delle stringhe:

Public Shared Sub a() 
     a.a(a.a(a.a, a.A)) 
     a.A
End Sub

Si evidenzia che -per far comprendere le tecniche utilizzate- in questo esempio NON è stato inserito il parametro di stop dei decompilers!: - P ...ipotizziamo -in questo modo- che l'attacker abbia utilizzato un de-obfuscator automatico e si prepara a "spiare" il ns codice: - D

Inoltre, sono state inserite 2 nuove opzioni al parametro --chr:

P=printable: renaming incrementale utilizzando 1 solo carattere stampabile (a, A, b, B, ect.)
U=unprintable: renaming incrementale utilizzando 1 solo carattere non-stampabile

stay tuned! ; - )

 

La "guerra" tra obfuscators contro decompilers (e/o deobfuscators) è sempre attuale. : - )

Sono stati rilasciati strumenti che -se usati creativamente- potrebbero facilitare un eventuale aggressore nell'eliminazione di una precisa tecnica di protezione: il control-flow! : - o

Prevedendo questa "realistica possibilità" è necessario complicare ulteriormente il codice dei ns algoritmi! ; - )

Ragion per cui in Goliath .NET Obfuscator release 3.0.4 (Edizione Enterprise) è stata inserita una nuova procedura che offusca i valori numerici unitamente ai valori booleani True/False (aggiornamento del 02-dic-2008). : - D

Cantelmo Software è sempre un passo avanti! Ai competitors "poco creativi"...non rimane altro che copiare anche questa tecnica! ; - )

 

Come più volte ribadito .NET è una piattaforma vulnerabile!

A dimostrazione di quanto affermato questa volta a farne le spese è stato lo stesso Goliath .NET Obfuscator : - D

Ebbene qualcuno che, forse, ritiene il proprio prodotto "competitors" di Goliath .NET Obfuscator ha pensato (bene?!?) di copiare spudoratamente una tecnica usata per bloccare Reflector ed i vari plug-in presenti sul mercato : - P

Non riuscendo a studiare il codice interno, il tizio (pure italiano!), ha copiato direttamente il risultato finale (tecnica unica e presente *solo* in Goliath .NET Obfuscator già da 4 anni) ; - )

Che dire?
- grazie per l'interesse ad un prodotto Cantelmo Software;
- complimenti per la creatività! : - )
- almeno ci stai guadagnando qualcosa? ; - )

Il prodotto è stato già scaricato e corservato per benino! al momento, non lo nomino, per non fare "pubblicità occulta" però mi riprometto (appena possibile) di realizzare un...

Stay tuned!

UPDATE del 27-ott-2008: il "tizio" ha rilasciato una nuova release eliminando ("camuffando") le similitudini con Goliath .NET Obfuscator!

UPDATE del 26-ago-2009: una promessa è sempre una promessa! Con la realizzazione del nuovo Goliath .NET Obfuscator rel. 4.x è stato implementato -direttamente- un nuovo parametro (/UNPACK:) che permette di spacchettare automaticamente tale prodotto: guarda il video in anteprima

 

In Goliath .NET Obfuscator v3.x è stato potenziato il renaming dei simboli. E' possibile, infatti, rinominare anche i simboli pubblici (classi, metodi, proprietà, field, eventi, interface, override, ect.). : - o

Questa feature che è inutile per la protezione di una singola dll (creazione di un componente) risulta essere abbastanza efficace nel camuffare le chiamate alle librerie referenziate in progetti più complessi.

Potendo, ora, alterare i simboli pubblici è stato possibile implementare anche la protezione contemporanea di più assembly referenziati! Di conseguenza, anche eventuali de-obfuscator, devono possedere questa caretteristica. La sola "analisi statica" sui singoli assembly è pressochè inutile. : - D

ESEMPIO: solo renaming di un singolo assembly:

goliath -r d:\folder\assembly.exe

ESEMPIO: solo renaming di un assembly con una libreria referenziata:

goliath -r d:\folder\assembly.exe --ref:d:\folder\assembly.dll

ESEMPIO: solo renaming di un assembly con due librerie referenziate:

goliath -r d:\folder\assembly.exe --ref:d:\folder\assembly1.dll,d:\folder\assembly1.dll

se invece ci sono numerose references è possibile definirle in un file esterno (ad esempio: references.txt)

d:\folder\assembly1.dll
d:\folder\assembly2.dll
d:\folder\assembly3.dll
...

e richiamate con:

goliath -r d:\folder\assembly.exe --ref:#d:\folder\references.txt : - D

L'overloading dei simboli è automatico! Il range di simboli (standard) utilizzati per il renaming è "limitato" alla sola tipologia alfanumerica: 0123456789abcdef.

All'utente finale, però, viene data, ampia possibilità di intervento. E' possibile infatti:

- definire il numero dei caratteri del testo finale (opzione --char:{number})
- variare il singolo carattere (opzione --tbl:{})

goliath -r d:\folder\assembly.exe --ref:d:\folder\#references.txt --tbl:a=?,b== --char:4

E' possibile generare, chiaramente, anche simboli non stampabili semplicemente impostando - nel parametro --tbl:{} - la definizione \{num}:

goliath -r d:\folder\assembly.exe --ref:d:\folder\#references.txt --tbl:a=\1,b=\2,3=\3,a=\4,b=\5 --char:4

La fase di esclusione dei simboli dal renaming avviene -esclusivamente da codice- utilizzando un attributo già presente nel .NET Framework sin dalla vers. 2.0:

[Obfuscation(Exclude=true)]
public event EventHandler test1;

[STAThread, Obfuscation(Exclude=true)]
internal static int Main([Obfuscation(Exclude=true)] string[] args)
{
}

dopo la fase di renaming -per non far capire alcuna logica progettuale- questo attributo viene automaticamente eliminato! ; - )

Ma come detto più volte: rinominare i simboli non significa offuscare il codice! Nelle prossime presentazioni si darà ampio risalto all'offuscazione del codice e all'encryption dei metodi : - o

stay tuned!

 
Di Marcello Cantelmo (del 27/08/2008 @ 14:47:50, in Goliath .NET Obfuscator, linkato 650 volte)

Iniziamo a conoscere il nuovo Goliath .NET Obfuscator v3.x presentando una delle features più richieste dai ns clienti: la modalità console. Il vantaggio di questa modalità è l'utilizzo del prodotto anche come "post-build" del processo di compilazione dei ns. progetti ; - )

Questa feature, però, ha comportato la completa rivisitazione di tutte le opzioni di protezione.

goliath /?


(N.B.: le caratteristiche possono variare senza preavviso)

Goliath .NET Obfuscator  3.0.0.0
Copyright (c) 2003-2008 CANTELMO SOFTWARE. All rights reserved.
The Ultimate Secure Obfuscator for .NET Platform

Usage: Goliath [options] [options]

Options:

  -? --help              Show this help list
  -c --codeshield[+|-]   Encrypt signed CodeShield methods
  -e --encryption[+|-]   Full strings encryption
  -o --obfuscating[+|-]  Full code obfuscation
  -r --renaming[+|-]     Full symbols renaming
     --bak[+|-]          Backs-up the original file before processing
     --charopt[+|-]      Optimize chars symbols for renaming
     --chr:number        Chars used for symbols renaming. number: 4 (default), 6, 8, 16 or 32
     --help+             Show an additional help list
     --ildasm[+|-]       Prevent ILDASM tool from disassembling
     --nsp:list          Also -namespaces:list. Exclude namespaces. list:namespaces,...
     --out:folder        Specifies the output folder name
     --ref:list          Also -references:list. Add references assembly. list:references,...
     --snk:key           Specifies the strong-name key file
     --tbl:list          Specifies symbol(s) table for renaming. list:name=value,...


altre opzioni: goliath --help+


Goliath .NET Obfuscator  3.0.0.0
Copyright (c) 2003-2008 CANTELMO SOFTWARE. All rights reserved.
The Ultimate Secure Obfuscator for .NET Platform

Usage: Goliath [options] [options]

Options:

  -V --version      Display version and licensing information
     --nologo[+|-]  Do not display the CANTELMO SOFTWARE copyright
     --quiet[+|-]   Report obfuscation progress
     --time[+|-]    Measure elapsed time
     --usage        Show usage syntax and exit

 
Di Marcello Cantelmo (del 16/07/2008 @ 12:24:29, in Goliath .NET Obfuscator, linkato 467 volte)
Goliath .NET Obfuscator è un prodotto stabile ed affidabile. La nuova versione recepisce tutte le features richieste dai clienti: - utilizzo da console per una eventuale integrazione con i processi di build automatizzati; - maggiore velocità di esecuzione nell'offuscazione del codice - nuovo schema di encryption delle stringhe (compatibile con i sistemi a 64 bit) - ect.
 
Pagine: 1 2


. . : :   U N D E R   C O N S T R U C T I O N   : : . .
Home Page:Servizi:Soluzioni:Clienti:Prodotti:Azienda

: : Use OpenOffice.org :
Copyright © 2003-2009 "Cantelmo Software" del Geom. Marcello Cantelmo. Tutti i Diritti sono Riservati • Note Legali
Document made with Nvu
Microsoftâ„¢, Windowsâ„¢, .NETâ„¢, and .NET Frameworkâ„¢ sono marchi di Microsoft Corporation. Tutti gli altri marchi appartengono ai legittimi proprietari.

powered by dBlog CMS ® Open Source