lib静态库逆向分析_libtersafe-程序员宅基地

技术标签: 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。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shadow20080578/article/details/123103347

智能推荐

html鼠标循环滚动代码大全,jQuery 列表自动循环滚动鼠标悬停时停止滚动的实现代码(图文)...-程序员宅基地

文章浏览阅读418次。要求实现:页面中一个小的区域循环滚动展示新闻(公告、活动、图片等等),并且,鼠标悬停时停止滚动并提示,离开后,继续滚动。演示效果图:1,html页面代码示例:2,css代码代码示例:ui,li {list-style: none;}#news{height: 75px;overflow: hidden;}3,关键部分---js文件:$(function() {var $this = $("#new..._html实现向上无缝滚动列表,鼠标悬浮时暂停,鼠标离开时继续滚动

python编程手机软件哪个好,用手机编程python的软件_打开代码的软件-程序员宅基地

文章浏览阅读888次,点赞23次,收藏17次。大家好,小编来为大家解答以下问题,python编程手机软件哪个好,用手机编程python的软件,现在让我们一起来看看吧!_打开代码的软件

Syntax Error: Error: Node Sass version 6.0.1 is incompatible with ^4.0.0-程序员宅基地

文章浏览阅读1.2k次。Syntax Error: Error: Node Sass version 6.0.1 is incompatible with ^4.0.0,提示:Error: Rule can only have one resource source (provided resource and test + include + exclude)_syntax error: error: node sass version 6.0.1 is incompatible with ^4.0.0.

大数据框架之Hadoop:HDFS(六)DataNode(面试开发重点)-程序员宅基地

文章浏览阅读760次。DataNode(面试开发重点)_datanode

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之七 简单进行人脸检测并添加面具特效实现

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。这里使用 Python 基于 OpenCV 进行视觉图像处理,......

使用UmcFramework和unimrcpclient.xml连接多个SIP设置的配置指南及C代码示例

在多媒体通信领域,MRCP(Media Resource Control Protocol)协议被广泛用于控制语音识别和合成等媒体资源。UniMRCP是一个开源的MRCP实现,提供了客户端和服务端的库。UmcFramework是一个基于UniMRCP客户端库的示例应用程序框架,它帮助开发者快速集成和测试MRCP客户端功能。本文将详细介绍如何使用UmcFramework和unimrcpclient.xml配置文件连接到多个SIP设置,以及如何用C代码进行示例说明。

随便推点

Hadoop环境搭建(保姆级教学)_hadoop平台搭建步骤-程序员宅基地

文章浏览阅读5.4k次,点赞10次,收藏64次。HADOOP环境搭建过程详解_hadoop平台搭建步骤

ZooKeeper实战之ZkClient客户端实现负载均衡_zookeeper实现负载均衡案例-程序员宅基地

文章浏览阅读1.9k次。声明:此博客为学习笔记,学习自极客学院ZooKeeper相关视频;非常感谢众多大牛们的知识分享。相关概念:负载均衡(相关节点)架构图:说明:每当往集群中新增一个工作服务器时,都会再/server节点下创建一个对应的临时节点,该节点中应含有该服务器 的连接信息以及均衡标识等。当客户端需要连接worker server时,就会先读取/servers节点下的所..._zookeeper实现负载均衡案例

Android 枚举 VS 枚举注解_android 枚举注解-程序员宅基地

文章浏览阅读448次。枚举注解替换枚举java 虚拟机内存分配java 内存区域可分为方法区 存放虚拟机加载的类信息,常量,静态变量等数据。虚拟机栈 java 方法执行的内存模型:每个方法在执行的时候创建的栈帧,包括存储局部变量表,操作数栈,动态链接,方法出口等信息。本地方法栈 主要与Native相关堆 存放对象实例。程序计数器 当前线程执行的字节码行号指示器。java 数据类型占内存大小java 数据类型分为基本数据类型和引用数据类型。在32位系统上基本数据类型,本文中中的所有内存空间大小都在_android 枚举注解

HDU1715--第i个斐波那契数 大菲波数_返回第i个斐波那契数-程序员宅基地

文章浏览阅读486次。HDU1715:大菲波数求第i个斐波那契数问题(与HDU1316类似,但更简单):总结:数组开多大?题目中让求的最大的是第1000个斐波那契数是多少,由于f[0]不用,所以数组开到1001。import java.util.Scanner;import java.math.BigInteger;public class Main { public static void main..._返回第i个斐波那契数

轻松搭建CAS 5.x系列(5)-增加密码找回和密码修改功能-程序员宅基地

文章浏览阅读418次。概述说明CAS内置了密码找回和密码修改的功能; 密码找回功能是,系统会吧密码重置的连接通过邮件或短信方式发送给用户,用户点击链接后就可以重置密码,cas还支持预留密码重置的问题,只有回答对了,才可以重置密码;系统可配置密码重置后,是否自动登录; 密码修改功能是,用户登录后输入新密码即可完成密码修改。安装步骤`1. 首先,搭建好cas sso server您需要按..._修改cas默认用户密码

springcloud(七) feign + Hystrix 整合 、-程序员宅基地

文章浏览阅读141次。之前几章演示的熔断,降级 都是 RestTemplate + Ribbon 和RestTemplate + Hystrix ,但是在实际开发并不是这样,实际开发中都是 Feign 远程接口调用。Feign + Hystrix 演示:  eruka(略)order 服务工程:  pom.xml<?xml version="1.0" encoding="U..._this is order 服务工程