C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: ファイル上のインポートセクション位置の割出し


(過去ログ 79 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■46936 / inTopicNo.1)  ファイル上のインポートセクション位置の割出し
  
□投稿者/ DD. (22回)-(2010/02/14(Sun) 23:11:52)

分類:[Windows 全般] 

お世話になります。DD.です。

EXE内のインポートセクションのファイル位置を知りたいのですが、どのように割出せばよいのかご教授頂けないでしょうか。

メモリ位置ならば、データディクショナリのRVAからアドレスを割出せるかと思いますが、
ファイル位置の割出し方法がわかりませんでした。

よろしくお願いします。

引用返信 編集キー/
■46938 / inTopicNo.2)  Re[1]: ファイル上のインポートセクション位置の割出し
□投稿者/ オショウ (518回)-(2010/02/14(Sun) 23:32:02)
No46936 (DD. さん) に返信
> EXE内のインポートセクションのファイル位置を知りたいのですが、どのように割出せばよいのかご教授頂けないでしょうか。

  http://codezine.jp/article/detail/413?p=2

  こういうことですか?

以上。
引用返信 編集キー/
■46939 / inTopicNo.3)  Re[2]: ファイル上のインポートセクション位置の割出し
□投稿者/ DD. (23回)-(2010/02/14(Sun) 23:48:49)
>   http://codezine.jp/article/detail/413?p=2
>
>   こういうことですか?
そちらは既に拝見させて頂いたのですが、
http://codezine.jp/article/detail/412?p=3
から、最初に記載の通り、データディクショナリ配列[IMAGE_DIRECTORY_ENTRY_IMPORT]のRVAからメモリ上のインポートセクションの位置を割出せることはわかったのですが、メモリにロードせず、ファイル上のインポートセクションの位置を割出したいと思っており、それをどのように行うのか?がわかりませんでした。

わたしが勘違いしている可能性もありますので、その場合はご指摘願えますでしょうか。
引用返信 編集キー/
■46941 / inTopicNo.4)  Re[1]: ファイル上のインポートセクション位置の割出し
□投稿者/ aetos (230回)-(2010/02/15(Mon) 00:47:17)
No46936 (DD. さん) に返信
> お世話になります。DD.です。
>
> EXE内のインポートセクションのファイル位置を知りたいのですが、どのように割出せばよいのかご教授頂けないでしょうか。
>
> メモリ位置ならば、データディクショナリのRVAからアドレスを割出せるかと思いますが、
> ファイル位置の割出し方法がわかりませんでした。
>
> よろしくお願いします。

インポートセクションというと紛らわしいので、IMAGE_IMPORT_DESCRIPTOR 構造体に倣って、以降「インポートデスクリプタ」と呼ぶことにします。
インポートデスクリプタのファイル上の位置を特定するには、まず、インポートデスクリプタを含むセクションを特定する必要があります。

IMAGE_SECTION_HEADER 構造体の VirtualAddress と VirtualSize から、インポートデスクリプタを含むセクションを探します。
このセクションは、メモリ上では VirtualAddress が指す位置に、ファイル上では PointerToRawData が指す位置にありますので、VirtualAddress - PointerToRawData を データディクショナリの RVA から引いてやれば、ファイル上での位置がわかります。

もっと簡単な方法としては、ImageDirectoryEntryToData 関数もあります。
この関数はメモリ上のイメージもファイルも両方対応しています。
引用返信 編集キー/
■47003 / inTopicNo.5)  Re[2]: ファイル上のインポートセクション位置の割出し
□投稿者/ DD. (25回)-(2010/02/15(Mon) 23:16:57)
> IMAGE_SECTION_HEADER 構造体の VirtualAddress と VirtualSize から、インポートデスクリプタを含むセクションを探します。
> このセクションは、メモリ上では VirtualAddress が指す位置に、ファイル上では PointerToRawData が指す位置にありますので、VirtualAddress - PointerToRawData を データディクショナリの RVA から引いてやれば、ファイル上での位置がわかります。
なるほど。
IMAGE_SECTION_HEADER 構造体から「インポートデスクリプタを含むセクション」の判断にNameメンバが".idata"かどうかで比較しようとしていたのですが、必ずしも".idata"でなかったらと考えていました。
アドレスで判断すればいいんですね。

> もっと簡単な方法としては、ImageDirectoryEntryToData 関数もあります。
> この関数はメモリ上のイメージもファイルも両方対応しています。
勉強がてらでしたので、上記APIは使わずに自力でやろうとしてました。

