判斷EXE是32bit or 64 bit

用google搜尋python的resource時

在這個網頁看到可以用python程式判斷所使用的exe是32bit or 64bit

http://www.alarmchang.com/wiki/index.php?title=Python_%E5%88%A4%E6%96%B7%E7%9B%AE%E5%89%8D%E7%9A%84_DLL_or_EXE_%E6%98%AF32bit_%E9%82%84%E6%98%AF_64bit

首先呢,我試過發現,不只是exe,其實dll和sys也是可以被判斷的


再來,我對如何找到這件事是挺有興趣的,

因為網頁裡的方法二,作的方法比較低階,所以有辦法追蹤


首先是

s=f.read(2)
if s!="MZ":

print "Not an EXE file"



這裡可以知道,檔案開頭的前兩個BYTE,是表示這檔案是不是EXE的標記,

如果是MZ,也就是0x4D 0x5A 的話 ,就是  EXE

反之則否


再來就是


f.seek(60)
    s=f.read(4)
    header_offset=struct.unpack(", s)[0]
    f.seek(header_offset+4)

這邊會先去到 檔案的第60的位址(0x3C),去尋找 IMAGE_NT_HEADERS 的位址(4 byte)

然後跳到 IMAGE_NT_HEADERS 去找到 offset 4的位置

這裡是IMAGE_FILE_HEADER的位址,

然後


s=f.read(2)
    machine=struct.unpack(", s)[0]

讀取IMAGE_FILE_HEADER的頭兩個BYTE,得到machine的值

利用這個machine值來判斷就可以了


以下列出structure的架構

typedef struct _IMAGE_NT_HEADERS {
  DWORD                 Signature;
  IMAGE_FILE_HEADER     FileHeader;
  IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;




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;



延伸閱讀


http://msdn.microsoft.com/en-us/library/ms680336%28VS.85%29.aspx

留言

這個網誌中的熱門文章

如何在VS2022 Community 簡要的設定UDK2018的環境

自製讀取 H 檔案並找出 define 的程式

如何Build UDK2018