バイオハザード4(ゲームキューブ)—— C/C++ に完全なバイト単位のデコンパイル実装

2026/09/21 2:38

バイオハザード4(ゲームキューブ)—— C/C++ に完全なバイト単位のデコンパイル実装

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

まとめ:

本プロジェクトは、2004 年 11 月 25 日に発売されたゲームキューブ版『バイオハザード 4』の完全かつバイト単位で同一のデコンパイルを実現しました。これには、

main.dol
および 114 つの REL オーバーレイからなる正確なオリジナルバイナリとソースオブジェクトを再構築することで達成されています。Nintendo および SN システムズの GPL ソースドロップを活用し、チームは 2004 年の開発環境を精密に再現しました:
sn-gcc
を通じたネイティブ GCC、CRI Middleware の Metrowerks CodeWarrior 2.4.7、および Nintendo SDK の Metrowerks CodeWarrior GC/1.2.5n です。リポジトリには
src/
ディレクトリに約 555k 行の C/C++(~33k ヘッダー)と、独立したアセンブリソースファイルは含まれておらず、1,083 つのオブジェクトに跨る 1,564 個以上の関数が含まれています。
ninja
を使用したビルド検証により、オリジナルのディスクイメージと 100% 一致が確認され、SHA1 チェックサム(115 OK ライン)によって検証されました。再構築されたゲームおよび SDK はキャプコン、Nintendo、および CRI Middleware の知的財産として残りますが、すべてのツールおよび文書は CC0 ライセンスで公開されており、無制限の研究を可能にしています。研究者らは теперь アセンブリの深い知識なしでも高レベルの C++ コードを分析できるようになりました。ただし、一部のユニットでは GCC paired-single カーネルや MWCC キャッシュ/SPR カーネルなどオリジナル作詞のアセンブリが保持されており、
asm()
ブロック内では GAS シンタックスを使用しています。また、644 ユニットはコンパイラの相違による非自然なソース形状を反映する
// COMPILER-DIFF
コメントを含んでいます。命名規則は Bio4.sym のマングル関数、ベンダー PS2 マッピング、使用ベースの名称、および hex オフセットプレースホルダー(
xNN
)に基づいています。ビルド時にディスクイメージが必要であり、これを使用して main.dol/REL および island-stage REL を抽出します。ビルド要件には Linux、Python 3、および ninja が含まれます。この作業は、レガシーコンソールアーキテクチャに対する以前になかった洞察を可能にしつつもオリジナルバイナリへの厳密な忠実性を保つことで、ソフトウェア保存における画期的なマイルストーンとなりました。

本文

バイオハザード4 (ニンテンドーゲームキューブ版) 完全デコンパイルプロジェクト

プロジェクト概要

  • 対象: バイオハザード 4(ニンテンドーゲームキューブ版)の完全なバイトコード同一性デコンパイル
  • バージョン: G4BE08 デバッグビルド(2004 年 11 月 25 日プロトタイプ、両ディスク分)。
  • 識別方法: すべての関数が
    Bio4.sym
    ファイルで特定されています。
  • 再現結果: リポジトリを構築することで、以下のファイルと構造を完全再現。
    • main.dol
      (メインバイナリ)
    • 全 114 つの REL オーバーレイ
    • 検証済み SHA1:
      config/G4BE08/build.sha1

構成要素の統計情報

  • オブジェクト (体数)
    • 総計:1083 体(DOL 内 675 体、REL 合計 408 体)。
    • バイト同一性: すべての体は元のコードと完全に一致。
    • 関数数:15,641 つ。
  • ソースコード
    • C/C++ コード:約 55.5 万行 (
      src/
      )。
    • ヘッダーファイル:約 3.3 万行 (
      include/
      )。
    • アセンブリファイル: 含まれていません
  • ゲームコード
    • コンパイラ環境: SN Systems ProDG 3.9.3、GCC 2.95.3「SN BUILD v1.79」。
    • 構築方法: SN の GPL ソースドロップからネイティブにビルド。
  • CRI ミドルウェア
    • 使用コンパイラ: Metrowerks CodeWarrior 2.4.7(GC/2.7)。
    • 配送内容: CRI がライブラリと共にコンパイラを同梱。
  • ニンテンドー SDK
    • 使用コンパイラ: Metrowerks CodeWarrior GC/1.2.5n。
    • ソース元:
      dolsdk2004
      から取得。

