-
-
[原创]学习OBJ文件格式
-
发表于:
2010-10-3 09:37
13922
-
PE文件格式研究的人越来越多了,obj文件格式貌似一直是冷门,跟大家分享学习成果
如有错误之处 还请大家指出 以免误导他人。
学习Obj文件格式
说明:此Obj是指用我们VC或者masm等编译器编译源文件(.cpp .c .asm)产生的COFF(Common Object File Format)格式的Obj目标文件。而非网上漫天飞的什么3d的什么玩意,那个咱不懂~
(一)整体构架
IMAGE_FILE_HEADER
IMAGE_SECTION_HEADER(多个)
各个段的内容和重定位信息头(这个重定位信息头不一定每个段都有,貌似只有.text段才有,这个不太确定),此部分的偏移地址是由section头指定的。
Symbol表(字符串表,symbol表重定位字符串数据的时候会用到)
(二)详解
① IMAGE_FILE_HEADER结构,从名字也猜个八九不离十
typedef struct _IMAGE_FILE_HEADER {
WORD Machine; //一般我们的intel cpu是0x014c
WORD NumberOfSections; //section 段个数
DWORD TimeDateStamp; //一般是此文档生成的时间
DWORD PointerToSymbolTable; //symbol table表的文件偏移地址(注意:本文的偏移一律指绝对偏移,RVA的概念在obj文件里用不到)
DWORD NumberOfSymbols; //symbol表个数
WORD SizeOfOptionalHeader; //0 no used in obj file
WORD Characteristics; //0no used in obj file
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
② IMAGE_SECTION_HEADER结构,应该非常熟悉才对,分析PE的基础
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc; //no used in obj file
DWORD VirtualAddress;
DWORD SizeOfRawData; //大小
DWORD PointerToRawData; //偏移
DWORD PointerToRelocations; //relocations头 文件偏移
DWORD PointerToLinenumbers; //unknown
WORD NumberOfRelocations; //recolations 个数
WORD NumberOfLinenumbers; //unkonwn
DWORD Characteristics; //section属性
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
③ 重定位信息头IMAGE_RELOCATION
typedef struct _IMAGE_RELOCATION {
union {
DWORD VirtualAddress;
DWORD RelocCount; //
}; //指相对于section内容的偏移地址
DWORD SymbolTableIndex; //symbol表的索引
WORD Type; //这个指 类型我云里雾里的 暂时没搞明白
//大侠知道的指点一下
//0x0060 代表 DIR32,0x0014 代表 REL32 具体是、//啥自己体会吧 我体会不好 就不误导别人了
} IMAGE_RELOCATION;
typedef IMAGE_RELOCATION UNALIGNED *PIMAGE_RELOCATION;
④IMAGE_SYMBOL结构,前面不是说过一个symbol表的索引吗,就是指这个的索引
typedef struct _IMAGE_SYMBOL {
union {
BYTE ShortName[8];
struct {
DWORD Short; // if 0, use LongName
DWORD Long; // offset into string table
} Name;
PBYTE LongName[2];
} N; //存储一个字符串。如果太长了就令前4字节为0,//后4字节保存一个偏移来指向字符串首地址,这//个偏移起始地址是string table
DWORD Value; //通常为0
SHORT SectionNumber; //指向哪个section,1为第一个
WORD Type; //这个说不明白
BYTE StorageClass; //这个也很就麻烦不说了
BYTE NumberOfAuxSymbols; //指示后面还有几个本结构大小的buffer存储数据
} IMAGE_SYMBOL;
typedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL;
说明:我并没有找到哪一个结构指示了string table的文件偏移,那么我们姑且认为string table的起始文件偏移为PointerToSymbolTable + NumberOfSymbols*sizeof(IMAGE_SYMBOL)
参考:
http://www.mouseos.com/assembly/07.html(他写的比我好多啦)
By 看雪blueapplez
2010年10月3日9:35:53
排版部太好,貌似这样看很吃力,还是下载附件看吧
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课