PEファイルについて

PEファイルについての覚書

PEヘッダーのセクションについてはコチラ

オフセット 0x3Cからの4バイトはPEヘッダの開始位置を表している

Windowsの電卓プログラムのcalc.exe(32ビット・バージョン)を例に確認してみる。

d1.png
0x3Cの値は"D8 00 00 00"となっている。このバイトオーダーはリトルエンディアンなので、実際には"00 00 00 D8"となる。
つまり 0xD8

d2.png
オフセット 0xD8を見てみるとPEヘッダ(0x5045)が確認できる。

PEファイルを正しく実行するには0x3Cで示されているPEヘッダの開始位置と実際のPEヘッダの開始位置がマッチしている必要がある。

以下は一見するとランダムなファイルだが、よく見ると0x3Cの値が"D8 00 00 00"となっており、オフセット 0xD8を見てみるとPEヘッダが確認できる。
d3.png

d4.png

d5.png

なので、先頭バイトをMZ (0x4D5A)に書き換えればPEファイルとして実行可能になる。
d6.png

PEヘッダの開始位置+0x28はファイルのエントリーポイントを表している

Windowsの電卓プログラムのcalc.exe(32ビット・バージョン)を例に確認してみる。

d1.png
PEヘッダの開始位置は0xD8。そこに0x28を加算する。

py.png
0xD8 + 0x28は0x100

d7.png
オフセット 0x100の値は"6C 2D"となっている。このバイトオーダーはリトルエンディアンなので、実際には"2D 6C"となる。

olly.png
OllyDbgにcalc.exeをロードし、F9キーを押してデバッグを実行すると、00962D6Cに移動した。

参考

https://docs.microsoft.com/en-us/windows/win32/debug/pe-format
https://blog.kowalczyk.info/articles/pefileformat.html
https://en.wikibooks.org/wiki/X86_Disassembly/Windows_Executable_Files

Leave a Reply

Your email address will not be published. Required fields are marked *