アセットとデータについて

  • 画像アセット: プロジェクトには一切含まれていません。
  • ディスクファイル: 複製されたコードやデータは一切存在しません。
  • 必要な作業: デバッグディスクから画像ファイルをコピーする必要があります。
    • ディスク 1:
      main.dol
      と大半の REL を構築するために必要。
    • ディスク 2: 4 つのアイランドステージ用 REL (
      st3_0
      ~
      st3_3
      ) を構築するために必要。
    • 読み込みタイミング: 元ファイルはコンフィギュレーション時にそれらから読み込まれます。

ビルド手順

  • 環境要件: Linux、Python 3、ninja。
  • ツール群:
    decomp-toolkit
    ,
    objdiff
    ,
    wibo
    , CodeWarrior ビルド版(
    configure
    実行時に自動取得)。
    • ※例外:ネイティブの SN GCC は別途構築が必要です。

ステップバイステップ手順

  1. ネイティブ cc1/cc1plus の構築

    • 対象: SN の GPL ソースドロップ使用。
    • 詳細参照先:
      tools/sn-gcc/build.sh
    export SN_GCC_SRC=/path/to/NGC_GNU_SRC/NGC
    tools/sn-gcc/build.sh
    
  2. ディスク画像の準備

    • ディスク 1(
      main.dol
      + 110 の REL)を
      re4_debug_disc1.iso
      、ディスク 2 (
      st3_0
      ..
      st3_3
      ) を
      re4_debug_disc2.gcm
      にコピーします。
    cp re4_debug_disc1.iso re4_debug_disc2.gcm orig/G4BE08/
    
  3. ビルドと検証

    • 構築コマンド:
    python3 configure.py && ninja
    
    • 進捗確認:
      ninja
      終了時に DOL および REL モジュールが 100% マッチしリンク済みのレポートが表示されます。
    • SHA1 検証:
    build/tools/dtk shasum -c config/G4BE08/build.sha1
    
    • 出力: 115 件の「OK」表示が確認できます。

ユニット単位の比較ツール

  • バイト同一性確認:
    python3 tools/bytecmp.py game/foo
    
    • 対象オブジェクトを元のバイト単位ごとに比較します。
  • 関数差分確認:
    python3 tools/fdiff.py game/foo <symbol>
    
    • 特定の関数の差分を表示します。

リポジトリ構成(レイアウト)

  • src/game/
    • ゲーム本体(C++、一部の新しい lib C ユニット)。
    • src/em*/
      : 敵キャラクター
    • src/wep*/
      : 武器
    • src/pl*/
      : プレイヤーキャラクター
    • src/st*/
      : 部屋(各部屋ごとに 1 つの REL)
    • src/t_*/
      : その他のデータ
    • src/Tools/
      ,
      src/tools/
      : ゲーム内のデバッグエディタ
    • src/Sscrn/
      : サブ画面
  • src/lib/
    • SDK、CRI、ランタイムライブラリ。
  • include/
    • ヘッダーファイル、再構築された構造体レイアウトを含む。
  • config/G4BE08/
    • ユニットリスト (
      objects.py
      ,
      modules.py
      )
    • シンボル表 (
      symbols.txt
      ), スプリット情報 (
      splits.txt
      )
    • リンカースクリプト、モジュールごとの REL データ (
      modules/<mod>/
      )
    • 検証 SHA1 ファイル (
      build.sha1
      )
  • tools/
    • ビルドジェネレーター (
      project.py
      )、ProDG ドライバー (
      ngccc.py
      )
    • REL 再構築 (
      make_rel.py
      ,
      link_rel.py
      )
    • 比較ツール、sn-gcc/(ネイティブコンパイラビルド)
    • research/(コンパイラ分析キット)
    • motion_export.py
      + motion/(アニメーションを glTF/BVH へエクスポートし、Dolphin で検証)
  • docs/
    • overview.md
      : エンジンの組み立て方およびサブシステム別の読み方ガイド。
    • matching.md
      : マッチングの実施方法、コンパイラ系譜、機構カタログ、経験則。
    • unit-notes.md
      : 各ユニットに関するメモ。
    • research/
      : ステップバイステップの研究ロギング記録。

「マッチング」の意味と手法

  • 完全互換性: すべてのユニットが、元のコンパイラを用いて元のバイトコードに再コンパイルされます。
  • 特殊な記述の処理: 自然な C コードでの書き付けが見つからない場合(レジスタ選択やスケジューリングの再現)は、以下のコメントで明記します。
    • 例:
      // COMPILER-DIFF:
    • 件数:644 件(デッドテスト、空の
      asm("")
      で隠蔽されたもの、アンカー、レジスタ固定
      T x asm("rN")
      、パディングステートメントなど)。
    • 特性: これらの記述は一切指令を出力しません。

