寄り道して、エクスポート情報をダンプしてみる。エクスポート情報は、インポート情報よりも単純な作りになっている。ダンプAddressOfFunctionsは、エクスポートしたシンボルのアドレス(DWORD)の配列の先頭RVA。NumberOfFunctionsが配列の要素数。AddressOfNameOrdinalsは、エクスポートしたシンボル名と序数の配列の先頭RVA。NumberOfNamesが配列の要素数。AddressOfNamesの各要素は、シンボル名へのRVA(DWORD)になっている。AddressOfNameOrdinalsの各要素は、序数(WORD)になっている。エクスポートシンボルが別のDLLに転送(forwarding)される場合は、AddressOfFunctionsの該当シンボルのRVAが実行コードのアドレスではなく、IMAGE_EXPORT_DIRECTORY構造体と同じセクション内のRVAを指し、"モジュール名.シンボル名"で転送先のDLL名とシンボル名を指定するようになっている。それ以降について簡単に紹介する。構造体を取得この辺は見たまま。ベースアドレスに加算。あとは各メンバを16進ダンプ表示。False実際にEATを調べる。至まで頻出した定型パターンで、要素(今回はDWORD)の型分だけoffsetを増加していき、ctypesモジュールのmemmove()でメモリイメージをコピーしていく。ダンプするIMAGE_EXPORT_DIRECTORYのAddressOfNamesのRVAから、EATと同様にDWORDとして配列要素を辿っていく。name_rva.value)序数テーブルの方も、AddressOfNameOrdinalsから同様に辿っていく。サンプル、dll_lib.dllについてdumpbinの出力と比べてみる。序数テーブルについてはシンボル名の昇順、EATについては対応する序数の昇順に並んでいるように思われる。序数テーブルの要素数は、ENTと同じ数しか用意されていない。序数のみでエクスポートしたシンボルについては、ENTや序数テーブルには記録されない。dumpbinの出力結果を見ると、序数のみのエクスポートシンボルについては空いている序数を自動的に振られているようだ。"func1"というシンボルのアドレスを取得したい場合は・・・ENTを探索して、"func1"が3番目に見つかる。Baseを加算すると11)、つまりEAT[6]。/exports"の出力結果と一致する。"8"、つまりEAT[8]。/exports"の出力結果と一致する。/exports"と一致する。show_exports.pyの場合は「シンボル名<>序数<>アドレス」の対応付けまでは行っていない。/exports"であれば対応付けが済んだ一覧を表示してくれるので、実際はdumpbinの方が便利だろう。18:59:16md5:28d2d895cc015215eda5b3c1c6b3c265sha1:c56b3ea14bf7ba17a9fc697676c6bc791414ca0eコメントコメントを投稿するにはログインして下さい。Kamiyamane。