首页
社区
课程
招聘
[原创]学习OBJ文件格式
发表于: 2010-10-3 09:37 13923

[原创]学习OBJ文件格式

2010-10-3 09:37
13923

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直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可以哦。...
2010-10-3 09:54
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看来楼主要开始扭曲了
2010-10-3 10:18
0
雪    币: 8221
活跃值: (2806)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
嗯.不错..学习了...谢谢分享..
2010-10-3 10:21
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
哈哈  都是拜LTT所赐。。。
LTT乃神人也。。
2010-10-3 11:40
0
雪    币: 347
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个要学习,留个脚印

感谢分享
2010-10-3 18:17
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
难度好大 先收藏了再说
2010-10-3 18:29
0
雪    币: 5339
活跃值: (3739)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
8
恩,下来学习一下
2010-10-3 22:24
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
大家一起扭了,那就可以期待第一个扭曲加密变换还原器的诞生了。
2010-10-4 13:45
0
雪    币: 53
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
呵呵 这个经常见到,就是很少注意,学习下先,,,,,,,,
2010-10-4 13:57
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
高手,,,,,,,
2010-10-4 22:12
0
雪    币: 57
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
学习下先……
2010-10-7 09:35
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
13
这个东西是无法还原的  因为扭曲是从简单到复杂的过程   而从复杂到简单你就没法还原咯   可以参考LTT前辈的帖子
2010-10-8 18:47
0
雪    币: 563
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
收下了
2010-10-9 11:48
0
雪    币: 2347
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习了。
2010-10-9 15:17
0
游客
登录 | 注册 方可回帖
返回
//