Skip to content

Instantly share code, notes, and snippets.

@alalwww
Last active August 29, 2015 14:07
Show Gist options
  • Save alalwww/51f788066d11bfa603f7 to your computer and use it in GitHub Desktop.
Save alalwww/51f788066d11bfa603f7 to your computer and use it in GitHub Desktop.
KCRDBパッチめも

本家(終了)

デコンパイル

  • ILSpyを使う。

  • 使い方は直感的にわかるレベル。検索すれば日本語の解説も多分みつかる。

  • KCRDB.csprojとかソースコードやリソースファイル一式が手に入る。そのままVSで開けるのでコードの解析はかなり楽。

  • スレ見た感じ修正しないとコンパイルは通らないらしいけど、改修が目的じゃないので無視。必要になったら調べる。

逆アセンブリ

  • ildasmを使う。

  • 使い方は上記サイトに書いてある通り。コマンドプロンプトでKCRDB.exe食わせるだけ。

  • 出力先ファイル名を指定でき、そのファイルの出力先フォルダー内に他のファイルも大量に出力される。指定したファイル名のファイル以外の中間ファイル?も大量に出力されるので、空フォルダー以下に出力するようなコマンドにしておいたほうが後片付けが楽。

  • /source /allオプションとかつけると結構楽できそう

  • outで指定して吐かせたファイルを元に、バイナリを検索してパッチを作成する。

度々出てくるILってなんぞ

C#もJavaなんかと同じで一度中間言語に変換される。.NET系のアプリはその状態でexeに含まれてる(っぽい)。

おかげで解析が楽ですありがとう。

解析~パッチ作成の手順

  • まず始めにソースコードから修正したい処理を決め、修正箇所を絞り込む。コンパイル後にコンパイラ先生がどう最適化するかも考慮して決める必要あり。
  • アセンブリコードから修正箇所に対応する部分を見つける。大抵はメソッド名で検索すればいける。
  • アセンブリコードとソースコードを比較し修正できるか見極める。無理そうだったらバイナリパッチでの延命は諦メロン。
  • ソースコードと対応する部分の目星をつけたら、その周辺を含めてOPCodesクラスのフィールドの詳細を参考にしながら、アセンブリ形式の処理をバイトコード(書式カラムの値)と対応付けてゆく。
  • 修正箇所を絞り込める程度に特徴的なパターンができたら、バイナリエディタで開いたKCRDB.exeから、修正箇所のあたりを見つけ出す。
    • 複数マッチするようならパターンが短いので、もっと特徴的なパターンを探すか、マッチ箇所の前後をアセンブリ形式に戻しながら絞り込む。
    • 一つもマッチしないようなら対応付けをミスってるのでやり直す。
  • 処理を消すだけならNOPで埋めればOK。後続処理に影響しないよう、スタックの中身とか考えながら不要な処理をNOPで埋める。
  • 多分Br.sでジャンプするとかもできると思う。ただし戻り先間違えると無限ループったり盛大にバグる可能性もある。
  • 処理を足す場合はバイト長がかわらないような考慮が(多分)必要。だけど、うまくやれば処理の書き足しも多分可能。

解析の具体例は以下のサイトにちょっとだけ書いてある。


こっちにメモったののの補完版 http://jbbs.shitaraba.net/bbs/read.cgi/netgame/12394/1412253200/329n

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment