📄 coff.h
字号:
#ifndef _COFF_H_
#define _COFF_H_
/* Coff Header */
typedef struct _FILEHDR{
unsigned short usMagic; // 魔法数字
unsigned short usNumSec; // 段落(Section)数
unsigned long ulTime; // 时间戳
unsigned long ulSymbolOffset; // 符号表偏移
unsigned long ulNumSymbol; // 符号数
unsigned short usOptHdrSZ; // 可选头长度
unsigned short usFlags; // 文件标记
} FILEHDR, FileHeader, *pFileHeader;
#define F_RELFLG 0x0001 // 无重定位信息标记。
#define F_EXEC 0x0002 // 可执行标记
#define F_LNNO 0x0004 // 文件中所有行号已经被去掉
#define F_LSYMS 0x0008 // 文件中的符号信息已经被去掉。
#define F_AR32WR 0x0100 // 无
#define IS_OBJ( flag ) (!(flag&(F_EXEC|F_LSYMS)))
#define IS_EXE( flag ) ( flag&F_EXEC )
//可选头部
typedef struct _IMAGE_OPTIONAL_HEADER {
// 标准域
USHORT Magic;
UCHAR MajorLinkerVersion;
UCHAR MinorLinkerVersion;
ULONG SizeOfCode;
ULONG SizeOfInitializedData;
ULONG SizeOfUninitializedData;
ULONG AddressOfEntryPoint;
ULONG BaseOfCode;
ULONG BaseOfData;
// NT附加域
ULONG ImageBase;
ULONG SectionAlignment;
ULONG FileAlignment;
USHORT MajorOperatingSystemVersion;
USHORT MinorOperatingSystemVersion;
USHORT MajorImageVersion;
USHORT MinorImageVersion;
USHORT MajorSubsystemVersion;
USHORT MinorSubsystemVersion;
ULONG Reserved1;
ULONG SizeOfImage;
ULONG SizeOfHeaders;
ULONG CheckSum;
USHORT Subsystem;
USHORT DllCharacteristics;
ULONG SizeOfStackReserve;
ULONG SizeOfStackCommit;
ULONG SizeOfHeapReserve;
ULONG SizeOfHeapCommit;
ULONG LoaderFlags;
ULONG NumberOfRvaAndSizes;
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER, OptionalHeader, *POptionalHeader;
//Import dir entry
typedef struct ImageImportEntry{
char Name; //名
unsigned char Flag; //Public or Private loaded
unsigned short FileVersion; //
unsigned long Address; //load at this address
}ImportEntry, *PImportEntry;
//目录
typedef struct ImageDirecotry{
unsigned char Type; //类型
union{
struct ImageImportEntry *ImportEntry;
}e;
}ImageDir, *PImageDir;
typedef struct _SECHDR{
char cName[8]; // 段名
unsigned long ulVSize; // 虚拟大小
unsigned long ulVAddr; // 虚拟地址
unsigned long ulSize; // 段长度
unsigned long ulSecOffset; // 段数据偏移
unsigned long ulRelOffset; // 段重定位表偏移
unsigned long ulLNOffset; // 行号表偏移
unsigned short ulNumRel; // 重定位表长度
unsigned short ulNumLN; // 行号表长度
unsigned long ulFlags; // 段标识
} SECHDR, SecHdr, *PSecHdr;
#define STYP_TEXT 0x0020 //正文段标识,说明该段是代码。
#define STYP_DATA 0x0040 //数据段标识,有些标识的段将用来保存已初始化数据。
#define STYP_BSS 0x0080 //有这个标识段也是用来保存数据,不过这里的数据是未初始化数据。
typedef struct __attribute__((packed)){
unsigned long ulAddr; // 定位偏移
unsigned long ulSymbol; // 符号
unsigned short usType; // 定位类型
} RELOC, Relocation, *PRelocation;
#define RELOC_ADDR32 6 //32位绝对定位
#define RELOC_REL32 0x14 //32位相对定位
typedef struct __attribute__((packed)){
union {
char cName[8]; // 符号名称
struct {
unsigned long ulZero; // 字符串表标识
unsigned long ulOffset; // 字符串偏移
} e;
} e;
unsigned long ulValue; // 符号值
short iSection; // 符号所在段
unsigned short usType; // 符号类型
unsigned char usClass; // 符号存储类型
unsigned char usNumAux; // 符号附加记录数
} SYMENT, SymbolEntry, *PSymbolEntry;
#define SYM_CLASS_NULL 0 //无存储类型。
#define SYM_CLASS_AUTOMATIC 1 //自动类型。通常是在栈中分配的变量。
#define SYM_CLASS_EXTERNAL 2 //外部符号。当为外部符号时,iSection的值应该为0,如果不为0,则ulValue为符号在段中的偏移。
#define SYM_CLASS_STATIC 3 //静态类型。ulValue为符号在段中的偏移。如果偏移为0,那么这个符号代表段名。。
#define SYM_CLASS_REGISTER 4 //寄存器变量。
#define SYM_CLASS_MEMBER_OF_STRUCT 8 //结构成员。ulValue值为该符号在结构中的顺序。
#define SYM_CLASS_STRUCT_TAG 10 //结构标识符。
#define SYM_CLASS_MEMBER_OF_UNION 11 //联合成员。ulValue值为该符号在联合中的顺序。
#define SYM_CLASS_UNION_TAG 12 //联合标识符。
#define SYM_CLASS_TYPE_DEFINITION 13 //类型定义。
#define SYM_CLASS_FUNCTION 101 //函数名。
#define SYM_CLASS_FILE 102 //文件名。
#endif //_COFF_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -