新訳:ADB Helperをハックしてみた(adb-socket.js)

この記事は『Firefox OS / B2G OS Advent Calendar 2016』 16日目の記事です。
Firefox OS で、使用されている「ADB Helper」を再度まとめ直してみました。

目次

 

前回、新訳:ADB Helperをハックしてみた(adb-running-checker.js)に引き続き、
adb-helperをハックしていきたいと思います

  1. フォルダ内のファイル構成
  2. adb-socket.js
  3. 予備知識
  4. モジュール構成
  5. 今回のまとめ
  6. 関連記事
  7. 今年のAdvent Calendar
フォルダ内のファイル構成

 

[ 解凍フォルダ内のjsファイル群 ]
windows
mac
linux

install.rdf

main.js

adb.js

adb-client.js

adb-running-checker.js

adb-socket.js

bootstrap.js

scanner.js

device.js
※1
※1
※1

devtools-import.js
※1
※1
※1

devtools-require.js
※1
※1
※1

fastboot.js
※1
※1
※1

subprocess.js
※2
※2
※2

subprocess_worker_win.js
※3
※3
※3

subprocess_worker_unix.js
※4
※4
※4

 
※1 : version 0.7.1 時点では無かったファイル
※2 : version 0.7.1 時点で有ったファイル
※3 : version 0.7.1 時点で有ったファイル、Windows用ファイル
※4 : version 0.7.1 時点で有ったファイル、mac,linux用ファイル

OS毎に使用されるファイルが有る事が確認できます。

adb-socket.js

 
前回に引き続き、bootstrap.js ファイルをハックしていきたいと思います。
 
ご覧の通り、各OSでの差異はありません。

2014.11.06 時点から、かなりバージョンアップしているのが分かります。

モジュールは下図の通りです

予備知識

 
サンドボックス (セキュリティ)
http://is.gd/P7iDNm

JavaScript コードモジュールの利用(jsm)

JavaScript コードモジュールは、Gecko 1.9 で導入されたコンセプトであり、
特権を持った異なるスコープ間でコードを共有するために用いられます。

また、モジュールは、グローバルな JavaScript のシングルトンオブジェクトを
生成するために用いることもできます(以前は JavaScript XPCOM オブジェクトを使う必要がありました)。

JavaScript コードモジュールは、登録されたパスに配置された純粋な JavaScript のコードです。
Components.utils.import() を使って、 XUL スクリプトや JavaScript XPCOM スクリプトのような
特定のJavaScript のスコープへモジュールを読み込むことができます。
https://developer.mozilla.org/ja/docs/Mozilla/JavaScript_code_modules/Using

モジュール構成

 
上記予備知識をもとにハックしていきます!

ファイル位置
処理概要

1 ~ 13 行目
  • コメント
    ADB が実行中の場合、使用しているホストバージョン検出するサービス
    オリジナルの ADB の adb-file-transfer をモディファイ
  • Cu, Cc, Ci にchrome ライブラリ読み込み
  • Class にcore/heritage ライブラリ読み込み
  • Cu にServices.jsm をインポート

14 ~ 29 行目
createTCPSocket() 関数
  • TCPSocket にServices.jsm をインポート
  • TCPSocket = true 時に引数:location, port, options を用いて、TCPSocket を返します。
  • 変数:scope に nsIPushService の getSystemPrincipal() を用いて、代入します。
  • scope.DOMError にServices.jsm を用いて、格納します。

31 行目以降
AdbSocket オブジェクト
  • コメント
    adb インスタンスへ接続するソケットを生成します。
    このインスタンスは同期し、接続成功時に通知を返します。
    Callers は、S フィールドに attach させなければならない。
  • initialize() 関数
  • _hexdump() 関数
  • send() 関数
  • close() 関数

 
AdbSocket オブジェクト をハックしていきます。

関数名
処理概要

initialize() 関数
  • アドレス:”127.0.0.1″, ポート;5037 を用いて
    関数:createTCPSocket を実行します。

_hexdump() 関数
  • コメント
    受信したバイトデータをコンソールへダンプします。
  • 文字コード:windows-1252 で、TextDecoder 型で定義します。
  • 配列変数:array を Uint8Array 型で定義します。
  • 配列変数:array をデコードします。
  • 配列数分格納します。
  • コンソール出力します。

send() 関数
  • _hexdump() 関数を呼び出します。
  • データ送信します。

close() 関数
  • ソケット状態が “open” 又は “connecting” の場合、
    close() 関数を呼び出します。

今回のまとめ

 
今回のモジュールは、 adb のソケットの挙動をハックしました。

次回は、bootstrap.js をハックする予定です。

関連記事

今年のAdvent Calendar

去年のAdvent Calendar

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です