linux静态库逆向分析,[原创]解析静态库(Lib)文件,提取出所有函数信息,组织成自定义格式文件...

附件:我现在是临时用户,附件限制太小了。要代码的,我直接mail吧目的:确定函数SIZE的方案还不够严谨,望牛人指教标准:《Microsoft可移植可执行文件和通用目标文件格式文件规范》,简称《PECOFF文件规范》注意:这里的LIB指的是静态库,要和编写DLL所生成的lib区别开来《PECOFF文件规范》中称静态库格式为:档案(库)文件格式,在WinNT.h中称Archiveformat...
摘要由CSDN通过智能技术生成

附件:我现在是临时用户,附件限制太小了。要代码的,我直接mail吧

目的:确定函数SIZE的方案还不够严谨,望牛人指教

标准:《Microsoft可移植可执行文件和通用目标文件格式文件规范》,简称《PE COFF文件规范》

注意:这里的LIB指的是静态库,要和编写DLL所生成的lib区别开来

《PE COFF文件规范》 中称静态库格式为:

档案(库)文件格式,在WinNT.h中称Archive format.

《PE COFF文件规范》 中称另一种Lib为:

导入库格式-是描述由一个映像导出供其它映像使用的符号的库

具体思路:

1.解析静态库(Lib)文件,提取出其中的所有目标文件成员(obj)

2.解析各个目标文件成员(obj),提取出其中的函数信息(函数名,函数数据,函数数据大小)

3.把提取出的函数信息,组织成自定义文件格式(flb)

函数库(.flb)文件格式: 签名-函数头表-函数名称段-函数数据段

一.解析静态库(Lib)文件,提取出其中的所有目标文件成员(obj)

1.静态库(Lib)文件结构

档案(库)文件(.lib)结构非常简单,就是签名+很多个成员,详细参见《PE COFF文件规范》第7节,或者看这里:http://dev.csdn.net/htmls/21/21543.html

签名,WinNT.h是这么定义的:

#define IMAGE_ARCHIVE_START_SIZE             8

#define IMAGE_ARCHIVE_START                  "!\n"

成员,是由头部和成员内容组成;WinNT.h是这么定义头部的:

typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {

BYTE     Name[16];         // File member name - `/' terminated.

BYTE     Date[12];         // File member date - decimal.

BYTE     UserID[6];        // File member user id - decimal.

BYTE     GroupID[6];       // File member group id - decimal.

BYTE     Mode[8];          // File member mode - octal.

BYTE     Size[10];         // File member size – 头部大小不计算在内.

BYTE     EndHeader[2];     // String to end header.

} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;

#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR      60

三个特别成员:第一链接器成员,第二链接器成员,长名称成员;(签名后面紧跟着的,就是这三个特别成员)

对于两个链接器成员,WinNT.h是这么定义它们头部的Name域的:

#define IMAGE_ARCHIVE_LINKER_MEMBER          "/               "

对于长名称成员,WinNT.h是这么定义它们头部的Name域的:

#define IMAGE_ARCHIVE_LONGNAMES_MEMBER       "//              "

目标文件成员(重点),三个特别成员之后直到文件结束,都是由这种目标文件成员组成。解析lib文件的本质就是解析它们,对于它们的头部Name域,有两种形式:

1.“名称/”

2.“/n”   当名称大小大于Name域的16个字节的话,就会存在长名称成员中;而n(十进制)就给出其名称位于长名称成员中的偏移

目标文件成员的内容,就是标准的目标文件(COFF格式)。

2.定位目标文件成员

解析lib文件的本质就是解析它们,它们是标准的目标文件格式,所有的函数信息都这里面;定位它们,是CLibParser这个类的工作。具体工作分为两步:

1.定位第一个目标文件成员。

2.遍历所有目标文件成员。

具体代码:

1.定位第一个目标文件成员

PBYTE CLibParser::GetF

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值