『リバースエンジニアリングツールGhidra実践ガイド』サポートサイト | マイナビブックス

『リバースエンジニアリングツールGhidra実践ガイド』サポートページ

ここは、『リバースエンジニアリングツールGhidra実践ガイド』(ISBN978-4-8399-7377-3)のサポートページです。

紙版

 2020年8月26日 初版第1刷発行
電子版
 2020年8月26日 初版第1刷発行・電子版 ver1.00

書籍詳細ページに戻る

●サンプルファイル

こちらから、「注意書きを確認しましたか」にチェックして「同意してダウンロードする」ボタンを押してダウンロードしてください。このサンプルファイルは、実行したとしても実行端末や外部の端末に影響を与えないような対策がとられていますが、できる限り、専用に構築した仮想環境上で実行してください。また、このサンプルファイルの実行や本書の内容を用いた解析などで、何らかの不具合が出たとしても、当社および執筆者は一切の責任を負いません。

●訂正情報(2021/03/5更新)

第1刷

009ページ リスト1-4-4 2行目

MessageBoxA(NULL, lpText, lpCaption, MB_OK);g
MessageBoxA(NULL, lpText, lpCaption, MB_OK);
 

025ページ 4行目

コンパイルした日時を示すNumberOfSections
コンパイルした日時を示すTimeDateStamp
 

029ページ 表1-6-1 表タイトル

Mirosoft x64 呼び出し規約のレジスタ使用規則
Microsoft x64 呼び出し規約のレジスタ使用規則
 

043ページ 13行目


・ Display EOL comments
・ Display POST comments

・ Display EOL comments
・ Display Plate comments
・ Display POST comments
 

047ページ 下から4行目

[Toggles overviw margin displays.]ボタン
[Toggles overview margin displays.]ボタン
 

048ページ 4行目

[Toggles overviw margin displays.]ボタン
[Toggles overview margin displays.]ボタン
 

052ページ 6行目

「Plate Comment」と「Pre Comment」だけです。
「Pre Comment」だけです。
 

052ページ 9行目

[Foramt]の[String]は文字列の部分
[Format]の[String]は文字列の部分
 

056ページ 5行目

Defined Stingsウィンドウ
Defined Stringsウィンドウ
 

060ページ 3行目

Post-Commnet]を追加します。
Post-Commnet]を追加します。
 

066ページ 7行目

[Format Option]が設定可能です。
[Format Options]が設定可能です。
 

067ページ 4行目

[Search Strings Preview]と呼びます。
[Search String Preview]と呼びます。
 

069ページ 6行目

文字列の[Strings View]、[Strings Type]、
文字列の[String View]、[String Type]、
 

070ページ 表2-5-8 表タイトル

表2-5-8
表2-5-9
 

073ページ

●downloader.exeの解析を終えて
3-5 downloader.exeの解析を終えて
 

075ページ 下から2行目

[Search]→[Search Memory]を開き、
[Search]→[Memory]を開き、
 

078ページ 下から3行目

[Imports]ツリー配下の[URLMONDLL]をダブルクリックすると、
[Imports]ツリー配下の[URLMON.DLL]をダブルクリックすると、
 

082ページ リスト3-3-1 4行目

