2023年10月19日木曜日

OSS万歳\(^o^)/

事の発端はこれ.学生たちがTwineというツールを使い,とあるシミュレータを作ろうとしているのだが,操作ログを記録してユーザの挙動を分析したい,なんてことを言っていた.TwineではHarloweという簡易なスクリプト言語というかマクロ?を利用でき,それを使えばできそうだなとやってみた.

(history:)というコマンドがあって,最後のページでそれを評価すればユーザの操作履歴は追える.しかし,残念ながらタイムスタンプまでは記録されない.したがってタイムスタンプ付きで記録を取るには,自前のスクリプトを書く必要がありそうだ.少し考えた末,(current-time:) というコマンドを使って,変数に逐一記録していけばできそうだと試してみた結果が次の画面である.

できるにはできたが……惜しい.なんということか,(current-time:)の粒度が粗すぎる.さて,ではこの(current-time:)をなんとかしようか,と手を出してしまったのが,今回報告する顛末の発端である.

Twineを調査

まずは,Twineのソースコードを調査する.GitHubから同プロジェクトのソースコードをダウンロードしてきて,"current-time"をキーワードにgrepしてみるも,それらしいコードが見当たらない.

そもそもHarloweのスクリプトをレンダリングしているのはどこのタイミングなんだろう?これがよくわからない.Google ChromeでF12キーを押してWeb開発ツールでデバッグしてみようにも,どうにもよくわからなくてお手上げである.

そこでHarlowe関連のドキュメントを探ってみた.ん?Harloweって,Twine関係ないんじゃないの?と気付いたのが迷路から脱出できた鍵となった.決定打は「Where can I find the "Twine engine code"? #649」というGitHubのイシュー.「Twine engine code」がキーである.

なんということはない,Harloweスクリプトは,Twineが出力するHTMLに埋め込まれた難読化されたTwine engine codeのJavaScriptが解析し,その動作を決定していたというわけだ.そこで,次はHarloweのソースコードにあたる.こちらをダウンロードして,解読した.

Harloweエンジンの調査

ここから先は一本道だった.Harloweのソースコードを入手,展開し,再び"current-time"をキーワードにしてgrepする.

BINGO!当該コマンドを処理するソースコードに辿り着いた.案の定,new Date() して日付オブジェクトを取得したあと,時間と分を得て,文字列を生成している.ここに秒を取得するコードを追加すればよいだけである.

以上の追跡結果から,Twineの出力に埋め込まれた難読化JavaScriptの該当部分にパッチを当てれば望んだ出力が得られるということがわかった.

これで問題は解決したのだが,ここまで3時間.やはり,他人様の書いたコードを解読するのは難儀な仕事よのうと思ったとか思わなかったとか.

0 件のコメント:

コメントを投稿