[Hack] コード移植方法 with GHIDRA

GHIDRA

NSAが開発した逆アセンブラツールです。

しかも無料というのだから、これまたすごいの一言です。

IDA Proはものすごく便利なツールですが、ライセンス料が高いので導入のハードルがかなり高いです。

このサイトでダウンロードできるのでまずはGHIDRAを入手しましょう。

現在の最新版の9.1.1はNSOLoaderに対応していないので、旧バージョンをインストールするほうがいいかもしれません。

というわけで以下のリンクでGHIDRAの9.1へのリンクを貼っておきます。

IDA ProでできることのほとんどがGHIDRAでできます。

JDK

GHIDRAの実行にはJDK(JAVA)が必要なので、公式サイトからインストールしましょう。

インストールが終わったらJavaのパスを通します。

Path通すのは不要かもしれないので、動かなかったときだけ試してみてください。

環境変数
C:\Program Files\Java\jdk-11.0.3\bin

環境変数に追加するパスはインストールしたJDKのバージョンによって異なります。

わからない場合はドライブC内の “ProgramFiles\Java” から確認してください。

メモリの変更

GHIDRAはデフォルトでは1024MBしかメモリを使ってくれないのですが、これだとメモリが足りずに解析失敗するかもしれないので最低でも2048MBは確保したほうがいいでしょう。

ghidraRun.bat
:: Ghidra launch

@echo off
setlocal

:: Maximum heap memory size
:: Default for Windows 32-bit is 768M and 64-bit is 1024M
:: Raising the value too high may cause a silent failure where
:: Ghidra fails to launch.
:: Uncomment MAXMEM setting if non-default value is needed

set MAXMEM=2048M

call "%~dp0support\launch.bat" bg Ghidra "%MAXMEM%" "" ghidra.GhidraRun %*

こんな感じでコメントを外して好きな値をいれればOK。

一応1024MBでも解析できたけど、余裕があるならそれ以上に設定しておこう。

見た目の変更

デフォルトのGHIDRAはとてもダサいので変更しましょう。

フォントはいろいろありますが、個人的にはConsolasかRoboto Monoがオススメです。

EDIT->Tool Options

特にバイトのところはデフォルト設定だと死ぬほど見にくいので以下のような設定がオススメ。

最初からエンディアンもあっているので逆にする必要はありません。

ここも常にCapital Letter(大文字)表示設定ができればべんりだったんだけど、残念。

カスタマイズしたGHIDRA

自分もまだまだ全然弄れていないので、もっと便利なカスタマイズ方法があれば教えて下さい。

GHIDRAの使い方

いくつかのパートに分けてGHIDRAの使い方を解説していきたいと思います。

GHIDRAを展開した状態

Loaderの導入

GHIDRAでのNSOの分析を便利にしてくれるプラグインが公開されていたので紹介します。

  • GHIDRAを起動してFile -> Install Extensionを選択
  • 右側の+ボタンを押して、ダウンロードしたzipファイルを直接指定
Loaderの読み込み

GHIDRAの再起動が要求されると思うので、再起動しましょう。

バイナリの分析

ghidraRun.batを起動します。

まずは実行ファイルであるNSOを分析します。

同意書

I Agree(同意)をクリックして先に進みます。

起動するとプロジェクトを作成するように指示されます。

プロジェクト名は適当に決めてしまいましょう。

NSOファイル(ここではmain)をドラッグアンドドロップするか、Select File Importからファイルを選択してください。

ファイル選択画面
ELFファイル選択画面

ELFってExecutable and Linking Formatの略だったんですね。

ここはELFファイルになってますが、NSOを読み込むとこれとは違う表示になります。

インポート結果が表示されます。

「分析済みではないので分析しますか?」というダイアログが表示されるのでYesを選択します。

分析オプション

とりあえずデフォルトでチェックが入っているものだけにしました。

デフォルトで全く問題なかったのでこれでオッケー。

Analyzeをクリックすると分析が始まります。

分析中

右下の表示で分析中なことがわかります。

分析のスピードは使用しているマシンのCPUのスペックに依存します。

i7 6700Kで実行したところ約20分ほどかかりました。

Macbook Pro2019だと40分くらいかかりました、気長に待ちましょう。

コードの移植

移植に関して言えば基本的に命令部は弄る必要がないので、正しいアドレスの位置さえ指定してあげれば良いことになります。

文字列検索

文字列検索を利用するコード移植の例としては試し打ち場の置換などが上げられます。では、その方法を解説しましょう。

試し打ち場のパラメータ名はFld_ShootingRange_Shrなのでそれを検索してみましょう。

Search->Program Textを開きます。

Commentsにもチェックが入っていますが、Labelsだけで十分です。

これでアドレスが7102404b2cであることがわかりました。

GHIDRAでNSOを直接分析した場合にはアドレスが0x7100000000ズレる事がわかっているので、IPSwitch形式だと02404b2cとなるわけです。

// ShootingRange Replacements [AmazingChz]
@enabled
02404B2C XXX

Urchin Underpass       = Fld_Crank00_Vss
Saltspray Rig          = Fld_Seaplant00_Vss
Museum d'Alfonsino     = Fld_Pivot00_Vss
Mahi-Mahi Resort       = Fld_Hiagari00_Vss
Hammerhead Bridge      = Fld_Kaisou00_Vss
Flounder Heights       = Fld_Jyoheki00_Vss
Ancho-V-Games          = Fld_Office01_Vss
Arowna Mall            = Fld_UpDown01_Vss
Blackbelly Skatepark   = Fld_SkatePark02_Vss
Camp Triggerfish       = Fld_Athletic01_Vss
Goby Arena             = Fld_Court00_Vss
Humpback Pump Track    = Fld_Wave00_Vss
Inkblot Art Academy    = Fld_Upland00_Vss
Kelp Dome              = Fld_Maze02_Vss
MakoMart               = Fld_Line00_Vss
Manta Maria            = Fld_Pillar00_Vss
Moray Towers           = Fld_Tuzura00_Vss
Musselforge Fitness    = Fld_Unduck00_Vss
Piranha Pit            = Fld_Quarry02_Vss
Port Mackerel          = Fld_Amida01_Vss
Shellendorf Institute  = Fld_Tunnel00_Vss
Snapper Canal          = Fld_Kawa01_Vss
Starfish Mainstage     = Fld_Venue02_Vss
Sturgeon Shipyard      = Fld_Nagasaki00_Vss
The Reef               = Fld_Ditch02_Vss
Wahoo World            = Fld_Carousel00_Vss
Walleye Warehouse      = Fld_Warehouse01_Vss
New Albacore Hotel     = Fld_Nakasu00_Vss
Skipper Pavilion       = Fld_Mirror00_Vss
Lost Outpost           = Fld_Shakehouse00_Cop
Marooner's Bay         = Fld_Shakeship00_Cop
Salmonid Smokeyard     = Fld_Shakelift00_Cop
Spawning Grounds       = Fld_Shakeup01_Cop
Staff Roll             = Fld_StaffRoll00_Stf
Tutorial               = Fld_Tutorial00_Ttr
Old Starfish Mainstage = Fld_Venue00_Vss
Shifty Station         = Fld_Deli_Octa51_Vss

バイト検索

長くなるので時間ができたときに書きます。

まとめ

GHIDRAを久々にカスタマイズしたのですが、やっとバイト表示がへんてこな開業をせずに済んだので大きな発見でした。