PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module;
- プロセスはOSが選択した特定のメモリ・アドレスにロードされます。プロセスのインスタンスハンドル
HMODULE
は、そのロードアドレスと同じです。これは、ロードアドレスの先頭に、プロセスのIMAGE_DOS_HEADER
構造体へのポインタを取得しています。
PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew);
e_lfanew
フィールドは、プロセスのIMAGE_NT_HEADERS
構造体にオフセットされます。これは〜BYTE*
ポインタをタイプキャストし、その値をe_lfanew
バイトだけインクリメントし、結果をIMAGE_NT_HEADERS*
にタイプキャストします。
PIMAGE_IMPORT_DESCRIPTOR pImgImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)pImgDosHeaders + pImgNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
- 上記と同じこと。
DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress
は、プロセスのImportsテーブルの最初のIMAGE_IMPORT_DESCRIPTOR
構造体のオフセットです。 pImgDosHeaders
がその数だけ増分されてから、IMAGE_IMPORT_DESCRIPTOR*
に型キャストされています。
for (IMAGE_IMPORT_DESCRIPTOR *iid = pImgImportDesc; iid->Name != NULL; iid++)
- これは、全体インポート・テーブルをループされます。
iid
はテーブル内の最初のディスクリプタを指しており、テーブルの末尾を示すName
が割り当てられていないディスクリプタが見つかるまで、ループはテーブル内を継続します。
詳細については、このMSDNの記事を読むことが** **設定されている場合は、次に行く
Peering Inside the PE: A Tour of the Win32 Portable Executable File Format
を。だから、それはすべてを超えています。 – rkapl
コードはPEヘッダーを解析しています。どこにも引っ掛けがなく、このストレッチでは低レベルでもありません。基本的なC構文についての質問は、スタックオーバーフローが使用されるものではありません。 – IInspectable
入力いただきありがとうございますが、これはどのように低レベルではありませんか?私はPEヘッダーをかなり低レベルで扱っているわけではありません。アセンブリと比較しない限り(私は本当に尋ねています、私はこれに慣れていません)。申し訳ありませんが、どのようなタイプのプログラミングでも、私の背景は高水準のJava/Web開発です。私はこのようなものを扱うつもりです。私はいくつかの事柄について基本的な説明/構文を取り扱っているここでたくさんの質問を見てきました。 – JimmySmithJR