Как проверить является ли файл .exe Native или DotNet?

184
10 февраля 2019, 20:50

Подскажите можно ли средствами C# языка узнать является ли файл .exe DotNet или Native ? Без дополнительных библиотек и прочего)

Answer 1

Нашёл способ определить, проверил вроде работает нормально, чекал как натив файлы так и дотнетовские определяло всё как надо)

За основу взял Этот пример. Немного переделал его и получил такой код:

using System;
using System.IO;
namespace PEChecker
{
    class Program
    {
        static void Main(string[] args)
        {
            if (IsManagedAssembly(args[0]))
            {
                Console.WriteLine("is DotNet");
            }
            else
            {
                Console.WriteLine("is Native");
            }
            Console.ReadKey();
        }
        public static bool IsManagedAssembly(string fileName)
        {
            try
            {
                using (Stream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                using (var binaryReader = new BinaryReader(fileStream))
                {
                    if (fileStream.Length < 0x40)
                    {
                        return false;
                    }
                    fileStream.Position = 0x3C;
                    uint peHeaderPointer = binaryReader.ReadUInt32();
                    if (peHeaderPointer == 0)
                    {
                        peHeaderPointer = 0x80;
                    }
                    if (peHeaderPointer > fileStream.Length - 0x100)
                    {
                        return false;
                    }
                    fileStream.Position = peHeaderPointer;
                    if (binaryReader.ReadUInt32() != 0x00004550)
                    {
                        return false;
                    }
                    fileStream.Position += 0x14;
                    const ushort PE32 = 0x10b;
                    const ushort PE32PLUS = 0x20b;
                    ushort peFormat = binaryReader.ReadUInt16();
                    if (peFormat != PE32 && peFormat != PE32PLUS)
                    {
                        return false;
                    }
                    fileStream.Position = (ushort)(peHeaderPointer + (peFormat == PE32 ? 0xE8 : 0xF8));
                    return binaryReader.ReadUInt32() == 0 ? false : true;
                }
            }
            catch { return false; }
        }
    }
}
Answer 2

А так же нашёл ещё один способ проверки, поправьте если не прав)

internal static bool IsDotNetAssembly(string peFile)
        {
            uint peHeader, peHeaderSignature, timestamp, pSymbolTable, noOfSymbol;
            ushort machine, sections, optionalHeaderSize, characteristics, dataDictionaryStart;
            uint[] dataDictionaryRVA = new uint[16];
            uint[] dataDictionarySize = new uint[16];
            using (Stream fs = new FileStream(peFile, FileMode.Open, FileAccess.Read))
            using (var reader = new BinaryReader(fs))
            {
                fs.Position = 0x3C;
                peHeader = reader.ReadUInt32();
                fs.Position = peHeader;
                peHeaderSignature = reader.ReadUInt32();
                machine = reader.ReadUInt16();
                sections = reader.ReadUInt16();
                timestamp = reader.ReadUInt32();
                pSymbolTable = reader.ReadUInt32();
                noOfSymbol = reader.ReadUInt32();
                optionalHeaderSize = reader.ReadUInt16();
                characteristics = reader.ReadUInt16();
                dataDictionaryStart = Convert.ToUInt16(Convert.ToUInt16(fs.Position) + 0x60);
                fs.Position = dataDictionaryStart;
                for (int i = 0; i < 15; i++)
                {
                    dataDictionaryRVA[i] = reader.ReadUInt32();
                    dataDictionarySize[i] = reader.ReadUInt32();
                }
                if (dataDictionaryRVA[14] == 0)
                {
                    Console.WriteLine("This is NOT a valid CLR File!!");
                    return false;
                }
                else
                {
                    Console.WriteLine("This is a valid CLR File..");
                    return true;
                }
            }

Вызывается так:

static void Main(string[] args)
{
  IsDotNetAssembly(args[0]);
  Console.ReadKey();
}
READ ALSO
поиск по файлам PHP (ускорить)

поиск по файлам PHP (ускорить)

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

205
Сравнение даты в php

Сравнение даты в php

есть дата в бд в формате 01-12-2018 мне нужно сортировать датуИспользовал вот такой вариант:

215
Как проверить отправлено ли сообщение php?

Как проверить отправлено ли сообщение php?

Отправляю сообщение через mail(), как проверить дошло ли оно? Существует ли такой адрес? https://2ipru/mail-checker/

211