2013-09-27 24 views
12

Ho bisogno di confondere il mio codice sorgente nel miglior modo possibile, così ho deciso di usare uglifyjs2 .. Ora ho la struttura del progetto che ha annidate le directory, come posso eseguirlo attraverso uglifyjs2 per fare l'intero progetto invece di dargli tutto il file di input?Utilizzo di UglifyJs sull'intero progetto Node?

non mi dispiacerebbe se ridotte di tutto il progetto in un singolo file o qualcosa

+1

perché non scrivere uno script di shell per scorrere tutti i file e contattare l'obfuscater per ciascuno? – WiredPrairie

+0

@WiredPrairie Volevo combinarli tutti in un singolo file. Inoltre, offuscando in modo diverso i riferimenti di ciascun file, penso che dal momento che il nome dei file cambi –

+0

Come farai a far funzionare correttamente il nodo se tu hai messo insieme tutti i file? ('require ('../ mylib/lib1')') – WiredPrairie

risposta

5

che ho fatto qualcosa di molto simile a questo in un progetto ho lavorato su. Sono disponibili due opzioni:

  1. lasciare i file nella loro struttura di directory.

    Questa è di gran lunga l'opzione più semplice, ma fornisce un livello molto inferiore di offuscamento in quanto qualcuno interessato abbastanza nel codice ha fondamentalmente una copia dell'organizzazione logica dei file.

    Un utente malintenzionato può semplicemente stampare tutti i file e rinominare i nomi delle variabili offuscati in ogni file finché non hanno una comprensione di ciò che sta accadendo.

    Per fare ciò, utilizzare fs.readdir e fs.stat per scorrere in modo ricorsivo le cartelle, leggere ogni file .js e generare il codice mangled.

  2. Compilare tutto in un singolo file JS.

    Questo è molto più difficile da implementare, ma rende la vita più difficile a un utente malintenzionato poiché non ha più il vantaggio dell'organizzazione del progetto.

    Il tuo problema principale è riconciliare le tue chiamate require con file che non esistono più (poiché tutto ora si trova nello stesso file).

    L'ho fatto utilizzando Uglify per eseguire l'analisi statica del mio codice sorgente analizzando lo AST per le chiamate a require. Ho quindi caricato il codice sorgente del file richiesto e ripetuto.

    Una volta che tutto il codice è stato caricato, ho sostituito il require chiamate con chiamate a una funzione personalizzata, avvolto codice sorgente di ogni file in una funzione che emula how node's module system works, e poi straziati tutto e compilato in un singolo file.

    La mia funzione di richiesta personalizzata fa la maggior parte di ciò che richiede il nodo eccetto che, piuttosto che cercare nel disco un modulo, cerca le funzioni del wrapper.

Purtroppo, non posso davvero condividere qualsiasi codice per 2 # dato che era parte di un progetto di proprietà, ma il succo è:

  • analizzare il testo di partenza in un AST utilizzando UglifyJS.parse.
  • Utilizzare il TreeWalker per visitare ogni nodo della AST e verificare se

    node instanceof UglifyJS.AST_Call && node.start.value == 'require' 
    
5

Come ho appena completato un grande progetto puro Nodejs a 80 + i file ho avuto lo stesso problema di OP.Avevo bisogno di almeno una protezione minima per il mio duro lavoro, ma sembra che questa necessità fondamentale non sia stata coperta dalla comunità del sistema operativo NPMjs. Aggiungi sale al pregiudizio il sistema di crittografia del pacchetto JXCore è stato rotto la scorsa settimana in poche ore quindi di nuovo all'offuscamento ...

Così ho creato la soluzione completa, che gestisce la fusione dei file, uglifying. Hai la possibilità di escludere i file/le cartelle specificati dall'unione. Questi file vengono quindi copiati nella nuova posizione di output del file unito e i riferimenti ad essi vengono riscritti automaticamente.

NPMjs link of node-uglifier

Github repo of of node-uglifier

PS: Sarei felice se la gente avrebbe contribuire a renderlo ancora migliore. Questa è una guerra tra ladri e programmatori che lavorano duramente come te. Uniamo le nostre forze, aumentiamo il dolore del reverse engineering!

1

Ho avuto la stessa esigenza - per la quale ho creato node-optimize e grunt-node-optimize.

https://www.npmjs.com/package/grunt-node-optimize

+0

qualcuno sa se c'è qualche buona lib di gulp per questo problema? – puppeteer701

+0

Non lavoro con Gulp, è meno intuitivo per me. Ma dovresti essere in grado di racchiudere 'node-optimize' in una libreria gulp. Se lo fai - aggiungerò una nota al riguardo nel readme di 'node-optimize'. –