コンテンツ
1.実行可能ファイルを作成します
(1)Cプログラムを作成する
C:/に「test」という新しいフォルダを作成し、そのフォルダに「1.cpp」というテキストドキュメントを作成します。
このように:
ファイルを右クリックし、Notepad ++で編集します。次のようにコードを入力します。
#include<stdio.h>
int main (){
printf("Hello World!\n");
return 0;
}
ファイルを保存します。
(2)Cプログラムをコンパイルする
スタートメニューでVisualStudio2017の開発者のコマンドプロンプトを開きます。
「
cdC :\ test」を使用してファイルの場所C:\ testに切り替えます。次に、「cl1.cpp」を使用して1.cppをコンパイルします。
コマンド「1.exe」を使用して実行できます
。成功。
2.x32dbgを使用します
(1)x32dbgでPEヘッダーを見つけます
1.x32dbgを開きます。
2.開いたx32dbgに1.exeをドラッグします。3。F9
(実行)を押してファイル
4のエントリポイントに移動します。call 、jmpコマンドが表示されます。
5. F2キーを使用してブレークポイントをjmpコマンドに設定します。6。F9
(実行)を
押してこのブレークポイントまで続行します。7。F8(ステップオーバー)を押してプッシュ、プッシュ、プッシュ、呼び出しまで続行します
。8。呼び出しコマンドでF7(ステップに)
おめでとう!Cプログラム
9の主な機能が見つかりました。CTRL+ Mを押してメモリマップ
10に移動します。メモリセグメントのあるテーブルが表示されます。exeファイルの名前でメモリセグメントを見つけてダブルクリックします
。11。[ダンプ1]ウィンドウで、このセグメントの先頭が表示されます。PEヘッダー
12です。右クリックしてASCIIを表示します。
PE実行可能ファイル形式:
OLD EXE (MZ header)
+0 WORD e_magic; // Magic number MZ
2 WORD e_cblp; // Bytes on last page of file
4 WORD e_cp; // Pages in file
6 WORD e_crlc; // Relocations
8 WORD e_cparhdr; // Size of header in paragraphs
A WORD e_minalloc; // Minimum extra paragraphs needed
C WORD e_maxalloc; // Maximum extra paragraphs needed
E WORD e_ss; // Initial (relative) SS value
10 WORD e_sp; // Initial SP value
12 WORD e_csum; // Checksum
14 WORD e_ip; // Initial IP value
16 WORD e_cs; // Initial (relative) CS value
18 WORD e_lfarlc; // File address of relocation table
1A WORD e_ovno; // Overlay number
1C WORD e_res[4]; // Reserved words
24 WORD e_oemid; // OEM identifier (for e_oeminfo)
26 WORD e_oeminfo; // OEM information; e_oemid specific
28 WORD e_res2[10]; // Reserved words
3C DWORD e_lfanew; // File address of new exe header
:
:
\/
NEW EXE
+0 PE
4 WORD Machine;
6 WORD NumberOfSections;
8 DWORD TimeDateStamp;
C DWORD PointerToSymbolTable;
10 DWORD NumberOfSymbols;
14 WORD SizeOfOptionalHeader;
16 WORD Characteristics;
:
:
- 最初の2バイトがMZであることを確認します
- MZ位置からの0x3cオフセットに移動し、PEヘッダーのオフセット(たとえば、その0xF8)を見つけます。
- セグメントの先頭(MZのアドレス)に0xF8を追加し、そこでPE署名を確認します
(2)PEヘッダーの詳細
- フォーマットを見てください。ImageBaseのオフセットが0x34であることがわかります
NEW EXE
+0 PE
4 WORD Machine;
6 WORD NumberOfSections;
8 DWORD TimeDateStamp;
C DWORD PointerToSymbolTable;
10 DWORD NumberOfSymbols;
14 WORD SizeOfOptionalHeader;
16 WORD Characteristics;
18 Optional Header
18 WORD Magic;
1a UCHAR MajorLinkerVersion;
1b UCHAR MinorLinkerVersion;
1c DWORD SizeOfCode;
20 DWORD SizeOfInitializedData;
24 DWORD SizeOfUninitializedData;
28 DWORD AddressOfEntryPoint;
2c DWORD BaseOfCode;
30 DWORD BaseOfData; // // NT additional fields.
//
34 DWORD ImageBase;
-
PE署名位置に0x34オフセットを追加し、そこから4バイトの数値を取得します。これはImageBaseフィールド
です。実際の数を取得するには、これを逆にする必要があります。それは0135 0000です。ImageBaseが0135 0000であることを思い出してください。 -
PE署名位置に0x28オフセットを追加し、そこから4バイトの数値を取得します。これはEntryPointフィールドです。EntryPoint
のアドレスは0000 12 E1
であることがわかります。ImageBaseとEntryPoint、つまり01350000 + 000012E1を合計
します。CPUパネルをクリックし、Ctrl + Gを押して「01350000 + 000012E1」と入力します。
[OK]
を押します。EntryPointのアドレスを取得しました。 -
0x80オフセットに移動し、4バイトの数値を取得します。これはインポートディレクトリテーブル(IDT)アドレスです
-
ImageBaseをIDTに追加し、このメモリ位置に移動します。実際のIDTです。
更新予定…