いけむランド

はてダからやってきました

「PE 勉強会 (1)」に行ってきた


勉強会というよりかは「七誌先生の講義」って感じだったかな。個人的にはバイナリエディタで異常動作する PE をいじって正常に動くようにするあたりが+(0゚・∀・) + ワクテカ +でした。


途中で PE ファイルヘッダの話になった時にふと「この TimeDateStamp ってコンパイル時のタイムスタンプが入るの?」ということが気になったことを思い出したのでちょっと試してみた。

typedef struct _IMAGE_FILE_HEADER {
    WORD Machine;
    WORD NumberOfSections;
    DWORD TimeDateStamp;
    DWORD PointerToSymbolTable;
    DWORD NumberOfSymbols;
    WORD SizeOfOptionalHeader;
    WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;


cygwingcc でやってみる。

% uname -s
CYGWIN_NT-6.1
% echo 'int main(){}' > a.c
% gcc a.c -o 1.exe
% gcc a.c -o 2.exe
% md5sum.exe 1.exe 2.exe
907129d2a56fd3777ffa725588ba9498 *1.exe
38584a31ff69bb022abf0fc87afb3a31 *2.exe
--- /dev/fd/63  (objdump.exe -afhp 1.exe)
+++ /dev/fd/62  (objdump.exe -afhp 2.exe)
@@ -1,6 +1,6 @@

-1.exe:     file format pei-i386
-1.exe
+2.exe:     file format pei-i386
+2.exe
 architecture: i386, flags 0x0000013a:
 EXEC_P, HAS_DEBUG, HAS_SYMS, HAS_LOCALS, D_PAGED
 start address 0x00401000
@@ -11,7 +11,7 @@
        line numbers stripped
        32 bit words

-Time/Date              Mon Feb 21 23:14:35 2011
+Time/Date              Mon Feb 21 23:14:38 2011
 Magic                  010b    (PE32)
 MajorLinkerVersion     2
 MinorLinkerVersion     21
@@ -33,7 +33,7 @@
 Win32Version           00000000
 SizeOfImage            0000b000
 SizeOfHeaders          00000400
-CheckSum               00007171
+CheckSum               00007174
 Subsystem              00000003        (Windows CUI)
 DllCharacteristics     00008000
 SizeOfStackReserve     00200000


なんか CheckSum というのも独自別のヘッダにあるなあ。*1 それはさておき、そもそも何故、こんなことが気になったかというと、同じコンパイラおよびオプションでコンパイルしたバイナリが合致しないとなると、同じバイナリは二度とつくれないということになるのかなと思った次第。メーカーとかテストする時に手間とかどうなんだろとか余計なことを考えてみた。


【追記】本当にあったらしいw


ちなみに Mac OS X だと Mach-O がそういう情報を持たないのか、差分は出なかった。

% uname -s
Darwin
% echo 'int main(){}' > a.c
% gcc a.c -o 1.exe
% gcc a.c -o 2.exe
% gmd5sum a1.exe a2.exe 
dced646ad5ae2d7fbe4791a61c9bab23  a1.exe
dced646ad5ae2d7fbe4791a61c9bab23  a2.exe


Linux はすぐに使える環境は手元にないから、気が向いたらここに追記する。


あと、MacBook* でこの勉強会に参加する人は HugeDomains.com - LoadupDates.com is for sale (Loadup Dates)mingw ターゲットのクロスコンパイラを使うといいんじゃないかな。*2

*1:EXEファイルの内部構造(PEヘッダ) (2/3):CodeZine(コードジン)

*2:自分は VirtualBox 上の Windows 7 に CygwinPorts からインストールした i686-mingw32-gcc を使って課題を解いたけど、素人にはおすすめできない茨のセットアップの道だと思う。