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

文章目录

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

概述

在加固主程序。

主程序已经确定是release版的了。

用IDA打开,还是能看到很多相关的__FILE__的痕迹。

查这些串的引用点。

原来是openssl释放内存的函数要的参数。

因为我写程序时为了方便,就编译了一个debug版的openssl3.2.

查看openssl3.2的API定义。

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

可以看到最后调用的CRYPTO_free()是debug版的,就是需要file,line.

也就是这个原因,让编译器将__FILE__, __LINE__送给了CRYPTO_free()作为参数。从而在PE字符串表中留下了不必要的字符串。

笔记

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

c 复制代码
#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__

c 复制代码
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个参数就是文件名和行号

c 复制代码
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__了。

c 复制代码
#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

相关推荐
胡西风_foxww7 天前
Linux下编译安装Nginx
linux·运维·nginx·编译·安装·openssl·pcre
Ho_pe11 天前
ubuntu下openssl签名证书制作流程及验证demo
服务器·ubuntu·openssl
花落已飘12 天前
openssl对称加密代码讲解实战
加密·openssl
花落已飘14 天前
openssl加密算法简介
加密·openssl
石牌桥网管15 天前
OpenSSL 生成根证书、中间证书和网站证书
网络协议·https·openssl
雨雪飘零15 天前
Windows系统使用OpenSSL生成自签名证书
nginx·证书·openssl
许野平24 天前
OpenSSL:生成 DER 格式的 RSA 密钥对
服务器·网络·openssl·rsa·pem·der
Xnah_25 天前
ubuntu 20.4 安装 openssl 3.x
ubuntu·openssl
redwingz1 个月前
openssl签名报错
openssl·random
Anlige1 个月前
PHP实现OPENSSL的EVP_BytesToKey
开发语言·php·openssl·evp