判斷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
在這個網頁看到可以用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
留言