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

2024-04-29 11:28

本文主要是介绍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

这篇关于openssl3.2 - exp - 使用默认的函数宏,在release版中也会引入__FILE__的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/945957

相关文章

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali