x32dbgを使用してPEヘッダーを操作する


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を開きます。
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;
 :
 :
  1. 最初の2バイトがMZであることを確認します
    ここに画像の説明を挿入します
  2. MZ位置からの0x3cオフセットに移動し、PEヘッダーのオフセット(たとえば、その0xF8)を見つけます。
    ここに画像の説明を挿入します
  3. セグメントの先頭(MZのアドレス)に0xF8を追加し、そこでPE署名を確認します
    ここに画像の説明を挿入します

(2)PEヘッダーの詳細

  1. フォーマットを見てください。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; 
  1. PE署名位置に0x34オフセットを追加し、そこから4バイトの数値を取得します。これはImageBaseフィールド
    ここに画像の説明を挿入します
    です。実際の数を取得するには、これを逆にする必要があります。それは0135 0000です。ImageBaseが0135 0000であることを思い出してください。

  2. PE署名位置に0x28オフセットを追加し、そこから4バイトの数値を取得します。これはEntryPointフィールドです。EntryPoint
    ここに画像の説明を挿入します
    のアドレスは0000 12 E1
    であることがわかります。ImageBaseとEntryPoint、つまり01350000 + 000012E1を合計
    します。CPUパネルをクリックし、Ctrl + Gを押して「01350000 + 000012E1」と入力します。
    ここに画像の説明を挿入します
    [OK]
    ここに画像の説明を挿入します
    押します。EntryPointのアドレスを取得しました。

  3. 0x80オフセットに移動し、4バイトの数値を取得します。これはインポートディレクトリテーブル(IDT)アドレスです

  4. ImageBaseをIDTに追加し、このメモリ位置に移動します。実際のIDTです。

更新予定…

おすすめ

転載: blog.csdn.net/weixin_43529394/article/details/113175808