从 PeNet 中的对象访问字段 API
Accessing fields from an object in the PeNet API
我需要访问 PeNet API 中的 these 个字段。但是返回的值是 uint16
,我实际上不知道如何处理它。有谁知道我将如何访问这些字段?
我已经尝试访问这些字段,但是所提供的结构没有明显的(对我来说)访问它们的方法。我也试过一点一点地打印出 uint16
但这也没有提供任何特别明显的东西(有 8 个字段要访问所以我认为它可能是前 8 个或最后 8 个但这是不成功的).
任何帮助将不胜感激,因为我不知道下一步该去哪里:(
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var peHeader1 = new PeNet.PeFile(@"C:\Windows\System32\kernel32.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] & (1 << offset)) != 0;
Console.WriteLine(isSet);
bitPos++;
}
Console.ReadKey();
}
}
}
我不确定我是否完全理解你的问题,但这里是:
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
}
我需要访问 PeNet API 中的 these 个字段。但是返回的值是 uint16
,我实际上不知道如何处理它。有谁知道我将如何访问这些字段?
我已经尝试访问这些字段,但是所提供的结构没有明显的(对我来说)访问它们的方法。我也试过一点一点地打印出 uint16
但这也没有提供任何特别明显的东西(有 8 个字段要访问所以我认为它可能是前 8 个或最后 8 个但这是不成功的).
任何帮助将不胜感激,因为我不知道下一步该去哪里:(
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var peHeader1 = new PeNet.PeFile(@"C:\Windows\System32\kernel32.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] & (1 << offset)) != 0;
Console.WriteLine(isSet);
bitPos++;
}
Console.ReadKey();
}
}
}
我不确定我是否完全理解你的问题,但这里是:
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
}