2013-09-27 16 views
12

我需要儘可能最好地模糊我的源代碼,所以我決定使用uglifyjs2 ..現在我有了嵌套目錄的項目結構,我如何通過uglifyjs2運行它來完成整個項目,而不是將它全部輸入文件?在整個Node項目中使用UglifyJs?

如果精縮整個項目到單個文件或東西

+1

爲什麼不通過的所有文件寫一個shell腳本中循環,並打電話給你obfuscater每個? – WiredPrairie

+0

@WiredPrairie我想把它們全部合併成一個文件。另外,混淆不同會破壞每個文件之間的引用,因爲文件名稱會發生​​變化 –

+0

如果你想讓節點正常工作,你會怎麼做?把所有的文件放在一起了嗎? ('require('../ mylib/lib1')') – WiredPrairie

回答

5

我已經做了非常相似,這一個項目,我工作的東西,我不會介意。你有兩個選擇:

  1. 留在自己的目錄結構中的文件。

    這是迄今爲止最容易的選擇,但提供了一個低得多的混淆程度,因爲對代碼感興趣的人基本上擁有文件的邏輯組織的副本。

    攻擊者可以簡單地漂亮地打印所有文件,並在每個文件中重命名混淆變量名稱,直到他們理解正在發生的事情。

    爲此,請使用fs.readdirfs.stat以遞歸方式遍歷文件夾,讀入每個.js文件並輸出損壞的代碼。

  2. 將所有東西編譯成一個JS文件。

    這對您來說實施起來要困難得多,但卻讓攻擊者的生活變得更難,因爲他們不再有項目組織的好處。

    您的主要問題是調用您的require調用與不再存在的文件(因爲所有文件現在都在同一個文件中)。

    我通過使用Uglify對require進行分析AST來執行靜態分析我的源代碼。然後我加載了所需文件的源代碼並重復。

    一旦所有的代碼加載,我更換了require調用與調用自定義函數,以模仿how node's module system works功能包的每個文件的源代碼,然後錯位一切,它編譯成一個單一的文件。

    我的自定義需求函數完成大部分節點的需求,除了不是在磁盤上搜索模塊,它搜索包裝函數。

不幸的是,我真的不能共享任何代碼#2,因爲它是一個專用的項目的一部分,但要點是:

  • 分析源文本使用UglifyJS.parse的AST。
  • 使用TreeWalker參觀AST的每個節點,並檢查是否

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

正如我剛剛完成了一個巨大的純項目的NodeJS在80+的文件我有同樣的問題,因爲OP。我的努力工作至少需要一點保護,但NPMjs操作系統社區似乎還沒有涉及這個非常基本的需求。添加鹽傷JXCore包加密系統上週在幾個小時內破解,所以回混淆...

所以我創建了完整的解決方案,處理文件合併,uglifying。您可以選擇忽略指定的文件/文件夾以及合併。然後將這些文件複製到合併文件的新輸出位置,並將其引用重寫爲自動。

NPMjs link of node-uglifier

Github repo of of node-uglifier

PS:我會很高興,如果人們將有助於使其更好。這是一場小偷和像自己一樣努力工作的編程人員之間的戰爭。讓我們加入我們的力量,增加逆向工程的痛苦吧!

1

我有同樣的需要 - 爲此我創建了node-optimizegrunt-node-optimize

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

+0

任何人都知道這個問題是否有很好的解決方案? – puppeteer701

+0

我不喜歡Gulp,它對我來說不那麼直觀。但是你應該能夠在一個gulp庫中包裝'node-optimize'。如果你這樣做 - 我會在'node-optimize'的自述文件中添加關於它的註釋。 –