======================================================================= JavaScript Obfuscation Procedures ======================================================================= ======================================================================= ソースコードの部分挿入&削除(partsEdit) ----------------------------------------------------------------------- FTVコードの削除 "use strict"の削除 "js-log-stats"の削除 ======================================================================= ======================================================================= ストリング及びコメントの抽出 ----------------------------------------------------------------------- "..." '...' `...` //... /*...*/ ======================================================================= ======================================================================= ワードの分類方法 (Reserved Word, Replaceable Word, Mappable Word) ----------------------------------------------------------------------- ワードの分類方法を考えてみる。以下のコードを例として使う。 ----------------------------------------------------------------------- for(i=0;i(property) のマッピングを行い、.(propety) を ["(key)"] の形に置換することができる。 ------------------------ ======================================================================= ======================================================================= Reserved Word, Replaceable Word, Mappable Word の判定方法 ----------------------------------------------------------------------- Wordが単独で現れた場合、それが Reserved Word かチェックする。 ( for, while, if, catch, function ... ) Reserved Word でなければ、Replaceable Word である。 (先頭).(propety) のように、ワードがドットでつながれて現れた場合、 (先頭)が Replaceable Word で、(propety) が Mappable Word と判定できる。 ----------------------------------------------------------------------- しかし上記のルールに例外を作ることができる。 【例外1】$_ をワードの前に付けた場合、位置に関わらず、常に Replaceable Word になる。 以下の例では、$_foo1 及び $_foo2 は Replaceable Word になる。 ------------- $_foo1 pax.$_foo2 ------------- 【例外2】_$ をワードの後ろに付けた場合、位置に関わらず、常に 常に Mappable Word になる。 以下の例では、foo1_$ 及び foo2_$ は Mappable Word になる。 ------------- foo1_$ foo2_$.property ------------- Reserved Word の判定だが、CJsObfus の中に、JavaScript の Reserved Words のリストを持っている。さらに、addReservedWord() で追加することができる。 ======================================================================= ======================================================================= プレースホルダー ----------------------------------------------------------------------- プレースホルダーのフォーマットは以下のようなになる。 \x01(INDEX)\x01 (INDEX)は0から始まり、新しいプレースホルダーを作るごとに+1していく。 両脇が\x01で固められているのは、minimizeする時に役に立つからである。 すべてのワードは、プレースホルダーで置換される。'function'や'new'などの Reserved Wordsも、プレースホルダーに置換される。最終的に ソースコードは、プレースホルダーと ; + = / のような記号だけになる。 ======================================================================= ======================================================================= 最小化 (minimize) ----------------------------------------------------------------------- ソースコードを最小化するためには。。。 [(1) コメントの削除] [(2) ホワイトスペースの標準化] 次に、ホワイトスペースの標準化(normalization)を行う。 2.1) \n, \r, \t のような、non-space を、通常のスペース(" ")に置換する。 2.2) 複数の連なったスペースを、通常の一つのスペース(" ")は置換する。 [(3) プレースホルダー間のスペースの一時退避] プレースホルダー間のスペースを\x02に置換する。 例えば、"\x01(INDEX)\x01 \x01(INDEX+1)\x01"の場合、 "\x01(INDEX)\x01\x02\x01(INDEX+1)\x01"になる。 [(4) スペースの削除] 全スペースをソースコードから削除する。 [(5) プレースホルダー間のスペースの復元] プレースホルダー間の\x02をスペースに戻す。 =======================================================================