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

文章目录

    • 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.mfbz.cn/a/581131.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stream中的foreach,allMatch,noneMatch,anyMatch的基本使用

1.1foreach遍历集合元素 1.2anyMatch()的使用 结论:上边使用foreach循环遍历和使用anyMatch()的作用相同 2.allMatch() 2.1初级使用 2.2进级使用 3.noneMatch()使用

Python 实现视频去抖动技术

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 视频去抖动是视频处理中的一项重要技术,它可以有效地减少视频中由于相机震动或手…

华为matebook 14安装ubuntu双系统

一、准备u盘 首先格式化u盘(选择FAT32) 二、确认电脑类型 键盘按下win+r(win:开始键/也就是Windows的标志那个键),在输入框内输入msinfo32后,回车确认 确定自己电脑 硬盘 的类型: 在显示屏下方的搜索框内搜索“计算机管理” 点击进入后,再点击左边列表内的“磁…

拉普拉斯IPO:荣获国家级专精特新和国家级制造业单项冠军殊荣

近期,拉普拉斯荣获国家级专精特新和国家级制造业单项冠军的殊荣,这无疑是对其在技术和发展方面的肯定。这些荣誉证明了拉普拉斯在光伏行业的卓越表现和持续创新,以及其在国内制造业中的领先地位,进一步彰显了拉普拉斯在技术研发和…

智慧浪潮下的产业园区:洞察智慧化转型如何打造高效、绿色、安全的新园区

目录 一、引言 二、智慧化转型的内涵与价值 三、打造高效园区的智慧化策略 1、建设智能化基础设施 2、推广智能化应用 3、构建智慧化服务平台 四、实现绿色园区的智慧化途径 1、推动绿色能源应用 2、实施绿色建筑设计 3、加强环境监测与治理 五、保障园区安全的智慧…

【办公类-22-14】周计划系列(5-6)“周计划-06 19周的周计划教案合并打印PDF(最终打印版))

背景需求: 花了十周,终于把周计划教案的文字都写满、加粗、节日替换了。为了便于打印,我把19周的周计划教案全部合并在一起PDF。制作打印用PDF 思路 1、周计划是单独打印一张,因此要在第2页插入空白页, 2、教案有3页…

[计算机效率] 截图工具:FastStone Capture

3.19 截图工具:FastStone Capture FastStone Capture是一款功能强大的屏幕捕捉软件,体积小巧、功能强大,不但具有常规截图等功能,更有从扫描器获取图像,和将图像转换为PDF文档等功能。 截屏功能:支持全屏截…

【Python数据库】MongoDB

文章目录 [toc]数据插入数据查询数据更新数据删除 个人主页:丷从心 系列专栏:Python数据库 学习指南:Python学习指南 数据插入 from pymongo import MongoClientdef insert_data():mongo_client MongoClient(hostlocalhost, port27017)co…

Git变更账户、查看账户

1、变更账户 (1)修改当前文件夹用户 git config user.name “新用户名” git config user.email “新邮箱” (2)修改全局git用户 git config - -global user.name “新用户名” git config - -global user.email “新邮箱”…

计算机网络——初识网络

一、局域网与广域网 1.局域网(LAN) 局域网:即Local Area Network,简称LAN。Local即标识了局域⽹是本地,局部组建的⼀种私有⽹络。局域⽹内的主机之间能⽅便的进⾏⽹络通信,⼜称为内⽹;局域⽹和…

【c++】----STL简介string

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string类 1. 为什么学习string类? 6.string类的常用接口说明(下面我们只讲解最常用的接口) 1.string 常见构造 2.string类的遍历 iterator 迭代器遍历 (…

前端开发攻略---模拟后端接口返回数据,教你三种方式实现滚动到底部加载更多数据

1、演示 2、方式一:手动监听滚动事件 原理: 手动监听滚动事件的原理是通过添加滚动事件监听器,当页面滚动时触发相应的回调函数,检测页面是否已经滚动到底部,从而触发加载更多数据的逻辑。 优点: 1、相对简…

理解ROS2的动作

​ 1. 创建一个动作 目标: 在ROS 2软件包中定义一个动作。 1.1 新建包 设置一个 workspace 并创建一个名为 action_tutorials_interfaces 的包: mkdir -p ros2_ws/src #you can reuse existing workspace with this naming convention cd ros2_ws/s…

HTTPS证书申请:相关流程及注意事项

HTTPS证书(即HTTPS证书、服务器证书)是实现网络通信安全的重要技术产品,它为网站提供HTTPS加密和服务器身份验证的功能。HTTPS证书申请有那些流程?如何快速完成HTTPS证书申请?有哪些注意事项?本文将以沃通H…

Meta Llama 3 性能提升与推理服务部署

利用 NVIDIA TensorRT-LLM 和 NVIDIA Triton 推理服务器提升 Meta Llama 3 性能 我们很高兴地宣布 NVIDIA TensorRT-LLM 支持 Meta Llama 3 系列模型,从而加速和优化您的 LLM 推理性能。 您可以通过浏览器用户界面立即试用 Llama 3 8B 和 Llama 3 70B(该…

Android优化RecyclerView图片展示:Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas,Kotlin(b)

Android优化RecyclerView图片展示:Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas,Kotlin(b) 对 Android GridLayoutManager Glide批量加载Bitmap绘制Canvas画在RecyclerView,Kotlin(a)-…

【哔哩哔哩笔试题汇总】2024-04-28-哔哩哔哩春招笔试题-三语言题解(CPP/Python/Java)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新b站近期的春秋招笔试题汇总~ 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢&#x1f497…

基于Hadoop的网上购物行为分析设计与实现

2.8 数据分析及可视化 2.8.1 店铺销售情况分析 通过这里可以看出,该店家的数据用户访问量比较的大,有接近6W多条数据,但是通过对用户进行透视分析发现只有981位用户,其次就是对于用户购买次数进行分析,发现数据只有27…

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

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

2.Neo4j的搭建启动

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