ありがとうございます。解決とさせてもらいます。
解決済み
引用返信 編集キー/
■47173 / inTopicNo.6)  Re[3]: ファイル上のインポートセクション位置の割出し
□投稿者/ DD. (26回)-(2010/02/19(Fri) 22:48:36)
お世話になります。DD.です。

一旦〆させてもらったのですが、同じタイトルのまま再度質問させて下さい。

新スレを立てるか悩んだのですが、質問事項が同内容であり、
後ほど参考にされる方に、スレッドが同一のほうが参照しやすいだろうと思いまして。

質問内容ですが、
前回頂いた回答から、インポートセクションの割出しは行えました。
ただ、私が検証を行ったのはDEBUGビルドで作成したEXEで、RELEASEビルドで作成したEXEでは、そもそも".idata"セグメントを指す、
IMAGE_SECTION_HEADER 構造体が見つかりませんでした。

(ただ、当然ながらバイナリエディタで確認すれば、EXE内にはDLL名やインポート関数名は存在し、
データディクショナリにはインポートセクションへのRVAが書かれていました。)

これにより、インポートセクションへのPointerToRawDataが見つからずアクセスができませんでした。

なぜRELEASEビルドではDEBUGビルド時に存在した".idata"セグメントが見つからなかったのか?
この場合は、どのようにインポートセクションを割出せばよいのでしょうか?

よろしくお願いします。
引用返信 編集キー/
■47175 / inTopicNo.7)  Re[4]: ファイル上のインポートセクション位置の割出し
□投稿者/ aetos (236回)-(2010/02/19(Fri) 23:57:17)
2010/02/20(Sat) 08:13:28 編集(投稿者)

No47173 (DD. さん) に返信
> 前回頂いた回答から、インポートセクションの割出しは行えました。
> ただ、私が検証を行ったのはDEBUGビルドで作成したEXEで、RELEASEビルドで作成したEXEでは、そもそも".idata"セグメントを指す、
> IMAGE_SECTION_HEADER 構造体が見つかりませんでした。
>
> (ただ、当然ながらバイナリエディタで確認すれば、EXE内にはDLL名やインポート関数名は存在し、
> データディクショナリにはインポートセクションへのRVAが書かれていました。)
>
> これにより、インポートセクションへのPointerToRawDataが見つからずアクセスができませんでした。
>
> なぜRELEASEビルドではDEBUGビルド時に存在した".idata"セグメントが見つからなかったのか?
> この場合は、どのようにインポートセクションを割出せばよいのでしょうか?
>
> よろしくお願いします。

最適化によるためです。おそらく .text セクションにあると思います。
.idata セクションがなくても、IMAGE_IMPORT_DESCRIPTOR はデータディクショナリが指す位置にあり、それは何らかの(おそらくは .text)セクションに含まれています。
ちょっと前回の投稿で言葉が足りなかったかもしれません。
IMAGE_SECTION_HEADER を探す方法は、

1:IMAGE_FIRST_SECTION マクロで最初のセクションヘッダの位置を求める
2:セクションは IMAGE_FILE_HEADER::NumberOfSections の数だけあるので、この回数分ループし、そのそれぞれにおいて
3:IMAGE_SECTION_HEADER::VirtualAddress <= IMAGE_DATA_DIRECTORY::VirtualAddress かつ
  IMAGE_SECTION_HEADER::VirtualAddress + IMAGE_SECTION_HEADER::VirtualSize >= IMAGE_DATA_DIRECTORY::VirtualAddress + IMAGE_DATA_DIRECTORY::Size
  となるセクションを探す

となります。
あとは前回書いた通り、
 IMAGE_DATA_DIRECTORY::VirtualAddress - ( IMAGE_SECTION_HEADER::VirtualAddress - IMAGE_SECTION_HEADER::PointerToRawData )
が、ファイル上でのインポートデスクリプタ(IMAGE_IMPORT_DESCRIPTOR)の位置になります。
引用返信 編集キー/
■47178 / inTopicNo.8)  Re[5]: ファイル上のインポートセクション位置の割出し
□投稿者/ DD. (27回)-(2010/02/20(Sat) 00:20:05)
回答ありがとうございます。

範囲で求めろということだったんですね。。。理解が足らず、すいません。
IMAGE_SECTION_HEADER::VirtualAddress == IMAGE_DATA_DIRECTORY::VirtualAddressとピンポイントで検索してました。

ありがとうございます。

今度こそ本当に解決で。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -