Se non prendi precauzioni con il tuo codice JavaScript, stai rendendo la vita facile per chiunque voglia clonarlo. Ma se i tuoi processi di programmazione sono più di un clic di distanza, gli attaccanti preferiranno a clonare il software di un concorrente. Bots e altri miscredenti che pettinano Internet per AWS o Azure Le credenziali di solito non si preoccupano di codice offuscato: le informazioni di accesso del sito web successivo possono anche essere utilizzate per il mio bitcoin e possono essere raccolte con meno sforzo.
Obfussare JavaScript usato per essere complesso. Tuttavia, il processo è diventato significativamente più facile durante gli ultimi anni. Oggi, anche le piccole aziende possono e dovrebbero proteggere il loro codice dagli occhi indiscreti. In alcuni casi, essere sicuri è solo un'invocazione di un pacchetto nodo.js.
I seguenti passaggi introducono un Obfuscrator di JavaScript comunemente usato e guarda anche alcuni altri argomenti relativi al problema.
Il nostro Obfuscrator JavaScript vive nell'ambiente runtime del nodo. Iniziamo fuori controllando le versioni utilizzate. L'output di seguito fornisce lo stato della versione trovato sulla tua workstation della tua veranza utilizzata per i seguenti passaggi:
Tamhan @ Tamhan-ThinkPad: ~ $ Node --version
v8.12.0.
Tamhan @ Tamhan-ThinkPad: ~ $ NPM --version
6.4.1
JavaScript-Obfuscator deve essere installato nella cache di assemblaggio globale della tua workstation. Invoca la NPM con il -G. Parametro e non dimenticare di fornire diritti di superuser: il processo di distribuzione effettivo dovrebbe essere fatto in pochi secondi.
Tamhan @ Tamhan-ThinkPad: ~ $ sudo npm install -g
JavaScript-Obfuscator
[Sudo] Password per Tamhan:
. . .
+ [email protected].
Aggiunti 103 pacchetti da 162 contributori
in 4.4s
Test di offuscamento funziona meglio se abbiamo un codice "reale". Quindi iniziamo con una piccola pagina web HTML. Carica un file JavaScript chiamato worker.js, dichiara un pulsante e contiene un piccolo bit di scripting in linea. Quando è caricato in un browser, fai clic sul pulsante per mostrare una casella di testo.
& lt; html & gt;
& lt; corpo e GT;
& lt; script src = "worker.js" & gt; & lt; / script & gt;
& lt; script & gt;
funzionamento lavoratore () {
Alert (dotheetrick ());
}
& lt; / script & gt;
& lt; pulsante tipo = "pulsante" onclick = "lavoratore (
) "& gt; click me! & lt; / button & gt;
& lt; / corpo e GT;
& lt; / html & gt;
Lavoratore.js inizia con una variabile stringa. Sono un target di attacco classico - se una ROM deve essere decodificata, l'assemblatore di solito inizia cercando tabelle contenenti sequenze di stringa. Inoltre, la crittografia viene eseguita utilizzando un insieme di variabili con nomi molto 'parlando'.
VAR MyString = "Ciao dal futuro PLC"
funzione dotheetrick () {
var chiffrat;
Chiffrat = rot13 (mystring);
ritorno chiffrat;
}
Poiché questo non è inteso come una crittografia 101, dovremmo accontentarci di un cifratore di sostituzione relativamente semplice. ROT13 non è difficile, ma può essere programmato abbastanza verboso. Implementazione di Dsores. Viene fornito con una serie di variabili 'parlando' e offre un sacco di cibo per il nostro Obfuscator.
Funzione ROR13 (STR) {
var re = nuovo regexp ("[A-Z]", "I");
var min = 'a'.charcodeat (0);
var max = 'z'.charcodeat (0);
var fattore = 13;
VAR Risultato = "";
str = str.toupracase ();
per (var i = 0; i & lt; strg.Length; I ++) {
risultato + = (re.test (str [i])?
String.Fromocharcode ((Strarcodeat
(i) - Min + Factor)% (max-min + 1)
+ min): str [i]);
}
risultato di ritorno;
}
L'esecuzione di una corsa di offuscamento del codice è semplice. Invocare JavaScript-Obfuscator. e passare in un punto per dire al programma di lavorare su tutti i file trovati nella directory di lavoro corrente. Questo mostra il risultato sulla workstation IBM dell'autore:
Tamhan @ Tamhan-ThinkPad: ~ / FuturebFushate /
Codice $ JavaScript-Obfuscrator.
Firendo i file direttamente nella cartella del contenitore è inefficiente, poiché i nomi devono essere modificati prima che possano essere utilizzati. Un modo migliore comporta l'uso del produzione parametro. Se JavaScript-Obfuscator Lo trova, il programma genera una sottocartella nella directory di lavoro corrente e scarica i risultati delle sue fatiche lì.
Tamhan @ Tamhan-ThinkPad: ~ / FuturebFidato / codice $
JavaScript-Obfuscrator. --Output ./obfusca
Immergiti nella cartella "Obfusca" e apri la nuova versione del lavoratore.js per festeggiare gli occhi sull'abominio che viene mostrato che accompagna questo passaggio. La formattazione del codice è stata mangiata male. I nomi dei metodi, tuttavia, rimasero gli stessi, poiché sono necessari per invocazioni esterne. Inoltre, le stringhe ora si siedono in un array in cui un attaccante può raccoglierli comodamente.
VAR A0_0XB9E2 = ['Ciao \ x20Difrom \ x20Future
\ x20plc ',' [A-Z] ',' Test ',' Charcodeat '];
JavaScript-Obfuscator è dotato di una selezione di algoritmi di stringa, che possono essere configurati utilizzando - - codifica-array-array . Tieni presente che la directory di uscita deve essere svuotata prima di ogni invocazione, poiché dimenticare di farlo porta a "ricorsivo" offuscuazione dei file di output dalla corsa precedente.
Tamhan @ Tamhan-ThinkPad: ~ / futurebFuscate / codice $
JavaScript-Obfuscrator. --Output ./obfusca.
- Base di codifica di array-strisciante64
A questo punto, l'output del nostro Obfuscator sembra diverso: l'array nella parte superiore del file ora è molto meno leggibile. Questo, tuttavia, non risolve tutti i problemi. Se si esegue alcuni cicli di offuscamento, alla fine finirai con il mark-up simile a quello che accompagna questo passaggio:
VAR A0_0X31E5 = ['BGVUZ3RO', 'DGVZDA ==', '
Znjvbunoyxjdb2rl ',' y2hhcknvzgvbda == ','
dg9vchbllcknhc2u = '];
. . .
. . .
var mystring = 'hello \ x20from \ x20future \ x20plc'
Gli obfuscatori lavorano in un campo di pressione tra ad alte prestazioni e protezione del codice. Un modo per affrontare il problema implica "randanising" elementi. Le offuscie costose di runtime non vengono aggiunte a tutti i nodi, ma solo a un sottoinsieme. Rilevamento se i nodi sono interessati o meno vengono eseguiti tramite un generatore di numeri casuali, la cui sensibilità può essere sintonizzata.
Il generatore di numeri casuali sopra menzionato emette numeri che vanno da zero a uno. Se il numero è più grande della soglia, la modifica non avrà luogo. Ambientazione stringarraythreshold. A un valore di uno significa che tutti i numeri sono più piccoli della soglia, assicurando che ciascuna e ogni corda venga mangiata.
Tamhan @ Tamhan-ThinkPad: ~ / futurebFuscate / codice $
JavaScript-Obfuscrator. --Output ./obfusca.
- Base di codifica-array-strisciante64
--StringarrayThreshold 1
Gli strumenti di analisi come il profitto di Jsnice di avere una piccola base di codice. Dato che JavaScript-Obfuscrator rompisce comunque il codice in un AST, nulla parla contro l'inserimento di "cabina di spazzatura" al volo. Poiché questa funzione aggiunge una gonfia significativa, gli sviluppatori devono attivarlo manualmente tramite i due parametri mostrati accanto a questo:
-dead-injection-injection & lt; boolean & gt;
- Wead-code-injection-soglia e lt; numero e GT;
Esecuzione dell'obfusciatore con entrambi --dead-iniezione del codice vero e - Wead-code-injection-soglia 1 Impostare conducono a un filesze di circa 2.5kb. Tentativo di nicizzare il codice conduce a una parete quasi indecisa di JavaScript per lo più tautologica.
La rottura del codice in un AST consente trasformazioni profonde. Impostazione del. ControlFlowFlatting. Attributo a TRUE dice al programma che può de-inline le chiamate di funzione. Ciò porta ad un'espansione significativa del codice generato - tieni presente che i risultati possono richiedere un successo di performance del 150%.
I manufatti dal debug sono il dono più grande del mondo agli hacker. Alcune chiamate a console.log () e dei suoi amici possono dare un attaccante informazioni preziose su ciò che accade all'interno del programma - un buon esempio sarebbe stato mostrato lo snippet:
Dotheetrick Function ()
{
var chiffrat;
console.log ("Prepararsi a crittografare
chiffrat ");
Chiffrat = rot13 (mystring);
console.log ("ritorno chiffrat");
ritorno chiffrat;
}
Possiamo tentare di ri-offuscare il programma con il comando qui sotto. Disabilita la funzione di memorizzazione nella cache stringa e deve disabilitare la registrazione della console tramite il reindirizzamento.
Tamhan @ Tamhan-ThinkPad: ~ / Desktop /
Deadstuff / 2018Nov / FuturebFushate / Code $ $
JavaScript-Obfuscrator. --Output ./obfusca.
--String-array-codifica falsa
--Disableconsoleoutput vero
I venditori di Obfuscator e Browser combattono una lunga e amara battaglia sulla funzione di debugger. A causa di ciò, le "misure aggressive", come il reindirizzamento della console dei programmi di flusso del programma mostrato che accompagnano questo passaggio, di solito non funziona a lungo.
DebugProtection: False,
debugprotectioninterval: False,
L'installazione dell'intero pacchetto Node.js per offuscare uno o due file è inutile. Visitare Obfuscator.io. Per accedere a una versione online del programma che vive nel tuo browser. Controllare e combotti sotto l'ingresso principale consentono di modificare il comportamento del programma come descritto nei passaggi precedenti.
Il team sviluppatore mantiene una documentazione relativamente dettagliata che spiega il modo in cui i vari parametri della riga di comando interagiscono tra loro. Semplicemente visitare Testa qui Se l'output "Short Help" mostrato sopra non ti aiuta a raggiungere il tuo obiettivo.
L'ETH Zurich fornisce un servizio di de-offuscation ospitato a jsnice.org. . Utilizza reti neurali e un database della conoscenza composto da codice esistente per determinare i nomi delle variabili. Durante la stesura della formattazione di solito funziona abbastanza bene, alcuni dei nomi, come pixelsizetargetmax. Nella routine di crittografia che accompagna questo passaggio - può essere piuttosto divertente.
Funzione ROR13 (PL $ 120) {
/ ** @type {! regexp} * /
var insuffeneregexp = nuovo regexp
(A0_0x395D ("0x1"), "I"); var.
pixelsizetargetmax = "A" ["Charcodeat"] (0);
var zerosizemax = "z" ["charcodeat"] (0);
/ ** @type {numero} * /
var minh = 13;
/ ** @type {string} * /
var out = "";
Questo articolo è stato originariamente pubblicato in questione 283 di creative Web Design Magazine Web designer . Comprare il problema 283 qui o Iscriviti al web designer qui .
Articoli Correlati:
Imparare come creare un collage di foto in Photoshop sarà utile in molte situazioni diverse. Le singole foto catturano momenti singoli nel tempo, ma invocano un collage e potrai illustrare u..
(Immagine di credito: SCKONG TIFFANY) La creazione di immagini CSS è un modo divertente per praticare le tue abilit�..
Negli ultimi tre anni, ho usato la grafite come mezzo per l'illustrazione, prima solo con matite meccaniche, poi negli ultimi due..
La griglia CSS è perfetta per la creazione di layout a due assi di righe e colonne. La sintassi è semplice e rende un layout de..
In questo tutorial, ho intenzione di condividere le tecniche e i metodi che uso per creare modelli di superficie dura in ..
Un'immagine vale più di mille parole e un video vale un milione. Il video può trasmettere più informazioni più velocemente della stampa o delle immagini statiche. Può rendere diversament..
Pagina 1 di 2: Piastrelle di progettazione e texture 3D Piastrelle di pro..
Come libero professionista a tempo pieno, sono abituato a lavorare su una gamma di stili e tecniche di disegno . Q..