静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript...

20
1 静的言語からのJavaScript生成と スクリプト難読化技術 横浜国立大学大学院工学研究院 電気電子ネットワークコース 准教授 倉光君郎

Transcript of 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript...

Page 1: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

1

静的言語からのJavaScript生成と スクリプト難読化技術

横浜国立大学大学院工学研究院

電気電子ネットワークコース

准教授 倉光君郎

Page 2: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

2

JavaScript と HTML5の時代

• HTML4.0 メジャーアップデート • JavaScript 用のAPI が大幅に強化 • デバイスに依存しないアプリケーション開発

Page 3: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

3

HTML5 Device Api API 用途 Geolocation 経度,緯度,高度 Battery Status バッテリ状況 Vibration バイブレータ制御 Accelerometer 加速度 Gyroscope 方位 System Information システム情報 Network Information ネットワーク接続情報 Proximity Event 近接イベント Camera 画像, 動画カメラ制御 Calendar スケジュール情報

これ以外にも多くのAPI の標準化が検討されている. (参考) www.w3.org

Page 4: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

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/

Page 5: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

5

JavaScript の課題

• 実行性能に難あり 高速なエンジンが開発中 • 静的言語の利点が活かせない

– 機械的な型検査によるミスの確認ができない – 最適化されたコードの生成がしにくい – ソースコードの文書化(メンテナンスしにくい) – リファクタリングなどツール支援が行えない

• ソースコードが常に公開される

• 開発ノウハウ・知的財産の流出

Page 6: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

6

JavaScript 開発の”新”潮流

• 別言語からの JavaScript の生成 – CoffeeScript – 静的型付け言語

• Dart (Google) • JSX (DeNA) • Haxe

CoffeScript からの生成

Page 7: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

7

Konoha プロジェクト

• 静的スクリプト言語の開発プロジェクト – オープンソースで公開

• http://www.source.sourceforge.jp/ • Linux, MacOS X, Windows, TRON 動作確認

• 実用化に向けて – 2009年. JST/DEOS プロジェクトのデモシステム開発(5000行以上の

スクリプト)

7

Page 8: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

8

実行性能

• スクリプト言語は、C/C++ に比べると、x10〜x100ほど遅い (最近のCPUは十分に速い)

• 最新のJIT技法を用いれば十分に高速化できる

図 C++ の性能を1 としたときの各処理系の性能比較

Page 9: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

9

高信頼スクリプト技術

• 戦略的創造研究推進事業 CREST 研究領域「実用化を目指した組込みシステム用ディペンダブル・オペレーティングシステム 」の成果

9

Page 10: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

10

Konoha からのJavaScript 変換

• Konoha から JavaScript へのソースコード変換し、ブラウザ上で実装する

Page 11: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

11

ソースコード変換器 K2JS

ソースコード変換器

Konoha コンパイラによる処理

構文解析器 入力

ソースコード

抽象構文木 コード生成器 バーチャルマシン

ソースコード変換器 フロントエンド

中間表現 ソースコード変換器 バックエンド

JavaScript ソースコード

Webブラウザ

SSA変換

JIT Frontend JVM Frontend

Page 12: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

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));

Page 13: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

13

難読化手法

1. ソースコード中の変数のSSA形式への変換 - ソースコード中の変数の数の増加

2. シンボル名の置き換え

- シンボル名による動作推定の難化

3. 制御構造の再構成 - ソースコードの非構造

Page 14: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

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をφ関数を用いて定義している

Page 15: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

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)

Page 16: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

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個

Page 17: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

17

難読化の評価 • アルゴリズム推定

– 複数の難読化されたソースコードを提示し、アルゴリズム推定 – あらかじめ、アルゴリズムの候補は与える

アルゴリズム名 正答数 正答率

バブルソート 3 30%

ヒープソート 4 40%

マージソート 6 60%

クイックソート 3 30%

選択ソート 3 30% 19 38%

Page 18: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

18

実行速度の計測

• ハンドライティングの記述との実行速度の比較(単位: ms)

• 行数の比較

• 総評 – 最新のブラウザの最適化技術と相性が悪い – まだまだ改善の余地がある

Fibonacci Binary-trees aobench

K2JS 434 7674 17905

ハンドライティング 281 1245 2050

Fibonacci Binary-trees aobench

K2JS 43 279 1390

ハンドライティング 6 46 275

Page 19: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

19

まとめ

• JavaScript は、組み込みからサーバシステムまで、アプリケーション開発の中心となる

• 静的言語 Konoha からJavaScript を生成する手法 – オープンソース公開を行う予定

• JavaScript 難読化技術 • コンパイラ最適化手法の応用 • 開発ノウハウや知財の保護に有効

Page 20: 静的言語からのJavaScript生成と スクリプト難読化技術 · • JavaScript は、組み込みからサーバシステム まで、アプリケーション開発の中心となる

20

お問い合わせ先

横浜国立大学

知的財産マネージャー 石井 直樹

TEL 045-339 - 4453

FAX 045-339 - 4457

e-mail ishii.naoki@ynu.ac.jp