#c# #portable-executable
#c# #переносимый-исполняемый
Вопрос:
Мне нужно получить доступ к этим полям в PeNet API. Однако возвращаемое значение равно a uint16
, и я на самом деле не знаю, что с этим делать. Кто-нибудь знает, как я буду обращаться к этим полям?
Я попытался получить доступ к этим полям, однако предоставленная структура не имеет очевидных (для меня) способов доступа к ним. Я также пытался распечатать uint16
по частям, но это также не дало ничего особенно очевидного (есть 8 полей для доступа, поэтому я подумал, что это может быть либо первые 8, либо последние 8, но это не увенчалось успехом).
Любая помощь была бы очень признательна, поскольку я понятия не имею, где искать дальше: (
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var peHeader1 = new PeNet.PeFile(@"C:WindowsSystem32kernel32.dll");
Console.WriteLine(peHeader1.ImageNtHeaders.OptionalHeader.DllCharacteristics.GetType());
Console.WriteLine(peHeader1.ImageNtHeaders.OptionalHeader.DllCharacteristics);
byte[] bytes = BitConverter.GetBytes(peHeader1.ImageNtHeaders.OptionalHeader.DllCharacteristics);
int bitPos = 0;
while (bitPos < 8 * bytes.Length)
{
int byteIndex = bitPos / 8;
int offset = bitPos % 8;
bool isSet = (bytes[byteIndex] amp; (1 << offset)) != 0;
Console.WriteLine(isSet);
bitPos ;
}
Console.ReadKey();
}
}
}
Ответ №1:
Я не уверен, что полностью понимаю вашу проблему, но здесь идет:
PeNet имеет enum
функцию, которая выглядит следующим образом:
[Flags]
enum OptionalHeaderDllCharacteristics : ushort
{
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE,
IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY,
IMAGE_DLLCHARACTERISTICS_NO_BIND,
IMAGE_DLLCHARACTERISTICS_NO_ISOLATION,
IMAGE_DLLCHARACTERISTICS_NO_SEH,
IMAGE_DLLCHARACTERISTICS_NX_COMPAT,
IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE,
IMAGE_DLLCHARACTERISTICS_WDM_DRIVER,
}
Вы каким-то образом получаете значение. Это значение должно быть приведено к перечислению:
Int16 value = 3; //This is the value you got somewhere
OptionalHeaderDllCharacteristics testEnum = (OptionalHeaderDllCharacteristics)value; //Cast it
После того, как вы его приведете, вы можете проверить наличие любого желаемого флага:
if (testEnum.HasFlag(OptionalHeaderDllCharacteristics.IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY))
{
//Do something
}