Post on 02-Aug-2020
1
静的言語からのJavaScript生成と スクリプト難読化技術
横浜国立大学大学院工学研究院
電気電子ネットワークコース
准教授 倉光君郎
2
JavaScript と HTML5の時代
• HTML4.0 メジャーアップデート • JavaScript 用のAPI が大幅に強化 • デバイスに依存しないアプリケーション開発
3
HTML5 Device Api API 用途 Geolocation 経度,緯度,高度 Battery Status バッテリ状況 Vibration バイブレータ制御 Accelerometer 加速度 Gyroscope 方位 System Information システム情報 Network Information ネットワーク接続情報 Proximity Event 近接イベント Camera 画像, 動画カメラ制御 Calendar スケジュール情報
これ以外にも多くのAPI の標準化が検討されている. (参考) www.w3.org
4
HTML Device Api の例 var battery = navigator.battery; // Battery Status Api battery.addEventListener('dischargingtimechange', function () { if (battery.dischargingTime < 60 * 30 || battery.level < 0.1) { mail.setTimer(mail.INTERVAL_BATTERY_LOW); console.log('30 minutes remaining or level below 10%, checking the server less frequently.'); } else if (battery.dischargingTime < 60 * 10 || battery.level < 0.05) { mail.setTimer(null); console.log('10 minutes remaining or level below 5%, stop checking the server.'); } }, false); battery.addEventListener('chargingchange', function () { if (battery.charging) { mail.setTimer(mail.INTERVAL_DEFAULT); console.log('Battery is charging, checking the server normally.'); } }, false); // http://www.w3.org/TR/battery-status/
5
JavaScript の課題
• 実行性能に難あり 高速なエンジンが開発中 • 静的言語の利点が活かせない
– 機械的な型検査によるミスの確認ができない – 最適化されたコードの生成がしにくい – ソースコードの文書化(メンテナンスしにくい) – リファクタリングなどツール支援が行えない
• ソースコードが常に公開される
• 開発ノウハウ・知的財産の流出
6
JavaScript 開発の”新”潮流
• 別言語からの JavaScript の生成 – CoffeeScript – 静的型付け言語
• Dart (Google) • JSX (DeNA) • Haxe
CoffeScript からの生成
7
Konoha プロジェクト
• 静的スクリプト言語の開発プロジェクト – オープンソースで公開
• http://www.source.sourceforge.jp/ • Linux, MacOS X, Windows, TRON 動作確認
• 実用化に向けて – 2009年. JST/DEOS プロジェクトのデモシステム開発(5000行以上の
スクリプト)
7
8
実行性能
• スクリプト言語は、C/C++ に比べると、x10〜x100ほど遅い (最近のCPUは十分に速い)
• 最新のJIT技法を用いれば十分に高速化できる
図 C++ の性能を1 としたときの各処理系の性能比較
9
高信頼スクリプト技術
• 戦略的創造研究推進事業 CREST 研究領域「実用化を目指した組込みシステム用ディペンダブル・オペレーティングシステム 」の成果
9
10
Konoha からのJavaScript 変換
• Konoha から JavaScript へのソースコード変換し、ブラウザ上で実装する
11
ソースコード変換器 K2JS
ソースコード変換器
Konoha コンパイラによる処理
構文解析器 入力
ソースコード
抽象構文木 コード生成器 バーチャルマシン
ソースコード変換器 フロントエンド
中間表現 ソースコード変換器 バックエンド
JavaScript ソースコード
Webブラウザ
SSA変換
JIT Frontend JVM Frontend
12
K2JS の特徴: 難読化
• コンパイラ最適化手法を併用し、コード生成 • オリジナルのデータ構造が残らない
int fib(int n) { int i; if (n < 3) i = 1; else i = fib(n-1) + fib(n-2); return i; }
function fib(n1) { var retval1; if (n1 < 3) { var retval2 = 1; retval1 = retval2; } else { var tmp1 = n1 - 1; var tmp2 = fib(tmp1); var tmp3 = n1 - 2; var tmp4 = fib(tmp3); var retval3 = tmp2 + tmp4; retval1 = retval3; } return retval1; } console.log(fib(10));
13
難読化手法
1. ソースコード中の変数のSSA形式への変換 - ソースコード中の変数の数の増加
2. シンボル名の置き換え
- シンボル名による動作推定の難化
3. 制御構造の再構成 - ソースコードの非構造
14
• ソースコード中の変数への代入がただ一度行われる
a = 1; if (a < 0) { a = -a; } else { a = a + 1; }
a1 = 1; if (a1 < 0) { a2 = -a1; } else { a3 = a1 + 1;} a4 = φ(a2, then, a3, else) ;
・非SSA形式 ・SSA形式
静的単一代入(SSA)形式
if文の合流地点では、then節とelse節のどちらの代入を行うか一意に決定出来ない。このため新たな変数a4をφ関数を用いて定義している
15
制御構造の再構成
• JavaScriptにはgoto文は存在しないため、switch文とwhile文を用いて、goto文を表現する
• ラベル変数labelを用いて、
次に処理を行うブロックを指定する
var label = 1; while (true) switch(label) { case 1: if (cond) label = 2; else label = 3; break; case 2: label = 4; break; case 3: …
(Label 1)
(Label 2)
16
Fibonacci関数の難読化
• K2JSによる難読化前後のソースコード
int fib(int n) { if (n < 3) return 1; else return fib(n-1)+ fib(n-2); }
function a($a) { var label = 0; while (true) { switch (label) { case 0: var $b = 3; var $c = $a < $b; if ($c) { label = 1; } else { label = 2; } break; case 1: var $d = 1; return $d; case 2: var $e = 1; var $f = $a - $e; var $g = a($f); var $h = 2; var $i = $a - $h; var $j = a($i); var $k = $g + $j; return $k; }}}
Konoha JavaScript
難読化前 難読化後 行数 4行 28行
使用変数 1個 11個
17
難読化の評価 • アルゴリズム推定
– 複数の難読化されたソースコードを提示し、アルゴリズム推定 – あらかじめ、アルゴリズムの候補は与える
アルゴリズム名 正答数 正答率
バブルソート 3 30%
ヒープソート 4 40%
マージソート 6 60%
クイックソート 3 30%
選択ソート 3 30% 19 38%
18
実行速度の計測
• ハンドライティングの記述との実行速度の比較(単位: ms)
• 行数の比較
• 総評 – 最新のブラウザの最適化技術と相性が悪い – まだまだ改善の余地がある
Fibonacci Binary-trees aobench
K2JS 434 7674 17905
ハンドライティング 281 1245 2050
Fibonacci Binary-trees aobench
K2JS 43 279 1390
ハンドライティング 6 46 275
19
まとめ
• JavaScript は、組み込みからサーバシステムまで、アプリケーション開発の中心となる
• 静的言語 Konoha からJavaScript を生成する手法 – オープンソース公開を行う予定
• JavaScript 難読化技術 • コンパイラ最適化手法の応用 • 開発ノウハウや知財の保護に有効
20
お問い合わせ先
横浜国立大学
知的財産マネージャー 石井 直樹
TEL 045-339 - 4453
FAX 045-339 - 4457
e-mail ishii.naoki@ynu.ac.jp