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。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。
lib静态库逆向分析相关推荐
- C++中.lib静态库、.dll动态库的生成及调用2
关于动.静态库的介绍及静态库的生成及调用参见:C++中.lib静态库..dll动态库的生成及调用<1>,本文主要介绍基于VS2015平台的动态库dll的生成及调用方法. 一.动态库的生成 ...
- C++中.lib静态库、.dll动态库的生成及调用1
一.前言 1.动态链接库(dll)与静态链接库(lib): 动态链接库(dll)是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.在链接步骤中,连接器将从库文件取得所需的代 ...
- VS2019:C++程序lib静态库、dll动态库的生成和使用
一.静态库 静态库的使用需要(1).h头文件:(2).lib静态库文件: 1.静态库生成 (1)项目-右键属性-常规-配置类型-选静态库: (2)点击生成,Debug文件夹下出现lib静态库: 2.静 ...
- VS2017添加lib静态库文件引用
1.右键项目,打开proterties 2.打开C/C++ ---> General --->Additional Include Directies ,把与lib相关的头文件所在的目录添 ...
- [转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)
本文转自:http://kb.cnblogs.com/page/94467/ Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SS ...
- c# 调用c++ lib静态库
四个步骤 1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库 3.导出C接口 4.c#调用c++动态库 开始你的表演... ①创建一个空白 ...
- html5调用静态库,如何在VS2010项目中引用Lib静态库(以Openssl为例)
Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用. 首先下载Openssl包 ...
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结...
原文链接地址:https://blog.csdn.net/ithzhang/article/details/13170047 MSDN中对于在不同的配置下Link的LIB作了说明: C Runtime ...
- IDA静态动态逆向分析基础
1.JDB和IDA调试步骤2 (1).JDB调试步骤2 (2).IDA调试步骤2 (3).定位函数2 (4).开始调试2 2.动态调试Android so库函数的方法2 3.strace查看系统调用3 ...
最新文章
- Netty序章之BIO NIO AIO演变
- HTML 的特殊字符转换转义符,的两种方法。
- PIC单片机入门_PICC的指向RAM的指针
- SpringCloud Ribbon
- MongoDB增加用户认证: 增加用户、删除用户、修改用户密码、读写权限、只读权限
- babel css3新特性_前端总结(后续不断更新)
- 经验总结:java自学视频免费
- i5700 预,链接
- python怎样画立体图-Python学习(一) —— matplotlib绘制三维轨迹图
- 由一维数组创建小根堆
- CSDN如何快速更换皮肤
- 音乐u盘排序软件_传输数据快速的各种U盘系列 定制U盘
- epicor数据表增加字段
- 清华现超级“学霸” 15门课程100分4门99分(图)
- 全民wa矿小程序源码
- Chrome-设置鼠标手势
- 把Word或Excel表格插入CAD中直接编辑的方法
- python晋江爬虫_python爬虫之小说爬取
- 51单片机 16X16点阵循环滚动显示汉字(基于proteus)
- 让Enter键实现Tab键的功能
热门文章
- CC00073.kafka——|Hadoopkafka.V58|——|kafka.v58|稳定性|事务操作|
- FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D)
- 适合用在高校的人脸识别闸机系统
- 计算两个日期之间的天数(C语言实现)
- 瑞芯微-RV1109主板各参数介绍
- 5.3.1 5GMM modes and N1 NAS signalling connection
- aardio - 【库】滴答表格
- 乘法逆元、扩展欧几里得算法、二元一次方程、a的n次方取余
- 【JavaEE】认识Tomcat
- 洞见2021大会专访 | 名才eHR董事长李秾:重新定义eHR,助力企业引领人力资源数字化转型浪潮...