Skip to Content
Nuova versione 12 disponibile 🎉
ObfuscatorRidenominazione dei simboliDecodifica degli stack trace

Decodifica degli stack trace

Offuscare un’applicazione aggiunge uno strato di protezione alla proprietà intellettuale e offre un vantaggio competitivo, perché rende più difficile il reverse engineering. Questa sicurezza in più complica però la segnalazione degli errori. L’offuscamento può rendere più difficile l’analisi degli arresti anomali, perché lo stack trace diventa spesso una serie di simboli illeggibili che complica il debug.

Decodificare gli stack trace in .NET

Gli sviluppatori .NET si affidano di solito agli stack trace per individuare la causa degli errori di un’applicazione. L’offuscamento, però, li trasforma in un groviglio incomprensibile. Con Babel Obfuscator decodificare questi stack trace offuscati diventa semplice. Lo strumento richiede un file map, generato durante il processo di offuscamento.

Generare il file map

Quando abiliti la generazione del file map XML in Babel Obfuscator, per impostazione predefinita il file map viene generato nella stessa cartella dell’assembly offuscato. Il file prende il nome dell’assembly originale con l’aggiunta di .map.xml (per esempio MyApp.exe.map.xml).

Il file map generato contiene la corrispondenza tra i nomi offuscati e i nomi originali dei simboli.

Nota che la ridenominazione con overload va disabilitata (--nooverloaded), perché assegna lo stesso nome a metodi diversi e può rendere ambigua la decodifica dello stack trace. Se la ridenominazione con overload è abilitata, durante la decodifica Babel indica tutti i metodi che possono corrispondere.

Puoi personalizzare la posizione di output del file map in modi diversi, a seconda di come usi Babel.

Riga di comando

babel MyApp.exe --mapout CustomPath/MyMapping.xml

Se ometti il parametro con il percorso del file, viene usata la convenzione di denominazione predefinita nella cartella di destinazione.

Task MSBuild

<Babel GenerateMapOutFile="true" MapOutFile="CustomPath/MyMapping.xml" />

Pacchetto NuGet di Babel Obfuscator

<PropertyGroup> <GenerateMapOutFile>true</GenerateMapOutFile> <BabelMapOutFile>CustomPath/MyMapping.xml</BabelMapOutFile> </PropertyGroup>

Babel Desktop

In Babel Desktop, seleziona l’assembly e abilita GenerateMapOutFile nel gruppo Output & diagnostics del pannello delle proprietà. Imposta MapOutFile per scrivere il file map in un percorso personalizzato. Vedi Progetti di offuscamento.

Decodificare lo stack trace offuscato

Quando un’applicazione offuscata si arresta in modo anomalo e produce uno stack trace offuscato, usa Babel per decodificarlo. Babel Obfuscator include strumenti integrati per decodificare gli stack trace offuscati tramite i file map.

Babel Desktop

I passi seguenti sono un riepilogo; vedi Decodificatore stack per la guida completa.

Apri il decodificatore stack

Apri la tavolozza comandi ed esegui Strumenti: Decoder dello stack.

Aggiungi i file map

Aggiungi i file map XML con Aggiungi file map…, oppure trascinali sul decodificatore. Puoi aggiungere più file map quando lo stack trace riguarda più assembly.

Incolla lo stack trace

Incolla lo stack trace offuscato, oppure caricalo da un file con Apri traccia….

Decodifica

Premi Decodifica per visualizzare lo stack trace decodificato.

Riga di comando

In alternativa, usa lo strumento da riga di comando babel:

babel --stacktrace StackTrace.txt --mapin MyApp.exe.map.xml --mapin Library.dll.map.xml

Puoi indicare più file map se lo stack trace coinvolge più assembly.

Frame del proxy dinamico

Quando il proxy dinamico è abilitato, Babel instrada le chiamate idonee attraverso metodi ponte generati. Ogni ponte compare come un frame in più, quindi uno stack trace decodificato alterna i tuoi metodi ai meccanismi interni di Babel. Babel registra nel file map il metodo di cui ogni ponte fa le veci, e il decodificatore lo stampa:

at Acme.Backup.ZipReader.OpenZip(System.String filename) at (System.String ) -> proxy for System.IO.Compression.ZipFile::OpenRead at Acme.Backup.BackupReader.IsBackupFile(System.String path)

L’annotazione -> proxy for <DeclaringType>::<Method> ti dice esattamente quale metodo il ponte stava chiamando. La firma è già mostrata nel frame, quindi non viene ripetuta nell’annotazione. I file map prodotti da versioni precedenti di Babel, che non registrano la destinazione del proxy, vengono decodificati come prima e mostrano invece la nota generica -> babel generated code.

Nascondere i frame generati da Babel

Se ti interessa solo la tua catena di chiamate, Babel può eliminare tutti i frame che ha generato (i ponti del proxy e i frame anonimi di runtime attraverso cui passano le loro chiamate), lasciando uno stack trace identico a quello che otterresti dall’applicazione non offuscata.

Dalla riga di comando, aggiungi la chiave frames=user all’opzione --stacktrace:

babel --stacktrace StackTrace.txt --stacktrace frames=user --mapin MyApp.exe.map.xml

frames=all è il valore predefinito e mantiene tutti i frame. In Babel Desktop il decodificatore stack nasconde questi frame per impostazione predefinita: la casella Nascondi i frame aggiunti da Babel è selezionata. Deselezionala per mantenere tutti i frame.

