hal*_*000 50 c# powershell cpu-architecture
我需要使用为x86,x64和IA64制作的Windows可执行文件.我想通过检查文件本身以编程方式找出平台.
我的目标语言是PowerShell,但C#示例可以.如果您知道所需的逻辑很好,那么其中任何一个都会失败.
Kei*_*ill 38
如果安装了Visual Studio,则可以使用dumpbin.exe.PowerShell社区扩展中还有Get-PEHeadercmdlet ,可用于测试可执行映像.
Dumpbin会将DLL报告为machine (x86)或machine (x64)
Get-PEHeader将DLL报告为PE32或PE32+
And*_*ker 25
(来自另一个Q,自从删除)
机器类型:这是一些快速的代码我基于一些获取链接器时间戳的代码.这是在相同的标题中,它似乎工作 - 当编译-any cpu-时它返回I386,而当使用它作为目标平台编译时返回x64.
探索PE标题(K. Stanton,MSDN)博客文章向我展示了偏移,正如另一个回应所指出的那样.
public enum MachineType {
Native = 0, I386 = 0x014c, Itanium = 0x0200, x64 = 0x8664
}
public static MachineType GetMachineType(string fileName)
{
const int PE_POINTER_OFFSET = 60;
const int MACHINE_OFFSET = 4;
byte[] data = new byte[4096];
using (Stream s = new FileStream(fileName, FileMode.Open, FileAccess.Read)) {
s.Read(data, 0, 4096);
}
// dos header is 64 bytes, last element, long (4 bytes) is the address of the PE header
int PE_HEADER_ADDR = BitConverter.ToInt32(data, PE_POINTER_OFFSET);
int machineUint = BitConverter.ToUInt16(data, PE_HEADER_ADDR + MACHINE_OFFSET);
return (MachineType)machineUint;
}
Run Code Online (Sandbox Code Playgroud)
gbj*_*anb 11
您需要GetBinaryType win32函数.这将返回PE格式可执行文件的相关部分.
通常,您将在BinaryType字段中获得SCS_32BIT_BINARY或SCS_64BIT_BINARY,
另外,您可以检查PE格式本身,以查看可执行文件的编译体系结构.
IMAGE_FILE_HEADER.Machine字段将为IA64二进制文件设置"IMAGE_FILE_MACHINE_IA64",为32位设置IMAGE_FILE_MACHINE_I386,为64位设置IMAGE_FILE_MACHINE_AMD64(即x86_64).
有一篇MSDN杂志的文章可以帮助你开始.
附录:这可能对你有所帮助.您将二进制文件读作文件:检查前两个字节是否为"MZ",然后跳过接下来的58个字节,并将60字节的魔术32位值读入图像(对于PE可执行文件,它等于0x00004550).以下字节是此标头,其前2个字节告诉您二进制设计的机器(0x8664 = x86_64,0x0200 = IA64,0x014c = i386).
(执行摘要:读取文件的字节65和66以获取图像类型)
mre*_*lva 11
根据“确定应用程序是为32位还是64位编译的10种方法” ,您可以通过用记事本PE打开它并在开头查找- if来检查DLL或EXE是32位还是64位之后的第三个字母是:
L是 32 位的:

d平台是 64 位:

我在我的 DLL 上尝试过,它似乎是准确的。
Assembly assembly = Assembly.LoadFile(Path.GetFullPath("ConsoleApplication1.exe"));
Module manifestModule = assembly.ManifestModule;
PortableExecutableKinds peKind;
ImageFileMachine machine;
manifestModule.GetPEKind(out peKind, out machine);
Run Code Online (Sandbox Code Playgroud)
然后目标机器应该在机器中.
这只适用于.NET程序集.
| 归档时间: |
|
| 查看次数: |
30589 次 |
| 最近记录: |