アセンブリテンプレートの検証

  • 確認コマンド:
    python3 tools/asmcheck.py --all
    
    • 全 GCC ユニットをテンプレート付きでコンパイルし、ハードウェアカーネルへの指令ヒットを表示(合計 231 件)。
  • 過去の経緯:
    • 以前のバージョンではゲームコードに約 100 の手動配置指令 (
      asm("li %0,0")
      など)、CRI ライブラリに約 100 のレジスタ固定ブロックが含まれていましたが、2026 年 9 月 17 日に C コードに置き換えられています。
    • 詳細レシピは
      docs/research/compiler.md
      の「Asm-removal pass」セクションに記載。

残存アセンブリの扱い

元の著者が他の方法で表現できなかったコードはアセンブリとして記述されています。

  • GCC 2.95 ゲームコード
    • ペアシンプリアルゴリズムカーネル(math_sub: SINF/COSF/RSQRT/LIMIT_ANGLE, trans, shape, dbmodule, Espgen42/45 の quantised psq_l)。
    • main/scheduler の GQR セットアップ。
    • libsn sndvd 例外ハンドラ。
  • MWCC CRI ライブラリ
    • ペアシンプリアルゴリズム / キャッシュ / SPR カーネル(mpv_umc, mpv_mc, dct_fsri, cftyp422_ppc, mpv_lib)。
    • SDK の mtx/vec/quat/GX 固有関数。
    • dct_ac のレジスタ-steering ブロック (
      dctac_Init
      )。
      • .vendor ビルド:
        .bss
        をプール化したが、8 バイトリテラルをプール化していなかった。
      • 我々の処理: 双方をプール化
    • 特定のアセンブリ記法:
      •  { mr r11, x; mr x, r11 }
        : コードレスなピン(色セットをレジスタ 1 つ狭める)。
      •  { mr v, v }
        : 不透明な自己コピー(27 の場所に残存)。
  • 8 つのアセンブリ本体ユニット
    • crt0
      (__start)、eabi、SN の tealeaf/fileserver/ppcdown/proview (
      src/lib/<name>.c
      )、Capcom の memset_2 と yz2asm (
      src/game/<name>.cpp
      )。
    • 特性: 元のものがアセンブリ(SN の libsn/crt0 および Capcom 独自の asm)であり、C ファイル内で GAS サムタックスの全体関数トップレベル
      asm()
      本体となっています(
      .globl
      ,
      .type
      , ラベル、
      .4byte
      ,
      .float
      など)。
    • 構築: 残りのコードと同じ ProDG ドライバーでコンパイルされます。
      • ヘッダー:
        include/asm_regs.h
        がレジスタ名前を供給。

命名規則と構造体定義

  • 関数名: デバッグビルドの
    Bio4.sym
    ファイルからの Capcom のものを使用。
    • C++ マングリングのため、ゲームコードは C++、SDK/CRI/newlib は C です。
  • ファイル名・ユニット境界: 二進法に残されたアサーション (
    D:/Bio4/Prog/<file>.cpp
    ) から決定。
  • 構造体およびフィールド名のタイプ:
    1. ベンダー名: PS2 デバッグビルドの型情報から取得(
      tools/ps2sym.py
      でマッチ)。
    2. 我々のもの: 使用状況から命名し、その旨を明記。
    3. プレースホルダー
      xNN
      : オフセットは 16 進数、内容は未確認。
  • 表記揺れ: ベンダー名のスペリング維持のため、意図的に異なる表記 Convention を混在させます。
  • #line ディレクティブ: アサーション文字列にベンダーの行番号を再現。
  • 詳細:
    docs/naming.md
    参照。

コントリビューションとライセンス

  • コントリビューションガイド (
    CONTRIBUTING.md
    )
    :
    • ビルド手順、3 つの検証チェック、ルール(バイトコード変更禁止、指令出力禁止、命名規則)。
    • 証拠付きでのリネーム提案方法。
  • ライセンス:
    • ゲーム/SDK ソース: Capcom, Nintendo, CRI Middleware の知的財産です。
    • ビルドスクリプト・ツール・文書: CC0 ライセンス (LICENSE) 下で公開されています。
    • 利用目的: 研究および保存のためのみ。

同じ日のほかのニュース

一覧に戻る →

2026/09/21 2:38

サムスン電子は、HBM4 と HBM4E ドラムの生産量を 2 倍超と予測されています。

