ソースコードを可能な限り難読化する必要があるため、uglifyjs2 を使用することにしました。これで、ネストされたディレクトリを持つプロジェクト構造ができました。すべての入力ファイルを渡す代わりに、uglifyjs2 を介してプロジェクト全体を実行するにはどうすればよいですか? ?
プロジェクト全体を単一のファイルなどに縮小してもかまいません
ソースコードを可能な限り難読化する必要があるため、uglifyjs2 を使用することにしました。これで、ネストされたディレクトリを持つプロジェクト構造ができました。すべての入力ファイルを渡す代わりに、uglifyjs2 を介してプロジェクト全体を実行するにはどうすればよいですか? ?
プロジェクト全体を単一のファイルなどに縮小してもかまいません
私が取り組んだプロジェクトで、これと非常によく似たことを行いました。次の 2 つのオプションがあります。
ファイルをディレクトリ構造のままにします。
これははるかに簡単なオプションですが、コードに十分な関心を持っている人は基本的にファイルの論理編成のコピーを持っているため、難読化のレベルははるかに低くなります。
攻撃者は、何が起こっているのかを理解するまで、すべてのファイルをきれいに印刷し、各ファイルの難読化された変数名を変更するだけです。
これを行うには、 and を使用fs.readdir
しfs.stat
てフォルダーを再帰的に調べ、すべての .js ファイルを読み取り、壊れたコードを出力します。
すべてを単一の JS ファイルにコンパイルします。
これを実装するのははるかに困難ですが、攻撃者はプロジェクトの組織の利益を得ることができなくなるため、攻撃者の生活はより困難になります。
あなたの主な問題はrequire
、もはや存在しないファイルとの呼び出しを調整することです (すべてが同じファイルにあるため)。
これを行うには、Uglify を使用してASTの呼び出しを分析し、ソース コードの静的分析を実行しましたrequire
。次に、必要なファイルのソース コードをロードして繰り返しました。
require
すべてのコードがロードされたら、呼び出しをカスタム関数の呼び出しに置き換え、各ファイルのソース コードを、ノードのモジュール システムがどのように機能するかをエミュレートする関数でラップし、すべてをマングルして 1 つのファイルにコンパイルしました。
私のカスタムrequire関数は、ノードのrequireが行うことのほとんどを実行しますが、モジュールをディスクで検索するのではなく、ラッパー関数を検索します。
残念ながら、#2 はプロプライエタリ プロジェクトの一部だったので、コードを共有することはできませんが、要点は次のとおりです。
UglifyJS.parse
。を使用しTreeWalker
て AST のすべてのノードにアクセスし、
node instanceof UglifyJS.AST_Call && node.start.value == 'require'