while ((*local_8 != (undefined *)0x0 && (HVar1 = FUN_004010e0((int)local_8,local_164), HVar1 != 0)
while ((*local_8 != (undefined *)0x0 && (HVar1 = download_file((int)local_8,local_164), HVar1 != 0)
 

083ページ 8行目

Listingウィンドウで表示されるコード内のlocal_8に対して
Decompileウィンドウで表示されるコード内のlocal_8に対して
 

083ページ リスト3-3-2 015行目

(HVar1 = FUN_004010e0((int)local_8,local_164), HVar1 != 0))) {
(HVar1 = download_file((int)local_8,local_164), HVar1 != 0))) {
 

084ページ リスト3-3-3


HRESULT __cdecl download_file(astruct *param_1,wchar_t *param_2)
{
  BOOL BVar1;
  HRESULT HVar2;
  FUN_004010a0(param_2,param_1->field_0x8);
  BVar1 = PathFileExistsA((LPCSTR)param_2);
  if (BVar1 == 1) {
    HVar2 = 0;
  }
  else {
    HVar2 = URLDownloadToFileA((LPUNKNOWN)0x0,param_1->field_0x4,(LPCSTR)param_2,0,
                               (LPBINDSTATUSCALLBACK)0x0);
  }
  return HVar2;
}


HRESULT __cdecl download_file(int param_1,wchar_t *param_2)
{
  BOOL BVar1;
  HRESULT HVar2;
  FUN_004010a0(param_2,*(int *)(param_1 + 8));
  BVar1 = PathFileExistsA((LPCSTR)param_2);
  if (BVar1 == 1) {
    HVar2 = 0;
  }
  else {
    HVar2 = URLDownloadToFileA((LPUNKNOWN)0x0,*(LPCSTR *)(param_1 + 4),(LPCSTR)param_2,0,
                               (LPBINDSTATUSCALLBACK)0x0);
  }
  return HVar2;
}

 

085ページ 5行目

DataTypeは、カラムをダブルクリック、
DataTypeは、カラムをダブルクリッック、
 

087ページ 7行目

[Equate Strings]にcsidlと入力します。
[Equate String]にcsidlと入力します。
 

089ページ 下から5行目

関数の引数を編集を編集していきます。
関数の引数を編集していきます。
 

090ページ 下から5行目

FUN_00401140関数の呼び出し以前には、
FUN_004010a0関数の呼び出し以前には、
 

093ページ 図3-4-3 図タイトル

Parse C Fileウィンドウでヘッダファイルを指定して読み込み
Parse C Source ウィンドウでヘッダファイルを指定して読み込み
 

130ページ コマンド4-3-9


>>> def get_instructions_in_func(func):
...     inst = getFirstInstruction(func)
...     while inst is not None:
...         if getFunctionContaining(inst.getAddress()) is func:
...            yield inst

... entry_func = getFirstFunction()
... insts = get_instruction_in_func(entry_func)
... for inst in insts:
...     print('{} {}'.format(inst.getAddressString(True, True), inst))


>>> def get_instructions_in_func(func):
...     inst = getFirstInstruction(func)
...     while inst is not None:
...         if getFunctionContaining(inst.getAddress()) is func:
...            yield inst
...            inst = getInstructionAfter(inst)

... entry_func = getFirstFunction()
... insts = get_instruction_in_func(entry_func)
... for inst in insts:
...     print('{} {}'.format(inst.getAddressString(True, True), inst))


133ページ 下から10行目

Flat APIとGhidra APIを分けて解説していますが
Flat APIとScript APIを分けて解説していますが
 

133ページ 下から9行目

Ghidra APIはFlat APIを継承しているものなので、
Script APIはFlat APIを継承しているものなので、
 

137ページ 2つ目のコマンドライン


C:¥Ghidra>cd %GHIDRA_INSTALL_DIR%¥Ghidra¥Features¥Python¥lib
C:¥tools¥ghidra_9.1.2¥Ghidra¥Features¥Python¥lib>java --illegal-access=deny -jar jython-standalone-
2.7.1.jar -m ensurepip
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-9.0.1 setuptools-28.8.0
C:¥tools¥ghidra_9.1.2¥Ghidra¥Features¥Python¥lib>java --illegal-access=deny -jar jython-standalone-
2.7.1.jar -m pip --version
pip 9.0.1 from C:¥tools¥ghidra_9.1.2¥Ghidra¥Features¥Python¥lib¥Lib¥site-packages (python 2.7)


C:¥Ghidra>cd %GHIDRA_INSTALL_DIR%¥Ghidra¥Features¥Python¥lib
C:¥ghidra_9.1.2¥Ghidra¥Features¥Python¥lib>java --illegal-access=deny -jar jython-standalone-
2.7.1.jar -m ensurepip
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-9.0.1 setuptools-28.8.0
C:¥ghidra_9.1.2¥Ghidra¥Features¥Python¥lib>java --illegal-access=deny -jar jython-standalone-
2.7.1.jar -m pip --version
pip 9.0.1 from C:¥tools¥ghidra_9.1.2¥Ghidra¥Features¥Python¥lib¥Lib¥site-packages (python 2.7)

 

137ページ 3つ目のコマンドライン


C:¥tools¥ghidra_9.1.2¥Ghidra¥Features¥Python¥lib>java -jar jython-standalone-2.7.1.jar -m pip install
graphviz
...


C:¥ghidra_9.1.2¥Ghidra¥Features¥Python¥lib>java -jar jython-standalone-2.7.1.jar -m pip install
graphviz
...

 

139ページ コマンド4-4-1


> %GHIDRA_INSTALL_DIR%¥support¥analyzeHeadless.bat C:¥Ghidra headless_project -import C:¥Ghidra¥ch02¥download
er.exe.gzf
...
INFO HEADLESS Script Paths:
    C:¥Users¥john¥ghidra_scripts
    C:¥tools¥ghidra_9.1.2¥Ghidra¥Features¥Base¥ghidra_scripts
(中略)
    C:¥tools¥ghidra_9.1.2¥Ghidra¥Processors¥PIC¥ghidra_scripts (HeadlessAnalyzer)
INFO HEADLESS: execution starts (HeadlessAnalyzer)
INFO Creating project: C:¥Ghidra¥headless_project (HeadlessAnalyzer)
INFO Creating project: C:¥Ghidra¥headless_project (DefaultProject)
INFO REPORT: Processing input files: (HeadlessAnalyzer)
INFO project: C:¥Ghidra¥headless_project (HeadlessAnalyzer)
INFO IMPORTING: C:¥Ghidra¥ch02¥downloader.exe.gzf (HeadlessAnalyzer)
INFO REPORT: Import succeeded with language "x86:LE:32:default" and cspec "windows" for file: C:¥Ghidra¥ch02
¥downloader.exe.gzf (HeadlessAnalyzer)
INFO ANALYZING all memory and code: C:¥Ghidra¥ch02¥downloader.exe.gzf (HeadlessAnalyzer)
INFO Packed database cache: C:¥Users¥john¥AppData¥Local¥Ghidra¥packed-db-cache (PackedDatabaseCache)
INFO Windows x86 PE RTTI Analyzer> Couldn't find type info structure.
(AutoAnalysisManager)
INFO -----------------------------------------------------
    ASCII Strings 0.724 secs
(中略)
    x86 Constant Reference Analyzer 1.833 secs
-----------------------------------------------------
     Total Time 14 secs
-----------------------------------------------------
(AutoAnalysisManager)
INFO REPORT: Analysis succeeded for file: C:¥Ghidra¥ch02¥downloader.exe.gzf (HeadlessAnalyzer)
INFO REPORT: Save succeeded for file: /downloader.exe (HeadlessAnalyzer)


> %GHIDRA_INSTALL_DIR%¥support¥analyzeHeadless.bat C:¥Ghidra headless_project -import C:¥Ghidra¥ch02¥download
er.exe.gzf
...
INFO HEADLESS Script Paths:
    C:¥Users¥john¥ghidra_scripts
    C:¥tools¥ghidra_9.1.2¥Ghidra¥Features¥Base¥ghidra_scripts
(中略)
    C:¥tools¥ghidra_9.1.2¥Ghidra¥Processors¥PIC¥ghidra_scripts (HeadlessAnalyzer)
INFO HEADLESS: execution starts (HeadlessAnalyzer)
INFO Creating project: C:¥Ghidra¥headless_project (HeadlessAnalyzer)
INFO Creating project: C:¥Ghidra¥headless_project (DefaultProject)
INFO REPORT: Processing input files: (HeadlessAnalyzer)
INFO project: C:¥Ghidra¥headless_project (HeadlessAnalyzer)
INFO IMPORTING: C:¥Ghidra¥ch02¥downloader.exe (HeadlessAnalyzer)
INFO REPORT: Import succeeded with language "x86:LE:32:default" and cspec "windows" for file: C:¥Ghidra¥ch02
¥downloader.exe.gzf (HeadlessAnalyzer)
INFO ANALYZING all memory and code: C:¥Ghidra¥ch02¥downloader.exe (HeadlessAnalyzer)
INFO Packed database cache: C:¥Users¥john¥AppData¥Local¥Ghidra¥packed-db-cache (PackedDatabaseCache)
INFO Windows x86 PE RTTI Analyzer> Couldn't find type info structure.
(AutoAnalysisManager)
INFO -----------------------------------------------------
    ASCII Strings 0.724 secs
(中略)
    x86 Constant Reference Analyzer 1.833 secs
-----------------------------------------------------
     Total Time 14 secs
-----------------------------------------------------
(AutoAnalysisManager)
INFO REPORT: Analysis succeeded for file: C:¥Ghidra¥ch02¥downloader.exe (HeadlessAnalyzer)
INFO REPORT: Save succeeded for file: /downloader.exe (HeadlessAnalyzer)

 

151ページ コマンド4-4-8


(前略)
    # save to file
    with open(output, 'w') as fw:
        fw.write(psuedo_c)
        print('[*] success. save to -> {}'.format(output))

(後略)

(前略)
    # save to file
    with open(output, 'wb') as fw:
        fw.write(psuedo_c)
        print('[*] success. save to -> {}'.format(output))

(後略)
 

175ページ 1行目

11行目でencode_custom_base64関数を呼び出し、
10行目でencode_custom_base64関数を呼び出し、
 

カバー 裏表紙

解析スリプト開発など
解析スリプト開発など