Подскажите можно ли средствами C#
языка узнать является ли файл .exe DotNet
или Native
? Без дополнительных библиотек и прочего)
Нашёл способ определить, проверил вроде работает нормально, чекал как натив файлы так и дотнетовские определяло всё как надо)
За основу взял Этот пример. Немного переделал его и получил такой код:
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; }
}
}
}
А так же нашёл ещё один способ проверки, поправьте если не прав)
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();
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
слишком медленный поиск данных в файлах, любая идея, как можно ускорить? в папке есть файлы, каждый файл имеет структуру:
есть дата в бд в формате 01-12-2018 мне нужно сортировать датуИспользовал вот такой вариант:
Отправляю сообщение через mail(), как проверить дошло ли оно? Существует ли такой адрес? https://2ipru/mail-checker/