openssl3.2 - exp - 使用默认的函数宏,在release版中也会引入__FILE__

news2024/12/27 13:47:29

文章目录

    • openssl3.2 - exp - 使用默认的函数宏,在release版中也会引入__FILE__
    • 概述
    • 笔记
    • 验证是否__FILE__在release版下也能用?
    • 将openssl编译成release版的,看看CRYPTO_free()是否只需要一个参数就行?
    • 将工程中的openssl相关的库换成release版的,再试试是否还会引入__FILE__
    • 折中方法
    • END

openssl3.2 - exp - 使用默认的函数宏,在release版中也会引入__FILE__

概述

在加固主程序。
主程序已经确定是release版的了。
用IDA打开,还是能看到很多相关的__FILE__的痕迹。
在这里插入图片描述
查这些串的引用点。
在这里插入图片描述
原来是openssl释放内存的函数要的参数。
因为我写程序时为了方便,就编译了一个debug版的openssl3.2.
查看openssl3.2的API定义。

#define MY_OPENSSL_FREE(p) \
do { \
	if (NULL != p) \
	{ \
		OPENSSL_free(p); \
		p = NULL; \
	} \
} while (false);
# define OPENSSL_free(addr) \
        CRYPTO_free(addr, OPENSSL_FILE, OPENSSL_LINE)
void CRYPTO_free(void *ptr, const char *file, int line);

可以看到最后调用的CRYPTO_free()是debug版的,就是需要file,line.
也就是这个原因,让编译器将__FILE__, __LINE__送给了CRYPTO_free()作为参数。从而在PE字符串表中留下了不必要的字符串。

笔记

验证是否__FILE__在release版下也能用?

#define __TEXTA(quote) quote 
#define TEXTA(quote) __TEXTA(quote)

CStringA vs_build_type_detected(bool switchOn)
{
	CStringA cs_rc;

	if (switchOn)
	{
#if (!defined(_DEBUG) && defined(NDEBUG))
		cs_rc = TEXTA("Release build");
#elif (defined(_DEBUG) && !defined(NDEBUG))
		cs_rc = TEXTA("debug build");
#else
#error 未知配置
#endif
	}

	return cs_rc;
}

void CvsBuildModeDiffDlg::OnBnClickedOk()
{
	USES_CONVERSION;
	CStringA csTmpA;
	CStringW csTmpW;

	csTmpA = vs_build_type_detected(true);

	csTmpA.Format(TEXTA("%s - %s:%d"), csTmpA, __FILE__, __LINE__);

	csTmpW = A2W(csTmpA.GetString());
	AfxMessageBox(csTmpW);

	CDialogEx::OnOK();
}

在这里插入图片描述
可以看到,release版下,可以正常使用__FILE__, LINE, 这2个宏和debug/release版没关系。

将openssl编译成release版的,看看CRYPTO_free()是否只需要一个参数就行?

已经做了实验,编译了一个release版的openssl3.2 (openssl3.2 - 编译)

将工程中的openssl相关的库换成release版的,再试试是否还会引入__FILE__

void CvsBuildModeDiffDlg::test()
{
	USES_CONVERSION;
	std::string str;
	CString csW;
	char* pBuf = NULL;

	//# define OPENSSL_VERSION                0
	//# define OPENSSL_CFLAGS                 1
	//# define OPENSSL_BUILT_ON               2
	//# define OPENSSL_PLATFORM               3
	//# define OPENSSL_DIR                    4
	//# define OPENSSL_ENGINES_DIR            5
	//# define OPENSSL_VERSION_STRING         6
	//# define OPENSSL_FULL_VERSION_STRING    7
	//# define OPENSSL_MODULES_DIR            8
	//# define OPENSSL_CPU_INFO               9

	str += OpenSSL_version(OPENSSL_VERSION); // OpenSSL 3.2.0 23 Nov 2023
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_CFLAGS); // compiler: cl  /Zi /Fdossl_static.pdb /Gs0 /GF /Gy /MDd /W3 /wd4090 /nologo /Od -DLIBZ=".\\\\my_zlib_1d3.dll" -DL_ENDIAN -DOPENSSL_PIC -D"OPENSSL_BUILDING_OPENSSL" -D"ZLIB" -D"ZLIB_SHARED" -D"OPENSSL_SYS_WIN32" -D"WIN32_LEAN_AND_MEAN" -D"UNICODE" -D"_UNICODE" -D"_CRT_SECURE_NO_DEPRECATE" -D"_WINSOCK_DEPRECATED_NO_WARNINGS" -D"DEBUG" -D"_DEBUG" -I"D:\\my_dev\\lib\\zlib_1d3"
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_BUILT_ON); // built on: Sun Feb 25 02:20:27 2024 UTC
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_PLATFORM); // platform: VC-WIN64A
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_DIR); // OPENSSLDIR: "C:\openssl_3d2\common"
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_ENGINES_DIR); // ENGINESDIR: "C:\openssl_3d2\lib\engines-3"
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_VERSION_STRING); // 3.2.0
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_FULL_VERSION_STRING); // 3.2.0
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_MODULES_DIR); // MODULESDIR: "C:\openssl_3d2\lib\ossl-modules"
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_CPU_INFO); // CPUINFO: OPENSSL_ia32cap=0x7ffaf3ffffebffff:0x18c07fcef3bfa7eb
	str += "\r\n";

	pBuf = (char*)OPENSSL_malloc(10); // !
	assert(NULL != pBuf);
	OPENSSL_free(pBuf); // !
	pBuf = NULL;

	str;

	csW = A2W(str.data());
	AfxMessageBox(csW);
}

