萌えハッカーニュースリーダー

2025/07/02 17:22 Making a speedrun timer in D

出典: https://bradley.chatha.dev/blog/linux-speedrun-timer-dlang/post/
hakase
博士

ロボ子、今回のDeus Exのスピードランの話は面白いのじゃ!Linuxで自動分割タイマーを作るなんて、ワクワクするぞ!

roboko
ロボ子

博士、私も興味津々です!Windows版ではLiveSplitが使えるのに、Linuxだとプラグインが動かないのは不便ですよね。

hakase
博士

そうじゃ!だから、D言語でタイマーを作って、高精度な計測、自動分割、ロード時間削除を実現するのじゃ!

roboko
ロボ子

記事によると、まずロードフラグを探したんですね。Deus Exのスクリプトがプレーンテキストで抽出できるとは知りませんでした。

hakase
博士

そう!そして、ロード画面中にグローバル変数を設定するコードを見つけたのじゃ。でも、scanmemでは特定のアドレスを特定できなかったみたいじゃな。

roboko
ロボ子

そこでシステムコールですか。ptraceとprocess_vm_readvを使って、別のプロセスのメモリを読み書きするんですね。

hakase
博士

その通り!D言語にバインディングがないから、Cとの互換性を使うのは賢いのじゃ!

roboko
ロボ子

LoadMap関数の特定も興味深いです。WindowsバイナリのPE形式から、llvm-readobjでエクスポートテーブルをダンプして関数を見つけるんですね。

hakase
博士

そう!そして、LoadMapのアドレスにブレークポイントを設定して確認するのじゃ。地道な作業じゃが、重要なステップなのじゃ。

roboko
ロボ子

未使用メモリの発見もすごいですね。/proc/<PID>/mapsからメモリマップを調査して、書き込み可能で未使用の領域を探すなんて。

hakase
博士

じゃろじゃろ?Engine.dllの書き込み可能なマッピングを見つけた時は、私も興奮したぞ!

roboko
ロボ子

フレームワークもよく考えられていますね。RunningProcess、GameProcess、Patcher、UIと、必要な機能が揃っています。

hakase
博士

MVP(最小実行可能プログラム)では、LoadMap関数にパッチを適用してロードフラグを設定するのじゃ。LoadMapのジャンプテーブルエントリを修正して、新しいコードを指すように変更するなんて、ハッキングみたいで面白いぞ!

roboko
ロボ子

ロードフラグの解除も重要ですね。LoadMap関数の最後にフラグを解除するコードを挿入するんですね。例外処理の分岐があるから、コードを移動してスペースを確保するとは。

hakase
博士

最終ロードマップでは、自動分割のためにロードされたマップ名を特定する必要があるのじゃ。LoadMap関数の戻り値からマップ名を取得するなんて、エレガントじゃな。

roboko
ロボ子

問題点として、例外処理がパッチされていないことと、セーブ画面が処理されていないことが挙げられていますね。グリッチセーブを使うと例外が発生するのは盲点でした。

hakase
博士

改善点としては、ロード遷移の検出メカニズムの改善があるのじゃな。ポーリング方式はゲームにもたつきを引き起こすから、Linuxシグナルを使うのは良いアイデアじゃ。

roboko
ロボ子

本当に勉強になりました!Deus Exのスピードランの世界も奥が深いですね。

hakase
博士

そうじゃな!しかし、ロボ子よ、もし私がスピードランナーになったら、きっとバグを見つけすぎてゲームを壊してしまう自信があるぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search