タイトル/名前 | 更新者 | 更新日 |
---|---|---|
C言語系/memos/VC++/07, DLLのエクスポート転送(forwarding) | msakamoto-sf | 2010-06-04 09:04:43 |
C言語系/memos/VC++/05, モジュール定義ファイル(".DEF")とDLLのエクスポート | msakamoto-sf | 2010-06-02 15:17:53 |
日記/2010/05/31/PEファイルのインポート情報を表示するPython(作りかけ) | msakamoto-sf | 2010-06-01 22:00:31 |
日記/2010/05/31/PEファイルをメモリ上に「仮」ロードするPython(作りかけ) | msakamoto-sf | 2010-05-31 23:44:03 |
Python | msakamoto-sf | 2010-05-31 23:34:37 |
読書メモ/「APIで学ぶWindows徹底理解」/Part1-Part5 | msakamoto-sf | 2010-05-26 11:19:31 |
日記/2010/05/26/IMAGE_SECTION_HEADERを覗いてみる。 | msakamoto-sf | 2010-05-26 10:51:02 |
日記/2010/05/25/IMAGE_OPTIONAL_HEADERを覗いてみる。 | msakamoto-sf | 2010-05-25 20:34:16 |
日記/2010/05/25/IMAGE_NT_HEADERSとIMAGE_FILE_HEADERを覗いてみる。 | msakamoto-sf | 2010-05-25 19:47:44 |
日記/2010/05/25/PEフォーマットのIMAGE_DOS_HEADERを眺めてみる | msakamoto-sf | 2010-05-25 19:28:39 |
DLLにはエクスポートするシンボルの実体を別のDLLに転送(forward)する機能がある。例えばWindowsXP(SP3)上のKERNEL32.DLLのエクスポート情報を表示してみると、NTDLL.DLLへ転送されているシンボルがいくつか見つかる。
> dumpbin /exports c:\WINDOWS\System32\kernel32.dll ... 708 2C3 RtlCaptureContext (forwarded to NTDLL.RtlCaptureContext) 709 2C4 RtlCaptureStackBackTrace (forwarded to NTDLL.RtlCaptureStackBackTrace) 710 2C5 RtlFillMemory (forwarded to NTDLL.RtlFillMemory) 711 2C6 RtlMoveMemory (forwarded to NTDLL.RtlMoveMemory) 712 2C7 RtlUnwind (forwarded to NTDLL.RtlUnwind) 713 2C8 RtlZeroMemory (forwarded to NTDLL.RtlZeroMemory) ...
forwardingによるDLLの階層化やインポートライブラリの集約は、ライブラリやソースの構成・依存関係の整理に役立つだろう。
今回はモジュール定義ファイル(.def)を使ったDLLのforwardingを試してみる。
参考:
対象:Visual C++ 2008 Express Edition
> cl Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. > link Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved.
なお動作確認は Windows XP SP3 上で行っている。
DLL開発時に"__declspec(dllexport)"を使ってシンボルをエクスポートする例は C言語系/memos/VC++/04, Win32のEXE,LIB,DLL開発入門(C言語) 参照。
本記事では".DEF"ファイルを使ってシンボルをエクスポートする機能を試してみる。
参考MSDN(Express Edition):
対象:Visual C++ 2008 Express Edition
> cl Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. > link Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved.(全て表示する)
日記/2010/05/31/PEファイルをメモリ上に「仮」ロードするPython(作りかけ) の続き。
とりあえずインポート情報("Import Directory" Data Directory)を元にIAT(Import Address Table)とINT(Import Name Table)を取り出すことが出来た。序数でimportしたのとか、"Bound Import Directory"やDelayed DLL Loading使ってるのは未対応。
IATをダンプ・・・といっても、OSにロードされていないPEファイルの状態では、アドレステーブルの内容はINTのコピーになっているので見ても面白くない。
さすがに解説を加えないと(後で自分自身が)理解不能になりつつあるので、ソースを載せた後、ポイントとなる部分だけ解説しておく。
作りかけ。
に出てくる、PEヘッダー情報を基にして、実際にPEイメージがロードされた時と同様なレイアウトで、ヘッダーやセクションデータをメモリ上にコピーする箇所だけとりあえず作ってみようとした。
"APIで学ぶWindows徹底理解"のPart1 - Part5までの読書メモです。
この読書メモのスタンス、およびサンプルコードの入手については以下を参照して下さい。
読書メモ/「APIで学ぶWindows徹底理解」
日記/2010/05/25/IMAGE_OPTIONAL_HEADERを覗いてみる。の続き。IMAGE_FILE_HEADER.NumberOfSectionsの数だけ、IMAGE_NT_HEADERSの後ろに存在するIMAGE_SECTION_HEADERを読み込む。