DLLを改造して関数を追加する時の注意点

DLLを改造して関数を追加する場合の注意事項です。
一見Dependency Walkerで正常なDLLに見えても動作しないことがあるので、調査してみました。


エクスポートテーブルは以下のようなフォーマットになっています。

エクスポートヘッダ
関数エントリーアドレス
関数名テーブル
アドレス
序数テーブル
ランタイム名と関数テーブル

オフセット サイズ 内容
+0000 DWORD 0
+0004 DWORD タイムスタンプ
+0008 DWORD 0(バージョン情報?)
+000C DWORD DLL名が格納されたアドレスを格納
+0010 DWORD 序数の開始値
+0014 DWORD 関数の数
+0018 DWORD 関数名の数
+001C DWORD 関数のエントリーアドレステーブルの
アドレスを格納
+0020 DWORD 関数名へのポインタテーブルを格納
+0024 DWORD 関数の序数配列(WORD型)の
テーブルアドレス

関数を追加した後の注意事項として以下のものがあります。

この序数名テーブルがアルファベット順に並んでいる必要があり、
そうでない関数は GerProcAddress で失敗するという落とし穴が実は存在します。

PEヘッダのオフセット +007c にはこのエクスポートテーブルのサイズが含まれ、サイズを変更した時にはここも書き換える必要があります。

PEヘッダの後ろにある再配置テーブルのサイズが実際と異なっていると、ブルースクリーンで落っこちることがあります。

コードを空領域に追加した場合、コードセクションのサイズを増加させるのを忘れないように。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です