lib静态库逆向分析

当我们要分析一个lib库里的代码时,首先需要判断这是一个静态库还是一个导入库。

库类型判断

lib文件其实是一个压缩文件。

我们可以直接使用7z打开lib文件,以查看里面的内容。

如果里面的内容是obj文件,表明是静态库。

如果里面的内容是dll文件,表明是导入库。导入库里面是不包含代码的,代码包含在对应的dll文件中。

从lib中提取obj

静态库是一个或者多个obj文件的打包,这里有两个方法从中提取obj:

  • Microsoft 库管理器
  • 7z解压

Microsoft 库管理器(lib.exe)

Microsoft 库管理器 (lib.exe) 用于创建和管理lib文件。

lib.exe随VS默认安装。

为了方便,可以先将在cmd.exe中运行如下脚本:

VS安装目录\Microsoft Visual Studio 12.0\VC\Bin\VCVARS32.BAT

之后在该cmd.exe中使用lib.exe就不需要输入完整路径了。(注:这里只是添加当前cmd进程的环境变量,在另一个cmd中使用lib.exe,仍然需要使用完整路径)

提取obj需要分两步:

1、查看lib里面的obj信息:

lib /list xxx.lib > liblist.txt
lib /list:liblist.txt xxx.lib

2、从lib中提取obj:

lib xxx.lib /extract:\Release\xxx.obj      #\Release\xxx.obj是从liblist.txt中读出的

7z解压

直接使用7-zip对lib文件进行解压。

推荐使用这种方法,更为简单。并且能一次获得所有obj文件。

解压后还有可能得到一个txt文件,里面是所有obj文件的列表,以及obj文件提供的函数的原型。

逆向分析obj

obj为COFF格式的文件。

这里要使用VS提供的工具dumpbin.exe,该工具和lib.exe位于同一目录。

和lib.exe一样,为了方便,同样可以先将该目录加入当前cmd进程的环境变量,运行如下脚本:

VS安装目录\Microsoft Visual Studio 12.0\VC\Bin\VCVARS32.BAT

该工具可以查看obj基本信息:

dumpbin /all xxx.obj > xxxobj_info.txt

也可以反汇编obj:

dumpbin.exe /disasm xxx.obj > xxxobj_asm.txt   

但dumpbin不一定能得到想要的结果,运行dumpbin后就,可能会提示未知的对象类型:

File Type: ANONYMOUS OBJECT

这是由于程序在编译时使用了/GL优化选项,该优化会使dumpbin功能失效。

那么使用/GL优化选项的lib该如何逆向分析呢?在网上没有搜索到答案,我暂时使用了一种曲线救国的方法:源程序调用法。

源程序调用法逆向lib

从上面获得的lib信息中,我们可以获得lib里的obj都提供了哪些函数。

我们完全可以开发一个小程序来调用obj提供的函数,主要分三步:

1、编写.h文件,文件名要和lib里的obj文件名相同。

2、确定函数原型。比如我们要调用a.obj里面的b函数,我们使用文本编辑器打开从lib里提取的a.obj,在里面搜索函数名b,会找到VS编译后的修饰名,形如“?b@@YAHIJ@Z”。这个修饰名包含函数原型的所有信息,我们需要根据修饰名还原函数原型并在.h文件中声明该函数。关于修饰名的内容可以查看这篇博客。

3、编写主cpp文件,包含上面创建的头文件,引入lib库,并在主函数中调用要逆向分析的函数b。

#pragma comment(lib, "xxx.lib")
int main()
{
    b();          //这个b为xxx.lib里的a.obj提供的函数
}

生成调用lib库里b函数的exe后,用调试工具对exe进行调试,或者用IDA对其进行静态分析。

顺着这个程序的执行流程,我们就能到达lib里被我们调用的b函数的代码了。

obj打包回lib

如果我们对obj中的二进制进行了修改,可以再导入进原来的lib:

lib xxx.lib xxx.obj

或者生成一个新的lib:

lib /OUT:xxx.lib xxx_new.lib xxx.obj

———————————————————————————————————————————

欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值