এর Magic
ক্ষেত্রটি IMAGE_OPTIONAL_HEADER
(যদিও উইন্ডোজ এক্সিকিউটেবল ইমেজগুলিতে হেডার সম্পর্কে aboutচ্ছিক কিছু নেই (ডিএলএল / এক্সই ফাইল)) আপনাকে পিই এর আর্কিটেকচারটি জানিয়ে দেবে।
এখানে একটি ফাইল থেকে আর্কিটেকচার দখল করার উদাহরণ।
public static ushort GetImageArchitecture(string filepath) {
using (var stream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
using (var reader = new System.IO.BinaryReader(stream)) {
//check the MZ signature to ensure it's a valid Portable Executable image
if (reader.ReadUInt16() != 23117)
throw new BadImageFormatException("Not a valid Portable Executable image", filepath);
// seek to, and read, e_lfanew then advance the stream to there (start of NT header)
stream.Seek(0x3A, System.IO.SeekOrigin.Current);
stream.Seek(reader.ReadUInt32(), System.IO.SeekOrigin.Begin);
// Ensure the NT header is valid by checking the "PE\0\0" signature
if (reader.ReadUInt32() != 17744)
throw new BadImageFormatException("Not a valid Portable Executable image", filepath);
// seek past the file header, then read the magic number from the optional header
stream.Seek(20, System.IO.SeekOrigin.Current);
return reader.ReadUInt16();
}
}
এই মুহুর্তে কেবলমাত্র দুটি আর্কিটেকচার ধ্রুবক:
0x10b - PE32
0x20b - PE32+
চিয়ার্স
আপডেট
আমি এই উত্তরটি পোস্ট করার পরে একটি সময় হয়ে গেছে, তবুও আমি এখনও দেখতে পাচ্ছি যে এটি এখন এবং বার কয়েকটি উর্ধ্বতন পেয়েছে তাই আমি বুঝতে পেরেছিলাম যে এটি আপডেট করার মতো। আমি একটি Portable Executable
চিত্রের আর্কিটেকচার পেতে একটি উপায় লিখেছি , যা এটি যেমনটি সংকলিত হয়েছে তা পরীক্ষা করে দেখুন AnyCPU
। দুর্ভাগ্যক্রমে উত্তরটি সি ++ এ রয়েছে, তবে কাঠামোগুলি সন্ধান করতে যদি আপনার কাছে কয়েক মিনিট থাকে তবে সি # তে পোর্ট করা খুব কঠিন হবে না WinNT.h
। লোকেরা আগ্রহী হলে আমি সি # তে একটি বন্দর লিখব, তবে লোকেদের আসলে এটি না চাইলে আমি এ সম্পর্কে জোর দিয়ে বেশি সময় ব্যয় করব না।
#include <Windows.h>
#define MKPTR(p1,p2) ((DWORD_PTR)(p1) + (DWORD_PTR)(p2))
typedef enum _pe_architecture {
PE_ARCHITECTURE_UNKNOWN = 0x0000,
PE_ARCHITECTURE_ANYCPU = 0x0001,
PE_ARCHITECTURE_X86 = 0x010B,
PE_ARCHITECTURE_x64 = 0x020B
} PE_ARCHITECTURE;
LPVOID GetOffsetFromRva(IMAGE_DOS_HEADER *pDos, IMAGE_NT_HEADERS *pNt, DWORD rva) {
IMAGE_SECTION_HEADER *pSecHd = IMAGE_FIRST_SECTION(pNt);
for(unsigned long i = 0; i < pNt->FileHeader.NumberOfSections; ++i, ++pSecHd) {
// Lookup which section contains this RVA so we can translate the VA to a file offset
if (rva >= pSecHd->VirtualAddress && rva < (pSecHd->VirtualAddress + pSecHd->Misc.VirtualSize)) {
DWORD delta = pSecHd->VirtualAddress - pSecHd->PointerToRawData;
return (LPVOID)MKPTR(pDos, rva - delta);
}
}
return NULL;
}
PE_ARCHITECTURE GetImageArchitecture(void *pImageBase) {
// Parse and validate the DOS header
IMAGE_DOS_HEADER *pDosHd = (IMAGE_DOS_HEADER*)pImageBase;
if (IsBadReadPtr(pDosHd, sizeof(pDosHd->e_magic)) || pDosHd->e_magic != IMAGE_DOS_SIGNATURE)
return PE_ARCHITECTURE_UNKNOWN;
// Parse and validate the NT header
IMAGE_NT_HEADERS *pNtHd = (IMAGE_NT_HEADERS*)MKPTR(pDosHd, pDosHd->e_lfanew);
if (IsBadReadPtr(pNtHd, sizeof(pNtHd->Signature)) || pNtHd->Signature != IMAGE_NT_SIGNATURE)
return PE_ARCHITECTURE_UNKNOWN;
// First, naive, check based on the 'Magic' number in the Optional Header.
PE_ARCHITECTURE architecture = (PE_ARCHITECTURE)pNtHd->OptionalHeader.Magic;
// If the architecture is x86, there is still a possibility that the image is 'AnyCPU'
if (architecture == PE_ARCHITECTURE_X86) {
IMAGE_DATA_DIRECTORY comDirectory = pNtHd->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR];
if (comDirectory.Size) {
IMAGE_COR20_HEADER *pClrHd = (IMAGE_COR20_HEADER*)GetOffsetFromRva(pDosHd, pNtHd, comDirectory.VirtualAddress);
// Check to see if the CLR header contains the 32BITONLY flag, if not then the image is actually AnyCpu
if ((pClrHd->Flags & COMIMAGE_FLAGS_32BITREQUIRED) == 0)
architecture = PE_ARCHITECTURE_ANYCPU;
}
}
return architecture;
}
ফাংশনটি একটি ইন-মেমোরি পিই ইমেজের পয়েন্টারটিকে গ্রহণ করে (যাতে আপনি এটি কীভাবে তা পান করতে পারেন তা আপনার বিষ চয়ন করতে পারেন; মেমরি-ম্যাপিং বা পুরো জিনিসটি মেমোরিতে পড়ুন ... যাই হোক না কেন)।