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

Hack

GHIDRA

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

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

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

Ghidra

このサイトでダウンロードできるのでまずは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の導入

Adubbz/Ghidra-Switch-Loader
Nintendo Switch loader for Ghidra. Contribute to Adubbz/Ghidra-Switch-Loader development by creating an account on GitHub.

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

コメント

  1. らみあ より:

    アドレス “24E1074” の値を “66 66 F6 3A” に変更せよ

    という命令だったということです。

    と書いてありますが、なんで、そうなるのでしょうか?
    すみません…あまり知識がないもので…

    • me より:

      素朴な疑問なのですが、IPSwitchで記述されているコードがゲームにどのようにして影響を与えるかご理解いただけているでしょうか?
      ここの理解が不十分だと、まずここから説明しなくてはいけませんので。

    • らみあ より:

      それは理解出来ました。

    • me より:

      では以下のIPSwitchのコードについて考えます。
      [4.3.1]
      // Invisible
      @enabled
      024E1074 6666F63A

      これは「アドレス24E1074にある(本来は6666A63Fという)値を6666F63Aに上書きする」という意味なのもご理解頂けるでしょうか?
      ※本来の値はバイナリで調べないとわかりません

  2. より:

    >>1 自分から質問しておいて結局放置って常識無さすぎだろ

    管理人もこんな奴に答えてあげる必要なんてないよ
    コードの意味が分かってない時点でこのブログ見てる意味が分からん

    • me より:

      おっしゃられるとおりです。
      お返事お待ちしていたのですが、なかなか返ってこないのでここで一旦締め切らせていただこうと思います。

    • haru より:

      やってみます。返信ありがとうございます!

    • me より:

      またわからないことがあればどうぞ。
      NSOの取り出し方については記事にしていないので、近いうちにまとめようと思います。

    • CFW�¿GG815¿ より:

      ダウンロードしなくてはいけないものをダウンロードしたいのですがそのURLをくれませんか?

    • me より:

      必要なもののURLはすべて記事内に載せているので記事をしっかりと読んでからもう一度コメントしてください。

  3. haru より:

    NSOとはなんですか?

    • me より:

      ここでNSOについて簡単に解説しているのでどうぞ。

      https://tkgstrator.work/?p=5381

    • haru より:

      NSOの取り出し方について詳しく教えてもらえませんか?

    • me より:

      簡単に手順を説明すると以下のようになります。

      1. HACGUIを使ってアップデータをNSPないしはNCAでダンプします。
      2. title.keyがあればhactoolでNCAを展開できます。
      3. 展開したexefsフォルダ内にmainがあります
      4. mainはNSO形式なのでELFに変換します。

    • haru より:

      アップデータでないとだめですか?

    • me より:

      アップデータでないと1.0.0のNSOを解析することしかできないので、それでは意味がありません。

タイトルとURLをコピーしました