Как я могу определить, для которой платформы компилируется исполняемый файл?

Я не думаю, что можно получить как счетчик из графика api, вы должны использовать таблицу FQL link_stat . FQL не устарел.

50
задан halr9000 13 October 2008 в 15:16
поделиться

5 ответов

(из другого Q, после удаления)

Тип машины: это небольшой фрагмент кода, который я основал на некоторых, которые получают временную метку компоновщика. Это находится в том же заголовке, и кажется, что это работает - он возвращает I386 при компиляции -any cpu- и x64 при компиляции с этим в качестве целевой платформы.

Запись в блоге Exploring PE Headers (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;
}
25
ответ дан 7 November 2019 в 10:57
поделиться

Вам нужна функция GetBinaryType win32. Это возвратит соответствующие части исполняемого файла формата PE.

Как правило, Вы получите или SCS_32BIT_BINARY или SCS_64BIT_BINARY в поле BinaryType,

Alternativaly можно проверить сам формат PE для наблюдения, для какой архитектуры исполняемый файл компилируется.

поле IMAGE_FILE_HEADER.Machine будет иметь набор "IMAGE_FILE_MACHINE_IA64" для двоичных файлов IA64, IMAGE_FILE_MACHINE_I386 для 32-разрядного и IMAGE_FILE_MACHINE_AMD64 для 64-разрядного (т.е. x86_64).

существует статья MSDN Magazine, чтобы помочь Вам начать.

Приложение: Это может помочь Вам немного больше. Вы читаете двоичный файл как файл: проверьте, что первые 2 байта говорят "MZ", затем пропускают следующие 58 байтов и читают волшебное 32-разрядное значение на уровне 60 байтов в изображение (который равняется 0x00004550 для исполняемых файлов PE). Следующие байты этот заголовок , первые 2 байта которого говорят Вам, какая машина двоичный файл разработана для (0x8664 = x86_64, 0x0200 = IA64, 0x014c = i386).

(резюме: считайте байты 65 и 66 из файла для получения типа изображения)

11
ответ дан gbjbaanb 7 November 2019 в 20:57
поделиться
Assembly assembly = Assembly.LoadFile(Path.GetFullPath("ConsoleApplication1.exe"));
Module manifestModule = assembly.ManifestModule;
PortableExecutableKinds peKind;
ImageFileMachine machine;
manifestModule.GetPEKind(out peKind, out machine);

целевая машина должна тогда быть в машине.

Это будет только работать с блоками.NET все же.

8
ответ дан ICR 7 November 2019 в 20:57
поделиться

Я могу предложить ссылка на некоторый код C# для доступа к IMAGE_FILE_HEADER, который я думаю, мог быть (легко) скомпилирован в PowerShell cmdlet. Я довольно уверен, что Вы не можете использовать тот метод в сценарии PowerShell непосредственно, так как это испытывает недостаток в указателях и возможности PInvoke.

Однако необходимо быть в состоянии использовать Ваш к настоящему времени обширные знания формата заголовка PE;-), чтобы просто перейти "прямо" к правильным байтам и понять его. Это будет работа в сценарии PowerShell, и необходимо быть в состоянии просто преобразовать этот код C# от блога Tasos до сценария. Я не потружусь повторять код здесь, так как это не является моим.

1
ответ дан Jaykul 7 November 2019 в 20:57
поделиться

ОС Unix имеет утилиту, названную "файлом", который определяет файлы. Правила для идентификации сохранены в файле описания, названном "волшебством". Вы могли попробовать файл, чтобы видеть, в состоянии ли он определить Ваши файлы правильно и захватить соответствующие правила из волшебного файла.

0
ответ дан Sec 7 November 2019 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: