劫持 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 中实现相关功能。