2010.06.01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

MHI 5.0

この「にっき」には暴力シーンやグロテスクな表現が含まれています。

(2010.06.05)

$ EXEファイル識別プログラム

ノートPC の bin フォルダに、16bitの実行ファイルが未だに残っている。 古い PC の bin フォルダからコピーを延々と繰り返してきたからだ。 まぁ、一応、動くことは動くんだけれども、 動かす度にコンソール(ckw)がリサイズされたりして、 欝陶しいので、いい加減除去したい。

というわけで「EXEファイルの内部構造(PEヘッダ)(1/3):CodeZine」の記事を元にして、EXEファイルのタイプを識別するプログラムを書いてみた。

howexe.cpp (howexe.exe)

#include <windows.h>
#include <winnt.h>
#include <stdio.h>

int main(int argc,char **argv)
{
    for(int i=1;i<argc;i++){
        if( stricmp(".exe",argv[i]+strlen(argv[i])-4) != 0 ){
            printf("%s: skiped\n" , argv[i]);
            continue;
        }

        IMAGE_DOS_HEADER image_dos_header;
        IMAGE_NT_HEADERS32 image_nt_header32;
        FILE *fp=fopen(argv[i],"rb");

        if( fp == NULL ){
            perror( argv[i] );
            continue;
        }
        if( fread( &image_dos_header , sizeof(image_dos_header) , 1 , fp ) < 1 ){
            fprintf(stderr,"%s : DOS_HEADER broken.\n" , argv[i]);
        }else{
            printf("%s : %.2s" , argv[i] , &image_dos_header.e_magic );

            if( fseek( fp , image_dos_header.e_lfanew , SEEK_SET ) == 0 && 
                fread( &image_nt_header32 , sizeof(image_nt_header32) , 1 , fp ) >= 1 )
            {
                printf(" %.2s" , &image_nt_header32.Signature );
                if( image_nt_header32.FileHeader.Characteristics & 0x100 ){
                    printf(" 32bit");
                }
                switch( image_nt_header32.OptionalHeader.Subsystem ){
                    case 2:
                        printf(" GUI"); break;
                    case 3:
                        printf(" CUI"); break;
                    case 7:
                        printf(" CUI(Posix)"); break;
                    case 9:
                        printf(" WindowsCE"); break;
                }
            }
            putchar('\n');
        }
        fclose(fp);
    }
}

実行結果:

$ howexe.exe *.exe
_cat.exe : MZ MZ
_cp.exe : MZ MZ
_ls.exe : MZ MZ
_mv.exe : MZ MZ
_pwd.exe : MZ MZ
_rm.exe : MZ MZ
_tar.exe : MZ PE 32bit CUI
basename.exe : MZ MZ
BMP2IV.exe : MZ PE 32bit GUI
BMP2PNG.EXE : MZ PE 32bit CUI
bzip2.exe : MZ PE 32bit CUI
cal.exe : MZ MZ
Cassava.exe : MZ PE 32bit GUI
cdate.exe : MZ MZ
  (以下略)

やー、まじってる、まじってる(笑)。 Windows の 32bit 実行ファイルは二つ目のシグニチャが「PE」になってますね。 ちなみに OS/2 の nyaos.exe の場合:

$ howexe nyaos.exe
nyaos.exe : MZ LX

シグニチャは「LX」でした。うん、そういえば、そうだった。聞いたことがある、うん。

.net(3) C++(3) Cygwin(12) GAME(3) Groovy(1) Linux(2) Lua(39) Mercurial(13) NYAOS(92) OS/2(7) Oracle(3) Perl(4) Python(22) SKK(4) Windows8(1) album(68) ckw(10) coLinux(1) vim(6) wifky(27) 書評(21) (9)

zetamattaのたいじゅー