LoginSignup
2
0

More than 3 years have passed since last update.

アプリ本体更新せずプログラム修正 InjectFix メモ

Last updated at Posted at 2020-10-21

ソースコード
https://github.com/Tencent/InjectFix

面白い仕組みだと思ったので、紹介します。
使う予定がなく、試していません。詳細な使い方はマニュアルを参照してください。

InjectFixとは

Tencentのリポジトリにある。
Unityゲームについて、アプリ本体を更新せずプログラムを修正することができる。
あらかじめパッチを受け入れるための細工をする必要がある。

3行で説明
IL2CPP以前に、パッチがあるかチェックするコードをメソッドに挿入
パッチはC#ソースコードからコンパイルして作る
InjectFixは仮想マシンを実装している

流れ

C# でこのようなコードを書く。

void AddScore(int x)
{
  _score += x;
}

👇 C#コンパイラでコンパイル
👇 DLL
👇 InjectFixにより、パッチチェック・実行用コードをメソッドに挿入
👇 IL2CPPしてビルド
👇 アプリの本体提出・リリース
👇 スコアが1000以上にしたらバグることがユーザーからの報告で判明 999でカンストするようにしたら直る
👇 パッチ用のコードを書く

[Patch]
void AddScore(int x)
{
  _score += x;
  _score = Math.Min(_score,999);
}

👇 パッチファイルに変換。アップロード。アプリはパッチファイルをDL。完了。

パッチチェック・実行用コード挿入

パッチがあるか確認して実行するコードをメソッドに挿入します。
これはランタイムで行われるのではなくて、IL2CPPするより前に行います。

void AddScore(int x)
{
  // 処理を挿入(イメージ)
  if(IsPatched(12345/*メソッドを識別するために割り当てたID*/)){
    CallPatchedMethod(12345, x)
    return;
  }
  //元のコード(パッチがなければ実行)
  _score += x;
}

例では戻り値なしですが、戻り値ありも対応しています。
CallPatchedMethodで何をするかというと、仮想マシンでパッチ後のコードを実行します。
InjectFixには仮想マシンが実装されています。

このような方法ではありません。Win32アプリでx86命令を直接実行させる

感想

良い C#でパッチが書ける。
良い アプリ本体を更新しない。
悪い パッチがあるかチェックするコストがかかる。
悪い パッチは仮想マシンで実行されるため、いくらかパフォーマンスが落ちる。バグがあるよりまし。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0