Orionを深く探る:Discordクエストアウトメーションの仕組みとWebpackの内部構造の解析
Discordは長い間、クライアントを単なるメッセージングアプリ以上のものにしようとしてきました。つい最近、クエスト機能が追加されました。配信を視聴したり、30分だけゲームをプレイしたり、プロモーションビデオをスクロールしたりすると、アバターフレーム、オーブ、プロファイルDecorationが報酬としてもらえます。
全く興味のないゲームに時間を費やすことは、せいぜい疑問符が付く行為です。当然ながら、コミュニティはすぐにクライアントを攻略する方法を探し求めました。開発者nyxxbitによるOrionプロジェクトは、ブラウザコンソールから直接DiscordのWebpack内部構造をリバースエンジニアリングする方法の、最も詳細な例の一つかもしれません。
Orionの内部構造:仕組みの裏側
Orionは2つの形式で提供されています:DevToolsコンソールスクリプトとVencordプラグインです。ゲームへの参加、ビデオ視聴、Voice Channelのアクティビティをシミュレートします。そして这一切を、重いNode.js環境や外部エミュレータなしで実現しています。
最も興味深い部分は、技術的な実装の中に隠されています。通常、このようなスクリプトはDiscordのアップデートごとにすぐに壊れてしまいます。クライアント開発者はビルドを難読化するため、関数名は意味のない.A、.zP、_yに変わり、ハードコードされたパスは翌日には機能しなくなります。
Orionの作者は異なるアプローチを取りました。スクリプトはコンストラクタ名(constructor.displayName)で内部ステートマネージャー(QuestStore、RunStore、StreamStore)を検索します。Dispatcherを見つけるには、オブジェクト構造をチェックします:サブスクリプションの存在とメソッドdispatchです。このアプローチなら、小さなクライアントパッチの大半を壊さずに耐えられます。
5種類のクエストとその攻略法
Discordは現在5種類のクエストタイプがあります。Orionはそれぞれに独自のロジックで対処します:
- ビデオクエスト。スクリプトは7〜9秒の擬似ランダム間隔でタイムスタンプ
video-progressを送信し、小数秒の値も含みます。これにより、標準的なChromiumプレイヤーの動作を正確に模倣します。 - ゲームタスク。実際のゲームを起動する代わりに、Orionはプロセス
RunStoreにフェイクプロセスを注入し、Discordレジストリから実際のアプリケーションIDを取得します。 - 配信。スクリプトは
StreamStore.getStreamerActiveStreamMetadataにパッチを当て、合成ブロードキャストメタデータをクライアントに供給します。 - アクティビティ。Voice Channelに参加しているふりをさせるために、ハートビートが送信されます。
- アクティビティ実績(
ACHIEVEMENT_IN_ACTIVITY)。かつては単純なハートビートで十分でしたが、Discordはその抜け道を塞ぎました。今ではスクリプトはアプリケーションのOAuth2トークンをリクエストし、プロキシチケットを生成し、サーバーdiscordsays.comにフェイクな進捗を送信し、即座に付与された権限を取り消します。
ブラウザ保護のバイパスとローカルリレー
アクティビティクエストで、開発者は厳しい制限にぶつかりました。DiscordクライアントのContent Security Policy(CSP)は、レンダラーコンテキストからfetchのようなサードパーティドメインへの直接リクエストを禁止しています。
コンソールバージョンでこの制限を回避するために、Orion Relayがリポジトリに追加されました。PowerShellで書かれた小さなローカルHTTPサーバーで、文字通りわずか100行のコードです。ブラウザはゲームオーバーレイとの対話のために127.0.0.1:*に接続することが許可されているため、userscriptはリクエストをローカルプロキシに送信し、それがDiscordのサービスに転送します。Vencordを使用している場合は、プラグインのネイティブモジュールがElectronメインプロセスから直接このリクエストを行うため、CSPは適用されません。
考慮すべき実際のリスクがあります:Discordはクエストアウトメーションを активно監視しており、異常な進捗送信パターンをフラグ付けします。最悪の結果は単にフレームやスキンを 받지ないことでしたが、今はアカウント全体のストライクが発行されます。Orionの作者はREADMEの冒頭で明示的に警告しています:報酬を早く得るスピードには、プロファイルがBANされるゼロではないリスクが伴います。
代替手段との比較
OrionのアプローチはGitHub上唯一の方法ではありません。例えば、プロジェクトmarkterence/discord-quest-completerはRustとTauriでネイティブアプリケーションを作る道を選びました。Discordのメモリに注入する代わりに、OSにフェイクな実行ファイルをを作成し、Windowsのプロセス検出システムを欺きます。
この方法ではクライアントのファイルやメモリは一切触れないため、構造的にBANに更强くなります。しかし欠点もあります:通常のゲームクエストのみで動作し、ビデオやアクティビティは無視され、Windows限定です。
インターフェースと使いやすさ
OrionはピュアJSで書かれた組み込みオーバーレイを備えており、Discord独自のCSS変数でレイアウトされています。これにより любойテーマ(Light、Dark、AMOLED)に適応します。
報酬タイプでクエストをフィルタリングしたり、auto-claimを無効化したり(CAPTCHAに引っかかるのを防ぐため)、サイクル間の遅延のランダム化を構成して検出から保護したりできます。
試してみる価値はあるか
Orionを研究する価値は少なくとも、通常のuserscriptからWebpackやElectronの内部を巧みに扱える点を見ることにあります。クライアントWebアプリケーションのリバースエンジニアリングとアップデートに強いコードの書き方の素晴らしい例です。
メインアカウントで実行することは完全に自己責任です。実験する場合は、捨てアカウントで行うことをお勧めします。
関連プロジェクト