mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-07 19:18:19 +02:00
295 lines
6.3 KiB
C
295 lines
6.3 KiB
C
#pragma once
|
|
|
|
#include "BeefySysLib/Common.h"
|
|
|
|
struct CV_LVAR_ADDR_RANGE;
|
|
struct CV_LVAR_ADDR_GAP;
|
|
|
|
NS_BF_BEGIN
|
|
|
|
#define PE_SIZEOF_SHORT_NAME 8
|
|
#define PE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
|
|
#define PE_NUMBEROF_DIRECTORY_ENTRIES 16
|
|
#define PE_NT_SIGNATURE 0x00004550 // PE00
|
|
#define PE_DOS_SIGNATURE 0x5A4D // MZ
|
|
|
|
#define PE_MACHINE_X86 0x14c
|
|
#define PE_MACHINE_X64 0x8664
|
|
|
|
// DOS .EXE header
|
|
struct PEHeader
|
|
{
|
|
WORD e_magic; // Magic number
|
|
WORD e_cblp; // Bytes on last page of file
|
|
WORD e_cp; // Pages in file
|
|
WORD e_crlc; // Relocations
|
|
WORD e_cparhdr; // Size of header in paragraphs
|
|
WORD e_minalloc; // Minimum extra paragraphs needed
|
|
WORD e_maxalloc; // Maximum extra paragraphs needed
|
|
WORD e_ss; // Initial (relative) SS value
|
|
WORD e_sp; // Initial SP value
|
|
WORD e_csum; // Checksum
|
|
WORD e_ip; // Initial IP value
|
|
WORD e_cs; // Initial (relative) CS value
|
|
WORD e_lfarlc; // File address of relocation table
|
|
WORD e_ovno; // Overlay number
|
|
WORD e_res[4]; // Reserved words
|
|
WORD e_oemid; // OEM identifier (for e_oeminfo)
|
|
WORD e_oeminfo; // OEM information; e_oemid specific
|
|
WORD e_res2[10]; // Reserved words
|
|
LONG e_lfanew; // File address of new exe header
|
|
};
|
|
|
|
struct PEFileHeader
|
|
{
|
|
WORD mMachine;
|
|
WORD mNumberOfSections;
|
|
DWORD mTimeDateStamp;
|
|
DWORD mPointerToSymbolTable;
|
|
DWORD mNumberOfSymbols;
|
|
WORD mSizeOfOptionalHeader;
|
|
WORD mCharacteristics;
|
|
};
|
|
|
|
struct PEImportObjectHeader
|
|
{
|
|
WORD mSig1;
|
|
WORD mSig2;
|
|
WORD mVersion;
|
|
WORD mMachine;
|
|
DWORD mTimeDateStamp;
|
|
DWORD mDataSize;
|
|
WORD mHint;
|
|
WORD mType;
|
|
};
|
|
|
|
struct PEDataDirectory
|
|
{
|
|
DWORD mVirtualAddress;
|
|
DWORD mSize;
|
|
};
|
|
|
|
struct PEOptionalHeader32
|
|
{
|
|
//
|
|
// Standard fields.
|
|
//
|
|
|
|
WORD mMagic;
|
|
BYTE mMajorLinkerVersion;
|
|
BYTE mMinorLinkerVersion;
|
|
DWORD mSizeOfCode;
|
|
DWORD mSizeOfInitializedData;
|
|
DWORD mSizeOfUninitializedData;
|
|
DWORD mAddressOfEntryPoint;
|
|
DWORD mBaseOfCode;
|
|
DWORD mBaseOfData;
|
|
|
|
//
|
|
// NT additional fields.
|
|
//
|
|
|
|
DWORD mImageBase;
|
|
DWORD mSectionAlignment;
|
|
DWORD mFileAlignment;
|
|
WORD mMajorOperatingSystemVersion;
|
|
WORD mMinorOperatingSystemVersion;
|
|
WORD mMajorImageVersion;
|
|
WORD mMinorImageVersion;
|
|
WORD mMajorSubsystemVersion;
|
|
WORD mMinorSubsystemVersion;
|
|
DWORD mReserved1;
|
|
DWORD mSizeOfImage;
|
|
DWORD mSizeOfHeaders;
|
|
DWORD mCheckSum;
|
|
WORD mSubsystem;
|
|
WORD mDllCharacteristics;
|
|
DWORD mSizeOfStackReserve;
|
|
DWORD mSizeOfStackCommit;
|
|
DWORD mSizeOfHeapReserve;
|
|
DWORD mSizeOfHeapCommit;
|
|
DWORD mLoaderFlags;
|
|
DWORD mNumberOfRvaAndSizes;
|
|
PEDataDirectory mDataDirectory[16];
|
|
};
|
|
|
|
struct PEOptionalHeader64
|
|
{
|
|
//
|
|
// Standard fields.
|
|
//
|
|
|
|
WORD mMagic;
|
|
BYTE mMajorLinkerVersion;
|
|
BYTE mMinorLinkerVersion;
|
|
DWORD mSizeOfCode;
|
|
DWORD mSizeOfInitializedData;
|
|
DWORD mSizeOfUninitializedData;
|
|
DWORD mAddressOfEntryPoint;
|
|
DWORD mBaseOfCode;
|
|
|
|
//
|
|
// NT additional fields.
|
|
//
|
|
|
|
uint64 mImageBase;
|
|
DWORD mSectionAlignment;
|
|
DWORD mFileAlignment;
|
|
WORD mMajorOperatingSystemVersion;
|
|
WORD mMinorOperatingSystemVersion;
|
|
WORD mMajorImageVersion;
|
|
WORD mMinorImageVersion;
|
|
WORD mMajorSubsystemVersion;
|
|
WORD mMinorSubsystemVersion;
|
|
DWORD mReserved1;
|
|
DWORD mSizeOfImage;
|
|
DWORD mSizeOfHeaders;
|
|
DWORD mCheckSum;
|
|
WORD mSubsystem;
|
|
WORD mDllCharacteristics;
|
|
uint64 mSizeOfStackReserve;
|
|
uint64 mSizeOfStackCommit;
|
|
uint64 mSizeOfHeapReserve;
|
|
uint64 mSizeOfHeapCommit;
|
|
DWORD mLoaderFlags;
|
|
DWORD mNumberOfRvaAndSizes;
|
|
PEDataDirectory mDataDirectory[16];
|
|
};
|
|
|
|
struct PE_NTHeaders32
|
|
{
|
|
DWORD mSignature;
|
|
PEFileHeader mFileHeader;
|
|
PEOptionalHeader32 mOptionalHeader;
|
|
};
|
|
|
|
struct PE_NTHeaders64
|
|
{
|
|
DWORD mSignature;
|
|
PEFileHeader mFileHeader;
|
|
PEOptionalHeader64 mOptionalHeader;
|
|
};
|
|
|
|
struct PESectionHeader
|
|
{
|
|
char mName[IMAGE_SIZEOF_SHORT_NAME];
|
|
DWORD mVirtualSize;
|
|
DWORD mVirtualAddress;
|
|
DWORD mSizeOfRawData;
|
|
DWORD mPointerToRawData;
|
|
DWORD mPointerToRelocations;
|
|
DWORD mPointerToLineNumbers;
|
|
WORD mNumberOfRelocations;
|
|
WORD mNumberOfLineNumbers;
|
|
DWORD mCharacteristics;
|
|
};
|
|
|
|
#pragma pack(push, 1)
|
|
struct COFFRelocation
|
|
{
|
|
uint32 mVirtualAddress;
|
|
uint32 mSymbolTableIndex;
|
|
uint16 mType;
|
|
};
|
|
|
|
struct PE_SymInfo
|
|
{
|
|
union
|
|
{
|
|
char mName[8];
|
|
int32 mNameOfs[2];
|
|
};
|
|
|
|
int mValue;
|
|
uint16 mSectionNum;
|
|
uint16 mType;
|
|
int8 mStorageClass;
|
|
int8 mNumOfAuxSymbols;
|
|
};
|
|
|
|
struct PE_SymInfoAux
|
|
{
|
|
uint32 mLength;
|
|
uint16 mNumberOfRelocations;
|
|
uint16 mNumberOfLinenumbers;
|
|
uint32 mCheckSum;
|
|
uint16 mNumber;
|
|
uint8 mSelection;
|
|
char mUnused;
|
|
char mUnused2;
|
|
char mUnused3;
|
|
};
|
|
|
|
//struct COFFFrameDescriptor
|
|
//{
|
|
// int32 mOffset; // Offset 1st byte of function code
|
|
// int32 mSize; // bytes in function
|
|
// int32 mNumLocals; // # bytes in locals/4
|
|
// int16 mNumParams; // # bytes in params/4
|
|
// int16 mAttributes;
|
|
//
|
|
// // # bytes in prolog
|
|
// int GetPrologSize() const { return mAttributes & 0xF; }
|
|
//
|
|
// // # regs saved
|
|
// int GetNumSavedRegs() const { return (mAttributes >> 8) & 0x7; }
|
|
// bool HasSEH() const { return (mAttributes >> 9) & 1; }
|
|
// bool UseBP() const { return (mAttributes >> 10) & 1; }
|
|
//
|
|
// // cbFrame: frame pointer
|
|
// int GetFP() const { return mAttributes >> 14; }
|
|
//};
|
|
|
|
struct COFFFrameDescriptor
|
|
{
|
|
uint32 mRvaStart;
|
|
uint32 mCodeSize;
|
|
uint32 mLocalSize;
|
|
uint32 mParamsSize;
|
|
uint32 mMaxStackSize;
|
|
uint32 mFrameFunc;
|
|
uint16 mPrologSize;
|
|
uint16 mSavedRegsSize;
|
|
uint32 mFlags;
|
|
};
|
|
|
|
struct COFFFrameProgram
|
|
{
|
|
enum Command : uint8
|
|
{
|
|
Command_None,
|
|
Command_EIP,
|
|
Command_ESP,
|
|
Command_EBP,
|
|
Command_EAX,
|
|
Command_EBX,
|
|
Command_ECX,
|
|
Command_EDX,
|
|
Command_ESI,
|
|
Command_EDI,
|
|
Command_T0,
|
|
Command_T1,
|
|
Command_T2,
|
|
Command_T3,
|
|
Command_RASearch,
|
|
Command_Add,
|
|
Command_Subtract,
|
|
Command_Align,
|
|
Command_Set,
|
|
Command_Deref,
|
|
Command_Value,
|
|
Command_Value8
|
|
};
|
|
|
|
Command* mCommands;
|
|
};
|
|
|
|
struct COFFFrameDescriptorEntry
|
|
{
|
|
COFFFrameDescriptor* mFrameDescriptor;
|
|
COFFFrameProgram mProgram;
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
NS_BF_END
|