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

相关文章

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

PyCharm如何设置新建文件默认为LF换行符

《PyCharm如何设置新建文件默认为LF换行符》:本文主要介绍PyCharm如何设置新建文件默认为LF换行符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm设置新建文件默认为LF换行符设置换行符修改换行符总结PyCharm设置新建文件默认为LF

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab