Hackerは document.write をoverrideして、HTMLコードを抜き出そうとする。document.write=(str)=>{ console.log(str); };overrideの方法は、"regular", "method", "bound", "arrow" の4つがある。 このoverrideを見抜くために、HObfusは、document.write.toString() で document.write のコードを取得する。 もし document.write が override されていれは、以下の native code の フォーマットにはならないので、override を検出できる。function write() { [native code] }しかしHackerは、document.write.toString を overwirte して、 検出を免れようとする。document.write.toString=()=>{ return `function write() { [native code] }`; };この override を検出するために、HObfus は document.write.toString.toString() を実行して、document.write.toString が native code であることを調べる。 しかしHackerは、document.write.toString.toString を overwirte して、 検出を免れようとする。document.write.toString.toString=()=>{ return `function toString() { [native code] }`; };これで、document.write.toString と document.write.toString.toString は、 別々の Function を assignされたので、2つは不等号になる。document.write.toString !== document.write.toString.toStringしかし、もし override されていなければ、以下のように等号が成り立つのである。document.write.toString === document.write.toString.toString従って、等号が成り立たなければ、override されているとわかるのである。 しかし、Hackerは、この override の検出を免れるために、 document.write.toString と document.write.toString.toString を 一つの関数で override しようとするかもしれない。let name="write"; const func=()=>{ const ret="function "+name+"() { [native code] }"; name="toString"; return ret; }; document.write.toString=func; document.write.toString.toString=func;上記のコードでは、document.write.toString() が最初に呼ばれて、次に document.write.toString.toString() が実行されるという前提である。 この前提が狂えば、override は検出されてしまう。 Hackerに override を成功させないためには、document.write.toString() と document.write.toString.toString() の実行を複雑にすればよい。 例えば、HObfusに、document.write.toString.toString() をダミーとして3回実行させる。 4回目で、document.write.toString を実行 5回目で、document.write.toString.toString を実行した場合、 Hackerは、4回目で"function write() { [native code] }"; 5回目で"function toString() { [native code] }"; を返さなければいけない。これを失敗すれば override は行われない。 もちろん、HObfus側では、これをさらに複雑することができる。