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      


排版部太好,貌似这样看很吃力,还是下载附件看吧

上传的附件 obj.doc