void CvsBuildModeDiffDlg::OnBnClickedOk()
{
	USES_CONVERSION;
	CStringA csTmpA;
	CStringW csTmpW;

	test();

	csTmpA = vs_build_type_detected(true);

	csTmpA.Format(TEXTA("%s - %s:%d"), csTmpA, __FILE__, __LINE__);

	csTmpW = A2W(csTmpA.GetString());
	AfxMessageBox(csTmpW);

	CDialogEx::OnOK();
}

看了一下,还是会引入__FILE_
在这里插入图片描述

原因是CRYPTO_malloc(), CRYPTO_free()都是3个参数的,后2个参数就是文件名和行号

OSSL_CRYPTO_ALLOC void *CRYPTO_malloc(size_t num, const char *file, int line);
void CRYPTO_free(void *ptr, const char *file, int line);

openssl的函数这么封装,是为了有内存泄漏时,容易知道原始泄漏点的代码所在.cpp和行号。
不过,对于release版,为啥不提供只有一个参数的版本呢?

折中方法

如果在IDA中发现使用opensslAPI引入了__FILE_, 那么就仿照openssl的函数宏,自己封装函数宏,就不会引入__FILE__了。


#if (!defined(_DEBUG) && defined(NDEBUG))
// Release build
// release版中使用的是自己给参数的函数宏,给的file = "", line = 0
# define my_OPENSSL_malloc(num) \
        CRYPTO_malloc(num, "", 0)

# define my_OPENSSL_free(addr) \
        CRYPTO_free(addr, "", 0)

#elif (defined(_DEBUG) && !defined(NDEBUG))
// debug build
// debug版中使用openssl原始的函数宏,可以引入__FILE__
# define my_OPENSSL_malloc(num) OPENSSL_malloc(num)
# define my_OPENSSL_free(addr) OPENSSL_free(addr) 
#else
#error 未知配置
#endif

void CvsBuildModeDiffDlg::test()
{
	USES_CONVERSION;
	std::string str;
	CString csW;
	char* pBuf = NULL;

	//# define OPENSSL_VERSION                0
	//# define OPENSSL_CFLAGS                 1
	//# define OPENSSL_BUILT_ON               2
	//# define OPENSSL_PLATFORM               3
	//# define OPENSSL_DIR                    4
	//# define OPENSSL_ENGINES_DIR            5
	//# define OPENSSL_VERSION_STRING         6
	//# define OPENSSL_FULL_VERSION_STRING    7
	//# define OPENSSL_MODULES_DIR            8
	//# define OPENSSL_CPU_INFO               9

	str += OpenSSL_version(OPENSSL_VERSION); // OpenSSL 3.2.0 23 Nov 2023
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_CFLAGS); // compiler: cl  /Zi /Fdossl_static.pdb /Gs0 /GF /Gy /MDd /W3 /wd4090 /nologo /Od -DLIBZ=".\\\\my_zlib_1d3.dll" -DL_ENDIAN -DOPENSSL_PIC -D"OPENSSL_BUILDING_OPENSSL" -D"ZLIB" -D"ZLIB_SHARED" -D"OPENSSL_SYS_WIN32" -D"WIN32_LEAN_AND_MEAN" -D"UNICODE" -D"_UNICODE" -D"_CRT_SECURE_NO_DEPRECATE" -D"_WINSOCK_DEPRECATED_NO_WARNINGS" -D"DEBUG" -D"_DEBUG" -I"D:\\my_dev\\lib\\zlib_1d3"
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_BUILT_ON); // built on: Sun Feb 25 02:20:27 2024 UTC
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_PLATFORM); // platform: VC-WIN64A
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_DIR); // OPENSSLDIR: "C:\openssl_3d2\common"
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_ENGINES_DIR); // ENGINESDIR: "C:\openssl_3d2\lib\engines-3"
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_VERSION_STRING); // 3.2.0
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_FULL_VERSION_STRING); // 3.2.0
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_MODULES_DIR); // MODULESDIR: "C:\openssl_3d2\lib\ossl-modules"
	str += "\r\n";
	str += OpenSSL_version(OPENSSL_CPU_INFO); // CPUINFO: OPENSSL_ia32cap=0x7ffaf3ffffebffff:0x18c07fcef3bfa7eb
	str += "\r\n";

	pBuf = (char*)my_OPENSSL_malloc(10);
	assert(NULL != pBuf);
	my_OPENSSL_free(pBuf);
	pBuf = NULL;

	str;

	csW = A2W(str.data());
	AfxMessageBox(csW);
}

