exe 32 or 64
来源:互联网 发布:网络传播是指 编辑:程序博客网 时间:2024/05/29 19:42
首先介绍PE结构
Windows系统下的可执行文件,是基于Microsoft设计的一种新的文件结构,此结构被称之为PE结构。PE的意思是Portable Executable(可移植的执行体),所有Win32执行体都是用PE文件格式,其中包括SYS、DLL、EXE、COM、OCX等。(不管是学习逆向、破解还是安全,了解PE文件格式都是非常必要的。)PE文件的第一个部分是IMAGE_DOS_HEADER,大小为64B,这里面有两个重要的数据成员。第一个为e_magic,这个必须为MZ,即0x5A4D。当然,0x5A4D这是典型的小端格式(Little Endian);另一个重要的数据成员是最后一个成员e_lfanew,这个成员的值为IMAGE_NT_HEADERS的偏移。在IMAGE_DOS_HEADER和IMAGE_NT_HEADERS之间一个DOS Stub,这段程序用于在DOS环境中显示一个字符串,“This program cannot be run in DOS mode”,现在DOS早已灭绝,这段数据由编译器生成,可以用0填充或者删除(删除的话要移动很多数据)。PE Header 是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称,里边包含着许多PE装载器用到的重要字段。IMAGE_NT_HEADERS 结构的定义:
IMAGE_NT_HEADERS STRUCT
{
+0h DWORD Signature;
+4h IMAGE_FILE_HEADER FileHeader;
+18h IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS ENDS
Signature 字段:在一个有效的 PE 文件里,Signature 字段被设置为00004550h,ASCII 码字符是“PE00”。标志这 PE 文件头的开始。“PE00” 字符串是 PE 文件头的开始,DOS 头部的 e_lfanew 字段正是指向这里,如上图所示。
IMAGE_FILE_HEADER 结构定义:
typedef struct _IMAGE_FILE_HEADER
{
+04h WORD Machine; // 运行平台
+06h WORD NumberOfSections;// 文件的区块数目
+08h DWORD TimeDateStamp;// 文件创建日期和时间
+0Ch DWORD PointerToSymbolTable;// 指向符号表(主要用于调试)
+10h DWORD NumberOfSymbols;// 符号表中符号个数(同上)
+14h WORD SizeOfOptionalHeader;// IMAGE_OPTIONAL_HEADER32 结构大小
+16h WORD Characteristics; // 文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
(1)Machine:可执行文件的目标CPU类型。
IMAGE_FILE_MACHINE_I386 0x014c x86
IMAGE_FILE_MACHINE_IA64 0x0200 Intel Itanium
IMAGE_FILE_MACHINE_AMD64 0x8664 x64
(2)NumberOfSection: 区块的数目。(注:区块表是紧跟在 IMAGE_NT_HEADERS 后边的)
(3)TimeDataStamp: 表明文件是何时被创建的。
这个值是自1970年1月1日以来用格林威治时间(GMT)计算的秒数,这个值是比文件系统(FILESYSTEM)的日期时间更加精确的指示器。
提示:VC的话可以用_ctime 函数或者 gmtime 函数。
(4)PointerToSymbolTable: COFF 符号表的文件偏移位置,现在基本没用了。
(5)NumberOfSymbols: 如果有COFF 符号表,它代表其中的符号数目,COFF符号是一个大小固定的结构,如果想找到COFF 符号表的结束位置,则需要这个变量。
(6)SizeOfOptionalHeader: 紧跟着IMAGE_FILE_HEADER 后边的数据结构(IMAGE_OPTIONAL_HEADER)的大小。(对于32位PE文件,这个值通常是00E0h;对于64位PE32+文件,这个值是00F0h )。
(7)Characteristics: 文件属性,有选择的通过几个值可以运算得到。( 这些标志的有效值是定义于 winnt.h 内的 IMAGE_FILE_** 的值,具体含义见下表。普通的EXE文件这个字段的值一般是 0100h,DLL文件这个字段的值一般是 210Eh。)
2.然后我们通过读取PE文件的运行平台字段判断是32位还是64位
// 此程序判断一个exe是32还是64位的#include <stdio.h>#include <Windows.h>int CrnGetImageFileMachine(char *lpFileName);int main(){ printf("此程序用来判断一个exe是32还是64位的\n"); printf("请输入文件名:\n"); char szPath[MAX_PATH] = {0}; scanf("%s", &szPath); // GetModuleFileNameA(NULL, szPath, MAX_PATH); int n = CrnGetImageFileMachine(szPath); printf("此exe的位数是:"); if(n == 0x014C) printf("x86\n"); // 32bit else if(n == 0x0200) printf("IA64\n"); // 纯64bit else if(n == 0x8664) printf("x64\n"); // 64bit else printf("Unknow\n"); getchar(); return 0;}int CrnGetImageFileMachine(char *lpFileName){ IMAGE_DOS_HEADER idh; FILE *f = fopen(lpFileName, "rb"); fread(&idh, sizeof(idh), 1, f); IMAGE_FILE_HEADER ifh; fseek(f, idh.e_lfanew + 4, SEEK_SET); // 从文件头偏移 fread(&ifh, sizeof(ifh), 1, f); fclose(f); return ifh.Machine;}
- exe 32 or 64
- Python 判斷目前的 DLL or EXE 是32bit 還是 64bit
- cannot find the rxvt.exe or sh.exe binary 解决办法
- 进程文件: cidaemon or cidaemon.exe
- 解读SVCHOST.EXE 病毒or系统进程?
- redhat 32 or 64
- windows 32 or 64
- linux 64 or 32
- 32bit or 64bit
- linux check 32 or 64
- Adb connection Error" or "adb.exe 已停止工作
- mingw32-gcc.exe: error: CreateProcess: No such file or directory
- git-credential-winstore.exe": No such file or directory
- 内存创建exe,并借用svchost.exe(32 64都支持)执行我们的内存exe
- exe4j打包jar文件为exe文件出现的问题:The JAVA_HOME environment variable does not point to a working 32-bit JDK or
- 查看linux 32位or 64位
- 第一章 计算机系统漫游 32 or 64 ?
- 区分ubuntu 32bit or 64bit
- 精确度,召回率,真阳性,假阳性
- bigdecimal去除末尾多余的0 ,stripTrailingZeros()科学计数法解决
- Android values文件夹适配屏幕
- Java常见集合框架(三):List之List、AbstractList 、ArrayList
- 如何从零开始搭建高性能直播平台?
- exe 32 or 64
- MySQL day6---自定义函数
- shell的种类
- C#算法学习总结—冒泡排序
- PHP中序列化函数serialize($arr) 和反序列化函数unserialize($info)
- getchar输入EOF以及\n问题
- 乐信前端一面
- luogu1140 相似基因
- hibernateTemplate在Spring核心配置文件的注入问题