HObfus vs Hacker

[ Level: 1 ] Next >>

[1] HObfus
document.write(str);
HObfus が write でstrを書き出す。

[2] Hacker
document.write=(str)=>{console.log(str);}
Hacker が、override した write で str を盗む。

[3] HObfus
if(!$_isnative("write",document.write)){return false;}
HObfus は、write が native であるかチェックする。この際、document.write.toString()を使う。

[4] Hacker
document.write.toString=()=>{return "function write() { [native code] }";};
Hacker が、document.write.toString を override して、
document.write が nativeのように見せる。

[5] HObfus
if(document.write.hasOwnProperty('toString')){return false;}
HObfusは、write が 独自の toString をもっているかチェックする。
元々、write は 独自の toString を持っていないので、持っているとすれば
それは、Hacker が設置したものであることがわかる。

[6] Hacker
document.write.__proto__.toString=()=>{return "function write() { [native code] }";};
Hacker は [4] を消して、write.__proto__ に Fake の toString を取り付ける。
write.__proto__ は Function.prototype と同じである。

[7] HObfus
if(!$_isnative("toString",document.write.__proto__.toString)){return false;}
HObfusは、write.__proto__ が native かどうか調べる。


これ以上、Hackerができることはなく、HObfusの勝ちになる。 結論として、HObfusは以下の3つを確認しなければいけない。 1) document.write が native であること。 2) document.write.hasOwnProperty('toString') が false であること。 3) document.write.__proto__.toString が native であること。