void CvsBuildModeDiffDlg::OnBnClickedOk()
{
	USES_CONVERSION;
	CStringA csTmpA;
	CStringW csTmpW;

	test();

	csTmpA = vs_build_type_detected(true);

	csTmpA.Format(TEXTA("%s - %s:%d"), csTmpA, __FILE__, __LINE__);

	csTmpW = A2W(csTmpA.GetString());
	AfxMessageBox(csTmpW);

	CDialogEx::OnOK();
}

在这里插入图片描述
在这里插入图片描述
可以看到,使用自己定义的函数宏后,在IDA中看时,已经没有引入__FILE_了。

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1631124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue---组件

Vue—组件 目录 Vue---组件定义组件全局组件局部组件 组件通讯***重点***父子通信之父传子(props)父子通信之子传父($emit)ref属性($refs) 动态组件插槽命名插槽 定义组件 全局组件 vue2中template只能传…

2.Neo4j的搭建启动

Graph Database 图数据库 版本对应关系 官网都是高版本,推荐使用下载地址可以找到社区老版本: https://we-yun.com/doc/neo4j/ neo4j.bat 启动脚本 cypher-shell.bat 执行CQL语句的。 import文件夹可以放入excel,csv等数据文件,导入到…

IMU/捷联惯导常见的术语,以及性能评价标准(附Python解析代码)

0. 简介 现在的机器人领域在普遍使用IMU(惯性导航单元)。该系统有三个加速度传感器与三个角速度传感器(陀螺)组成,加速度计用来感受飞机相对于地垂线的加速度分量,陀螺仪用来感知飞机的角速率变化&#xff…

服务器被CC攻击怎么办

遇到CC攻击时,可采取以下措施:限制IP访问频率、启用防DDoS服务、配置Web应用防火墙、增加服务器带宽、使用负载均衡分散请求压力。 处理服务器遭遇CC攻击的方法如下: 1. 确认攻击 你需要确认服务器是否真的遭受了CC攻击,这可以…

基于单片机的多功能电子万年历系统

摘要:该题目要求学生综合运用单片机原理、低频电子线路、数字电路与逻辑设计等相关知识,设计完成多功能电子万年历系统。通过完成设计任务,使学生掌握单片机设计开发的基本流程,增强学生动手实践能力,培养学生分析和解决实际问题的能力,为后续课程的学习和工作打下良好基础。 关…

张大哥笔记:我付钱了,我就是大爷?

很抱歉用这个当做标题,来给大家分享一些电商的故事!大家好,我是张大哥,今天聊聊在电商路上遇到过的奇葩买家? 比如最近我在做PDD的时候,就会遇到很多莫名其妙的sha子,咱是知识份子,肯…

Excel vlookup函数的使用教程 和 可能遇到的错误解决方法

