分享

[原创]学习OBJ文件格式

 羊玉wngbx 2020-04-22
如有错误之处  还请大家指出  以免误导他人。
学习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                       

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多