如有錯(cuò)誤之處 還請(qǐng)大家指出 以免誤導(dǎo)他人,。 學(xué)習(xí)Obj文件格式 說明:此Obj是指用我們VC或者masm等編譯器編譯源文件(.cpp .c .asm)產(chǎn)生的COFF(Common Object File Format)格式的Obj目標(biāo)文件,。而非網(wǎng)上漫天飛的什么3d的什么玩意,那個(gè)咱不懂~ (一)整體構(gòu)架 IMAGE_SECTION_HEADER(多個(gè)) Symbol表(字符串表,,symbol表重定位字符串?dāng)?shù)據(jù)的時(shí)候會(huì)用到) (二)詳解 ① IMAGE_FILE_HEADER結(jié)構(gòu),,從名字也猜個(gè)八九不離十 typedef struct _IMAGE_FILE_HEADER { WORD Machine; //一般我們的intel cpu是0x014c WORD NumberOfSections; //section 段個(gè)數(shù) DWORD TimeDateStamp; //一般是此文檔生成的時(shí)間 DWORD PointerToSymbolTable; //symbol table表的文件偏移地址(注意:本文的偏移一律指絕對(duì)偏移,RVA的概念在obj文件里用不到) DWORD NumberOfSymbols; //symbol表個(gè)數(shù) WORD SizeOfOptionalHeader; //0 no used in obj file WORD Characteristics; //0no used in obj file } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; ② IMAGE_SECTION_HEADER結(jié)構(gòu),,應(yīng)該非常熟悉才對(duì),,分析PE的基礎(chǔ) 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 個(gè)數(shù) WORD NumberOfLinenumbers; //unkonwn DWORD Characteristics; //section屬性 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; ③ 重定位信息頭IMAGE_RELOCATION typedef struct _IMAGE_RELOCATION { union { DWORD VirtualAddress; DWORD RelocCount; // }; //指相對(duì)于section內(nèi)容的偏移地址 DWORD SymbolTableIndex; //symbol表的索引 WORD Type; //這個(gè)指 類型我云里霧里的 暫時(shí)沒搞明白 //大俠知道的指點(diǎn)一下 //0x0060 代表 DIR32,0x0014 代表 REL32 具體是,、//啥自己體會(huì)吧 我體會(huì)不好 就不誤導(dǎo)別人了 } IMAGE_RELOCATION; typedef IMAGE_RELOCATION UNALIGNED *PIMAGE_RELOCATION; ④IMAGE_SYMBOL結(jié)構(gòu),,前面不是說過一個(gè)symbol表的索引嗎,就是指這個(gè)的索引 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; //存儲(chǔ)一個(gè)字符串,。如果太長了就令前4字節(jié)為0,,//后4字節(jié)保存一個(gè)偏移來指向字符串首地址,這//個(gè)偏移起始地址是string table DWORD Value; //通常為0 SHORT SectionNumber; //指向哪個(gè)section,,1為第一個(gè) WORD Type; //這個(gè)說不明白 BYTE StorageClass; //這個(gè)也很就麻煩不說了 BYTE NumberOfAuxSymbols; //指示后面還有幾個(gè)本結(jié)構(gòu)大小的buffer存儲(chǔ)數(shù)據(jù) } IMAGE_SYMBOL; typedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL; 說明:我并沒有找到哪一個(gè)結(jié)構(gòu)指示了string table的文件偏移,,那么我們姑且認(rèn)為string table的起始文件偏移為PointerToSymbolTable + NumberOfSymbols*sizeof(IMAGE_SYMBOL) 參考: http://www./assembly/07.html(他寫的比我好多啦) By 看雪blueapplez 2010年10月3日9:35:53 排版部太好,貌似這樣看很吃力,,還是下載附件看吧 |
|