劫持 ssleay32.dll

通过对应用程序中的 dll 文件进行劫持,我们可以将自己需要实现的功能注入到目标程序中。为了实现完整的 dll 劫持,我们需要对被劫持 dll 的所有导出函数进行函数地址转发,并且在自己的 dll 中加载被劫持 dll 即可。

一、劫持 ssleay32.dll

首先我们来看,被劫持的 dll 导出函数导出全局变量

首先,我们需要在 ssleay_proxy.cpp 中对原 dll 的导出函数或导出全局变量进行转发:

#pragma comment(linker, "/EXPORT:ERR_load_SSL_strings=AheadLib_ERR_load_SSL_strings,@1")
#pragma comment(linker, "/EXPORT:SSL_CIPHER_description=AheadLib_SSL_CIPHER_description,@2")
// ...
#pragma comment(linker, "/EXPORT:ssl3_ciphers=AheadLib_ssl3_ciphers,@14")
// ...

接下来我们在 x64.asm 中实现转发的跳转代码:

.DATA

EXTERN pfnAheadLib_ERR_load_SSL_strings:dq;
EXTERN pfnAheadLib_SSL_CIPHER_description:dq;
# ...
# 导出全局变量 ssl3_ciphers 无需跳转
# ...

.CODE

AheadLib_ERR_load_SSL_strings PROC
	jmp pfnAheadLib_ERR_load_SSL_strings
AheadLib_ERR_load_SSL_strings ENDP

AheadLib_SSL_CIPHER_description PROC
	jmp pfnAheadLib_SSL_CIPHER_description
AheadLib_SSL_CIPHER_description ENDP
# ...

END

接着我们返回 ssleay_proxy.cpp 加载被劫持 dll 并初始化跳转函数:

EXTERN_C PVOID AheadLib_ssl3_ciphers[6] = { 0 };

EXTERN_C
{
	PVOID pfnAheadLib_ERR_load_SSL_strings;
	PVOID pfnAheadLib_SSL_CIPHER_description;
    // ...
    PVOID pfnAheadLib_ssl3_ciphers;
    // ...
}

HMODULE g_hSsleay = NULL;

BOOL WINAPI ssleay_dll_load()
{
	g_hSsleay = LoadLibraryA("sssleay32.dll");
	if (!g_hSsleay)
	{
		MessageBoxA(NULL, "Failed to find ssleay32.dll.", NULL, NULL);

		return FALSE;
	}
	
	return TRUE;
}

FARPROC WINAPI GetAddress(LPCSTR funcName)
{
	FARPROC funcAddr = NULL;
	funcAddr = GetProcAddress(g_hSsleay, funcName);
	if (!funcAddr)
	{
		MessageBoxA(NULL, "Failed to find function address.", NULL, NULL);

		return NULL;
	}

	return funcAddr;
}

BOOL WINAPI ssealy_func_addr_init() 
{
	// 通过 GetAddress 函数获取大量 OpenSSL 相关函数的地址,并将这些地址赋值给对应的函数指针
	pfnAheadLib_ERR_load_SSL_strings = GetAddress("ERR_load_SSL_strings");
	pfnAheadLib_SSL_CIPHER_description = GetAddress("SSL_CIPHER_description");
    // ...
    pfnAheadLib_ssl3_ciphers = GetAddress("ssl3_ciphers");
	memcpy(AheadLib_ssl3_ciphers, pfnAheadLib_ssl3_ciphers, sizeof(PVOID) * 6);
    // ...
    return TRUE;
}

最后只要在 dllmain.cpp 中调用即可,被劫持 dll 的所有导出函数和导出全局变量都能被正常转发,然后我们就可以在自己的 dll 中实现相关功能。

posted @ 2025-07-21 20:54  lostin9772  阅读(33)  评论(0)    收藏  举报