## Japanese Translation: サムスン電子は、高付加価値な HBM4 メモリ製品(第 6 世代および来期の第 7 世代バリエーション)へのシフトを強化し、高度な 6nm 技術を用いた量産が既に開始されています。総年間生産量は今年にほぼ 40% 増加して約 25 万ウェハと予測される一方、次年度には HBM4E の生産を加速させることで、特定の HBM4 製品への生産量を倍以上に増やす計画です。この積極的な拡張は、主にガラスキャリアの供給が大幅に増加することに依存しており、これは高層スタック(12 レア層以上)の重要なサポート層となります。ガラスキャリアの供給量は今年 2 万枚/月から、来期には 5 万枚/月へと増加します。結果として、HBM4 ファミリーがサムスンの総メモリ出荷量に占める割合は、現在約 40% から次年度には 80% に上昇する見込みです。この成長を持続するには、ウェーファーの歪み制御を maîtriser し、外注洗浄オペレーションのスケーリングを行うことが不可欠であり、これらがサムスンの将来のメモリビジネスにおいてサプライチェーンの調整と技術的な精度が極めて重要であることを示しています。

2026/09/21 0:18

広告収集機能により、ChatGPT は他のウェブサイトでのあなたの行動を知るようになりました

## Japanese Translation: **改善されたサマリー:** OpenAI の広告収集システムが、第三者の広告主サイトにわたるユーザーの閲覧活動と ChatGPT のアイデンティティを秘密裡に結びつけることを示す最も重要な発見は、`__obi` という専用のクッキーを利用している点にあります。この仕組みは、ChatGPT 上でアカウントのアイデンティティをバインドした JWT を生成し、標準的な広告ピクセルを通じてサイト間へ送信することで機能します。これにより、ユーザーがログインしていなくても、OpenAI はユーザーの行動をプロファイルできます。「__obi」はセキュリティ設定によりほとんどのブラウザでブロックされていますが、Android の Chrome などサポートされているブラウザでは、その独自の構成(`SameSite=None`、「HttpOnly」、特定のドメインスコーピング)によってこれらの保護を回避することが可能です。その結果、広告主はターゲティングのためにユーザーのアイデンティティに直接アクセスでき、明示的なマーケティング同意なしにスクレイピングによって収集されたフォームやページテキストから医療歴や債務の詳細など機密データを露見するリスクが生じます。公開された問い合わせを受けて OpenAI はこの問題を確認し内部審査を開始しましたが、Intelligent Tracking Prevention により iOS/Safari ではこの仕組みが機能しないため、限界が存在します。

2026/09/21 0:16

海賊フェイスがLLMモデルの削除を阻止した

## Japanese Translation: Pirate Face は、主権を持つ人工知能のための分散型かつ検閲耐性のあるインフラストラクチャを提供することで、AI アクセスを革新します。Hugging Face のオープンモデルは、グローバルピアツーピアスウォームと組み込まれたウェブシードを使用して鏡映されており、ユーザーが単一の障害点を依存する必要がないことを保証しています。モデルの完全性は、公式 Hugging Face SHA-256 ハッシュに対するチェックサム検証を通じて保証され、HTTPS リンクがダウンした場合、トラフィックは耐性の高い P2P ネットワークを介して自動的にルート付けされ、モデルは"Rescued"とマークされます。 基本的なブラウジングおよびダウンロードにはアカウントは不要ですが、貢献を追跡し、将来の利益を主張し、なりすましを防ぐ(検証済みクリエイターバッジを通じて)ために、検証済みハンドルは不可欠です。独自のモデルを追加するには、ピア専用マグネット、ピンされたリビジョン、ファイルチェックサム、そしてライセンス証拠(MIT、Apache-2.0、または Kimi-K3 の例外)を提出する必要があります。 導入はシームレスです:既存のパイプラインは `$export HF_ENDPOINT=https://pirateface.co` を設定することで瞬時に統合でき、Hugging Face やスウォームを自動的にルート付けします。ユーザーが現在、直接の公開のために Hugging Face にコピーを保持しておく必要がある一方で、独立した公開機能は将来計画されています。参加にはポイント(例:ウェルカムポイント、紹介ポイント、救助されたモデルごとに最初の検証済みハンドルにクレジットされる 25 ポイント)が付与され、アクティブな参加者向けのフリーコンピューティングクレジットや独占モデルリリースなど、今後の機能も予定されています。最終的に、Pirate Face はホスティングのシャットダウンや外部の規制に関わらず、オープンモデルへの継続的なアクセスを保証します。