首页
社区
课程
招聘
[旧帖] [原创]lib文件格式分析,以及从lib文件提取obj的思路和源码 0.00雪花
2008-4-22 21:31 20920

[旧帖] [原创]lib文件格式分析,以及从lib文件提取obj的思路和源码 0.00雪花

2008-4-22 21:31
20920
最近在学习ida,有时候需要从lib文件里面提取sig,方便我们查看函数的名称。但是手工的办法只能一个个obj提取,虽然可以使用批处理,但是偶尔碰到错误的coff文件,还是需要人手工干预,所以写了这么一个小工具,顺带学习了一下lib文件的结构。

lib文件最开头,由8个字符串开始,值为“!<arch>\n”。接下来由4个不同类型的区段组成(不是四个区段),依次排列下来是First Section(一个), Second Section(一个), Long Section(一个), Obj Section(包含有多少个obj文件,就有多少个obj section)。

区段头都是以这样的一个结构体开始。

typedef struct
{
        char Name[16];      // 名称
        char Time[12];      // 时间
        char UserID[6];     // 用户ID
        char GroupID[6];    // 组ID
        char Mode[8];       // 模式
        char Size[10];      // 长度
        char EndOfHeader[2];// 结束符
} SectionHeader;

要从文件提取obj文件,我们一般只需要关注第二个区段。这个里面保存了如下的信息:
typedef struct
{
        unsigned long ObjNum;        // Obj Sec的数量
        unsigned long ObjOffset[x];  // 每一个Obj Sec的偏移
        unsigned long SymbolNum;     // 库中符号的数量
        unsigned short SymbolIdx[n]; // 符号在ObjOffset表中的索引
        char StrTable[m];            // 符号名称字符串表
}SecondSec;

但是我们却不能直接去读取他,因为
ObjOffset[x];  // 每一个Obj Sec的偏移
长度是不固定的,取决于
ObjNum;        // Obj Sec的数量

而且,first section的长度也是不固定的。这怎么办呢?

我的解决办法如下:
first section和second section都以
char szSecName[16] = {'/', 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,        0x20,0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
这样的形式开头。

我就定义了一个char,一个个字节去读取,遇到'/'就判断后面是不是15个0x20,如果读了2次这样的结构,那么说明到了second section,马上读后面的内容。这就是ObjNum,也就是obj的数量。

然后去申请一块内存,用来存储ObjOffset[x];  // 每一个Obj Sec的偏移
ULONG* m_offset = new ULONG[ObjNum],然后从文件里面将obj偏移读取到这个数组。

请注意,这些偏移值,并不是由小到大排列的,所以得自己排列一次。

用第二个偏移减去第一个偏移,得到的就是第一个obj section的大小(不是obj文件的大小)。因为每个obj section前面还有一个SectionHeader结构体,所以obj文件真正的偏移是:

读出来的偏移 offset + sizeof(SectionHeader),从这里开始读,才是obj文件的首地址。

下面的事情就简单了,一点点的写到各个文件,即可。

From:武汉科锐

代码在下面,没有使用多线程,所以obj文件过多的时候,运行的时候会稍慢,嘿嘿。有不正确的地方,或者有更好的算法,请多多指教!

http://img.jpg.name/twdwsdtjztwwthhyztswytttwrrwzwtrwtrrj.rar

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (6)
雪    币: 2576
活跃值: (447)
能力值: ( LV2,RANK:85 )
在线值:
发帖
回帖
粉丝
wyfe 2008-4-22 22:28
2
0
原来可以这样解决问题
雪    币: 225
活跃值: (439)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Jobcrazy 2008-4-23 18:24
3
0
重新上传了附件,免费空间不稳定啊
雪    币: 238
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
abxy 2008-4-24 09:18
4
0
多谢分享,刚好要用到,转一份本地
上传的附件:
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
katkat 2008-4-24 11:46
5
0
太感谢了,要学习学习了!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
billwangyj 2008-5-27 09:23
6
0
为什么测试说创建PCF进程失败呀
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
billwangyj 2008-5-27 09:36
7
0
知道了,谢谢,不错
游客
登录 | 注册 方可回帖
返回