使用VLOOKUP示例 被查询的表格 表一 A列B列C列A1aB2bC3c 要匹配的列 表二 F列G列H列ACBDA 要G列匹配字母,H列匹配数字 G 使用公式VLOOKUP(F5,A:D,3,0) 参数说明 F5 是表二 F列第五行的A A:D表是要匹配的数据列表在A到D列,就是表一 (注意…

go 安装软件报go.mod file not found

执行 go get -u github.com/go-sql-driver/mysql 下载mysql 报错 解决方法: 控制台:输入go env 返回如下: 红圈值为NUL,需要设置GOMOD的值, 然后再控制台执行 (1)mkdir mod (2)go mod init mod 然后再执行下载&…

Linux逻辑方式合并物理磁盘

在日常生活中,我们总是遇到一个文件太大,以至于我们的两个磁盘都装不下,这时我们就需要将两块物理磁盘逻辑化的连接在一起,把物理磁盘使用逻辑化的方法合并在一起,形成卷组,使得磁盘空间可以公用&#xff1…

【idea】idea 中 git 分支多个提交合并一个提交到新的分支

一、方法原理讲解 我们在 dev 分支对不同的代码文件做了多次提交。现在我们想要把这些提交都合并到 test 分支。首先我们要明白四个 git 操作, commit:命令用于将你的代码变更保存到本地代码仓库中,它创建了一个新的提交(commit…

Python 操作PDF图片 – 添加、替换、删除PDF中的图片

PDF文件中的图片可以丰富文档内容,提升用户的阅读体验。除了在PDF中添加图片外,有时也需要替换或删除其中的图片,以改进视觉效果或更新信息。文本将提供以下三个示例,介绍如何使用Python 操作PDF文件中的图片: 目录 …

2017年全国职业院校技能大赛高职组“信息安全管理与评估”样题

培训、环境、资料、考证 公众号:Geek极安云科 网络安全群:624032112 网络系统管理群:223627079 网络建设与运维群:870959784 移动应用开发群:548238632 极安云科专注于技能提升,赋能 2024年广东省高校的技…

面试八股——HashMap

实现原理 红黑树是为了解决链表过长之后,查找时间过长的问题,将链表存储变为红黑树存储。 put方法的实现(5⭐) 相关属性: 1. 容量:初始容量为2^4。 2. 加载因子:初始值为0.75 上面两个属性的…

linux网络编程启动!(开端)

网络设计模式 :就两种模型 b/s 模型 : 浏览器—>服务器 优点是:跨平台。开发成本低 缺点是:网络通信的时候必须要使用http/https协议 http协议 是个应用层协议 不能在磁盘缓存或者从磁盘加载大量数据 http 与https 多了一层加密 c/s模型 …

【Shell】循环结构——for和while循环实例

Shell可以重复地执行特定的指令,直到特定的条件被满足为止。这重复执行的一组指令就叫做循环 特点: 首先,循环条件中使用的变量必须是已初始化的,然后在循环中开始执行每次在循环开始时进行一次测试重复地执行一个代码块 循环实例…

OpenHarmony 实战开发——分布式购物车案例展示~

简介 分布式购物车demo 模拟的是我们购物时参加满减活动,进行拼单的场景;实现两人拼单时,其他一人添加商品到购物车,另外一人购物车列表能同步更新,且在购物车列表页面结算时,某一人结算对方也能实时知道结…

【无监督+自然语言】 GPT,BERT, GPT-2,GPT-3 生成式预训练模型方法概述 (Generative Pre-Traning)

主要参考 【GPT,GPT-2,GPT-3 论文精读【李沐论文精读】-2022.03.04】 https://www.bilibili.com/video/BV1AF411b7xQ/ 大语言模型综述: https://blog.csdn.net/imwaters/article/details/137019747 GPT与chatgpt的关系 图源:L…

JMeter的下载安装与使用(Mac)

1、下载地址​​​​​​https://jmeter.apache.org/download_jmeter.cgi 2、下载Binaries 下的apache-jmeter5.5.tgz 3、解压 4、启动 在bin目录下打开终端,输入sh jmeter 出现jmeter首页界面,即为成功。 5、使用 5.1 语言选择 option选项卡&am…

State.initState() must be a void method without an `async` keyword错误解析

文章目录 报错问题报错的代码 错误原因解决方法解析 另外的方法 报错问题 State.initState() must be a void method without an async keyword如下图: 报错的代码 报错的代码如下: overridevoid initState() async{super.initState();await getConf…

LoRA 引领多模态模型革命,大模型的微调方案

基于LoRA微调多模态大模型 随着 ChatGPT 的火爆,大模型时代降临,普通人难以进行全量微调。 参数高效微调技术应运而生,为科研人员和开发者提供了微调大模型的机会。 用 LoRA 微调 2.7B 参数的 blip2-opt 模型,提升图生文能力&am…