Ghidraを使うと実行ファイルのリバースエンジニアリングができると聞きましたので、さっそくやってみました。
環境
Windows11 Home
※JDKが入っていなかったので、入れました。
準備
Ghidraのダウンロード
ここからzipファイルをダウンロードして解凍しました(ghidra/Ghidra at Ghidra_11.2.1_build · NationalSecurityAgency/ghidra · GitHub)
最近は解凍じゃなくて、展開という表現を使うのが一般的のようですが、いまだに解凍の方を使っています。

ghidraRun.batを実行したところ、JAVAのランタイムが見つからないとのエラーが出ます。
Javaで作られているのですね。

JDKのインストール
GhidraのDOCを確認するとJDK 21 64 bitが必要でしたので、こちらからダウンロードしてインストールしました。
最新リリース |JDK

JDKのインストール後、ghidraRun.batを実行したところ起動した様子。

勝手に改変しないこと等が書かれていますが、特に問題もないのでAgreeします。

問題なくGhidraが起動しました。
手前に表示されているのは「今日のTips」。とりあえず閉じます。
とりあえず使ってみる
使い方の流れ
使い方は
① プロジェクトを作る
② exeファイルを登録すると解析が始まる
③ ブラウザで必要な情報を確認する
といった流れになります。
プロジェクトを作る
[File] – [NewProject] を選択

共有プロジェクト/ 非共有プロジェクトを選択(非共有を選択)

プロジェクト用のディレクトリを選択(プロジェクト名はとりあえずTest)

これで準備完了

exeファイルを登録すると解析が始まる
リバースしたい実行ファイルをWindowsにドラックして登録します。
事前に作っておいた「ConsoleApplication.exe」を読み込ませてみました。
※C++で作った、ただのHelloCです

ConsoleApplication.exeが登録された様子

ファイル名をダブルクリックすると解析が始まります
ファイルが小さいので一瞬で終わりました

今すぐ解析しますか?と聞かれるので「OK」を選ぶと分析オプションが選べます。
(このままAnalyzeしました)

ニモニックが並んでいるので解析できたのだと思います。私にはまったく読めません。
ブラウザで必要な情報を確認する
関数名は復元されないので、Stringやmainでターゲットを絞り込みました。
①含まれている文字列で検索する
Filterを使って文字列を直接検索しました。

Filterに「Hello」と入力すると、「s_Hello_c++_World!」がヒットしました。
内部的には、DSで領域を確保してASCII文字を使っているようでした。
②main関数の関数名で検索する
Filterを使ってMain関数を検索すると「main」がつく関数が絞り込まれるので、この中から探していく感じです。

探していたmain関数はここにありました。
ちなみに今回作成したソースとリバースソースを比較するとこんな感じです。
(元)作成したソースプログラム
#include <iostream>
int main()
{
std::cout << "Hello c++ World!\n";
}
リバースしたソース
int __cdecl main(int _Argc,char **_Argv,char **_Env)
{
__CheckForDebuggerJustMyCode(&__89188920_ConsoleApplication1@cpp);
std::operator<<<std::char_traits<char>_>((basic_ostream<> *)cout_exref,"Hello c++ World!\n");
return 0;
}
癖は強いですがなんとなく読めるかな程度だと感じました。
ニモニック「PUSH RBI」 よりこっちの方が断然読みやすいです。
関数名は、右クリックで変更できるので、正しい関数名に変えると可読性が上がります。
最後に
初めて使ったので、もっといい使い方があるのかもしれませんが、以前使っていた「binaryanalysis」より可読性が高いソースにリバースしてくれると感じました。
しかも、javaで作られているのでプラットフォームに依存しない作りが素晴らしい。
操作性も直感的で、なんとなくでも使えるあたりがいいですね。