Con i frame generati nascosti, lo stack trace precedente diventa:

at System.IO.Compression.ZipFile.Open(System.String archiveFileName) at Acme.Backup.ZipReader.OpenZip(System.String filename) at Acme.Backup.BackupReader.IsBackupFile(System.String path)

Automatizzare la decodifica degli stack trace

Babel Obfuscator mette a disposizione un’interfaccia per automatizzare la decodifica degli stack trace. Aggiungi al tuo assembly .NET un riferimento a babel.dll (o a babel.exe per le applicazioni .NET Framework legacy) e usa l’API fornita per decodificare gli stack trace da codice.

Il frammento di codice seguente mostra come configurare un’applicazione console per decodificare uno stack trace caricato da un file esterno:

// Example of setting up the console application static int Main(string[] args) { if (args.Length < 2) { Console.WriteLine("Usage: stackdecode.exe <filename> <xmlmapfile1> [xmlmapfile2 ...]"); return 1; } StackTraceDeobfuscator stk = new StackTraceDeobfuscator(); foreach (var xmlMapFile in args.Skip(1)) { try { stk.AddMapFile(xmlMapFile); } catch (Exception ex) { Console.WriteLine(String.Format("Error reading XML map file '{0}':n{1}", xmlMapFile, ex.Message)); return 1; } } try { StreamReader sr = new StreamReader(args[0]); Console.WriteLine("Deobfuscated Stack Trace:"); Console.WriteLine(stk.DeobfuscateStack(sr)); } catch (Exception ex) { Console.WriteLine(String.Format("Could not decode stack trace file '{0}':n{1}", args[0], ex.Message)); return 1; } return 0; }

Per eliminare i frame generati da Babel (vedi Nascondere i frame generati da Babel) quando decodifichi da codice, imposta HideGeneratedFrames sul decodificatore prima di chiamare DeobfuscateStack:

StackTraceDeobfuscator stk = new StackTraceDeobfuscator(); stk.HideGeneratedFrames = true;

L’interfaccia di programmazione per decodificare gli stack trace è uno strumento efficace per migliorare il debug. Integrando questo meccanismo nelle tue applicazioni puoi automatizzare il processo di decodifica, gestire in modo efficiente gli stack trace offuscati e mantenere l’integrità e la sicurezza del tuo codice.

Usare i file PDB con gli stack trace offuscati

Se vuoi, puoi usare i file PDB in produzione per ottenere il file sorgente e i numeri di riga nello stack trace decodificato. In particolare, Babel può cifrare i nomi dei file e dei simboli all’interno dei PDB, in modo che negli stack trace compaiano cifrati e non rivelino informazioni sensibili sui percorsi dei file.

Per abilitare questa funzionalità, imposta una password per il PDB. Scegli una password sicura: cifra i nomi dei file nel PDB e ti servirà poi per decodificare gli stack trace.

  • Riga di comando: usa l’opzione --pdbpwd, per esempio babel MyApp.exe --debug --pdbpwd <password>.
  • MSBuild: imposta la proprietà PdbPwd del task Babel.
  • Babel Desktop: seleziona l’assembly e imposta PdbPwd nel gruppo Advanced del pannello delle proprietà. La password viene conservata solo per la sessione corrente: non viene salvata nel progetto e va inserita di nuovo dopo il riavvio di Babel Desktop.

Una volta abilitata la funzionalità e impostata la password del PDB, Babel cifra i nomi dei file e le altre informazioni rilevanti durante il processo di offuscamento. Di conseguenza, nei tuoi stack trace i nomi dei file compaiono come stringhe cifrate anziché come percorsi originali.

System.Exception: (0x80131904): A network-related or instance-specific error occurred while establishing a connection to the server. at System.Data.SqlClient.SqlConnection.Open() at b.a(String g) at c.b() in <GFpQHv9iwQzX1Zmh+… >:line 21 at c.a(String h) at Acme.ViewModel.MainViewModel.get_Message() in <GFpQHv9iwQzX1Zmh+… >:line 28

Tutti i dati necessari alla decifratura sono memorizzati nel file map XML, quindi il file PDB non serve per la decodifica. Lo stack trace decodificato contiene il nome del file decifrato.

System.Exception: (0x80131904): A network-related or instance-specific error occurred while establishing a connection to the server. at System.Data.SqlClient.SqlConnection.Open() at Acme.Entities.DatabaseContext.ConnectToDatabase(System.String connectionString) at Acme.ViewModel.RS.CheckResourceLoaded() in C:AcmeAcme.ViewModelRS.cs:line 21 at Acme.ViewModel.RS.GetString(System.String name) at Acme.ViewModel.MainViewModel.get_Message() in C:AcmeAcme.ViewModelViewModelMainViewModel.cs:line 28

Questo metodo offre un equilibrio tra sicurezza e manutenibilità. Protegge la proprietà intellettuale contenuta nella struttura dei tuoi file e ti permette comunque di ricavare dagli stack trace informazioni utili per il debug e l’analisi degli errori.

Configurando la cifratura dei PDB, la struttura interna e l’organizzazione dei file della tua applicazione restano protette e riservate, anche quando condividi i PDB per la risoluzione dei problemi o per l’assistenza.

Last updated on