2017-10-04 7 views
-3

常に私を混乱させる)が、これは動作している方法は、というiidというポインタを作成していると思います。 iidIMAGE_IMPORT_DESCRIPTORを指し、pImgImportDescという名前のオブジェクトに等しく設定されます。だからpImgImportDescNameプロパティを見ていますが、設定されていない場合は次の設定に行きますか?だから基本的に、それは最後のものを探していますか?IMAGE_DOS_HEADERフック

また、このような低レベルのことについての書籍やビデオの推奨事項はありますか?コードを読んで私はすべて混乱しています。

+0

を。だから、それはすべてを超えています。 – rkapl

+1

コードはPEヘッダーを解析しています。どこにも引っ掛けがなく、このストレッチでは低レベルでもありません。基本的なC構文についての質問は、スタックオーバーフローが使用されるものではありません。 – IInspectable

+0

入力いただきありがとうございますが、これはどのように低レベルではありませんか?私はPEヘッダーをかなり低レベルで扱っているわけではありません。アセンブリと比較しない限り(私は本当に尋ねています、私はこれに慣れていません)。申し訳ありませんが、どのようなタイプのプログラミングでも、私の背景は高水準のJava/Web開発です。私はこのようなものを扱うつもりです。私はいくつかの事柄について基本的な説明/構文を取り扱っているここでたくさんの質問を見てきました。 – JimmySmithJR

答えて

5
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