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               9str += OpenSSL_version(OPENSSL_VERSION); // OpenSSL 3.2.0 23 Nov 2023str += "\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 UTCstr += "\r\n";str += OpenSSL_version(OPENSSL_PLATFORM); // platform: VC-WIN64Astr += "\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.0str += "\r\n";str += OpenSSL_version(OPENSSL_FULL_VERSION_STRING); // 3.2.0str += "\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:0x18c07fcef3bfa7ebstr += "\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 未知配置
#endifvoid 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               9str += OpenSSL_version(OPENSSL_VERSION); // OpenSSL 3.2.0 23 Nov 2023str += "\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 UTCstr += "\r\n";str += OpenSSL_version(OPENSSL_PLATFORM); // platform: VC-WIN64Astr += "\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.0str += "\r\n";str += OpenSSL_version(OPENSSL_FULL_VERSION_STRING); // 3.2.0str += "\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:0x18c07fcef3bfa7ebstr += "\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.mzph.cn/bicheng/5703.shtml

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

相关文章

重定义大语言模型的记忆能力:对抗性压缩如何挑战现有测量法

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! Rethinking LLM Memorization through the Lens of Adversarial Compression 引言:探索大型语言模型的记忆能力 在当今信息时代,大型…

Window(Qt/Vs)软件添加版本信息

Window(Qt/Vs)软件添加版本信息 文章目录 Window(Qt/Vs)软件添加版本信息VS添加版本信息添加资源文件添加版本定义头自动更新版本添加批处理脚本设置生成事件 Qt添加版本信息添加资源文件文件信息修改自动更新版本 CMake添加版本信…

#ESP32S3R8N8建立工程(VSCODE)点亮LED

1.参考文档 【立创ESP32S3R8N8】IDF入门手册 - 飞书云文档 (feishu.cn)https://lceda001.feishu.cn/wiki/GOIlwwfbIi1SC3k8594cDeFVn8g 2.建立工程 3.运行效果 4.更改配置 5.插播 之前配置的环境是有问题的,就算有自动检测也要仔细检查,必须严格按照以…

VMware安装ubuntun虚拟机使用桥接模式无法上网问题解决

问题:最近准备使用VMware虚拟机搭建k8s集群服务,因为需要在同一个网段下,我使用桥接的方式,我发现主机在使用有线连接时虚拟机网络连接正常,但是使用无线网就显示连接不上网络。 解决方法 一、查看网络连接&#xff…

aardio封装库) 微软开源的js引擎(ChakraCore)

前言 做爬虫肯定少不了JavaScript引擎的使用,比如在Python中现在一般用pyexecjs2来执行JavaScript代码,另外还有一些其他执行JavaScript的库: https://github.com/eight04/node_vm2: rpc调用nodejs,需要安装nodehttps://github.…

Spring Data JPA数据批量插入、批量更新真的用对了吗

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 前言 在前两篇文章已经介绍过,在使用Spring Data JPA时,DAO层的Respository通过继承J…

BigKey的危害

1.2.1、BigKey的危害 网络阻塞 对BigKey执行读请求时,少量的QPS就可能导致带宽使用率被占满,导致Redis实例,乃至所在物理机变慢 数据倾斜 BigKey所在的Redis实例内存使用率远超其他实例,无法使数据分片的内存资源达到均衡 Redis阻…

Python中动画显示与gif生成

1. 动画生成 主要使用的是 matplotlib.animation ,具体示例如下: import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np fig, ax plt.subplots() t np.linspace(0, 3, 40) g -9.81 v0 12 z g * t**2 / …

新建stm32工程模板步骤

1.先使用keil新建一个project的基本代码 2.stm32启动文件添加 将stm32的启动文件,在原工程当中新建一个Start文件夹把相关的启动文件放到文件夹当中 然后还需要找到下面三个文件 stm32f10x.h是stm32的外设寄存器的声明和定义,后面那两个文件用于配置系…

【Docker】搭建一个媒体服务器插件后端API服务 - MetaTube

【Docker】搭建一个媒体服务器插件后端API服务 - MetaTube 前言 本教程基于群晖的NAS设备DS423的docker功能进行搭建,DSM版为 7.2.1-69057 Update 5。 简介 MetaTube 是一个媒体服务器插件,主要用于 Emby 和 Jellyfin 媒体服务器。它的主要功能是从互…

C++之const用法小结

在C中,const关键字具有多种用法,主要用于声明常量,确保某些变量的值在程序运行期间不会被修改。以下是const在C中的一些常见用法: 1.声明常量: 使用const声明的变量是常量,其值在初始化后不能再被修改。 …

【数据结构】链表专题2

前言 本篇博客继续探讨有关链表的专题,这片博客的题,提前打个预防针,有点意思哦,哈哈哈,话不多说,进入正文 💓 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论…

ASP.NET淘宝店主交易管理系统的设计与实现

摘 要 淘宝店主交易管理系统主要采用了ASPACCESS的B/S设计模式,通过网络之间的数据交换来实现客户、商品、交易的管理和对客户、商品、交易统计工作,从而提高淘宝店主在管理网店过程中的工作效率和质量。 系统分为基本资料模块,统计资料模…

北京大学肖臻老师《区块链技术与应用》P14(ETH概述)和P15(ETH账户)

1️⃣ 参考 北京大学肖臻老师《区块链技术与应用》 P14 - ETH概述篇P15 - ETH账户篇 1️⃣4️⃣ETH概述 ① 比特币与以太坊的对比 比特币(区块链 1.0)以太坊(区块链 2.0)出块时间大约10 min十几秒mining puzzle计算密集型Memo…

DRF中的请求入口分析及request对象分析

DRF中的请求入口分析及request对象分析 django restframework框架是在django的基础上又给我们提供了很多方便的功能,让我们可以更便捷基于django开发restful API 1 drf项目 pip install django pip install djangorestframework1.1 核心配置 INSTALLED_APPS [d…

【ARMv8/v9 系统寄存 3 -- system counter CNTPCT_EL0】

文章目录 ARMv8/v9 system countersystem counter读取函数实现 ARMv8/v9 system counter 所有使用Arm处理器的系统中都会包含一个标准化的通用定时器(Generic Timer)框架。这个通用定时器系统提供了一个系统计数器(System Counter&#xff0…

环形链表的经典问题

环形链表 环形链表的介绍链表中是否带环返回链表开始入环的第一个节点 本文主要介绍如何判断一个链表是否是环形链表,以及如何得到环形链表中的第一个节点。 环形链表的介绍 环形链表是一种链表数据结构,环形链表是某个节点的next指针指向前面的节点或指…

ctfshow-web入门-102

这个题我想记录一下,主要是这个方法属实是有点惊艳到我了。故而进行记录,也为了方便大家阅读理解。 看题目,根据题目我写一下我的分析: $_POST传入一个v1,$_GET传入一个v2,一个v3。 赋值符号 优先级高于…

微软如何打造数字零售力航母系列科普05 - Azure中计算机视觉的视觉指南

Azure中计算机视觉的视觉指南 什么是计算机视觉?如何使用Microsoft Azure将计算机视觉功能集成到应用程序和工作流中? 作者:Nitya Narasimhan 编辑:数字化营销工兵 •11分钟阅读 什么是计算机视觉?如何使用Microso…

WORD排版常见问题与解决方案

前言 近期使用word软件进行论文排版工作,遇到了一些常见的问题,记录一下,避免遗忘。 基本配置 系统环境:win10/win11 word版本:Microsoft Office LTSC 专业增强版 2021 问题与解决方案 问题1:页眉显示内…