如有错误之处 还请大家指出 以免误导他人。 学习Obj文件格式 说明:此Obj是指用我们VC或者masm等编译器编译源文件(.cpp .c .asm)产生的COFF(Common Object File Format)格式的Obj目标文件。而非网上漫天飞的什么3d的什么玩意,那个咱不懂~ (一)整体构架 IMAGE_SECTION_HEADER(多个) 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./assembly/07.html(他写的比我好多啦) By 看雪blueapplez 2010年10月3日9:35:53 排版部太好,貌似这样看很吃力,还是下载附件看吧 |
|