使用结构时访问冲突
Access Violation when using struct
我正在尝试连接 OpenSSL 的 int SSL_connect(SSL *s)
方法。 OpenSSL 1.0.2l 版本。
这是源代码:
目标:
打印任何 SSL_SESSION
成员(如 ssl_version 或 master_key)
问题:
尝试访问挂钩方法中的 SSL *s
参数时出现访问冲突异常。我的结构有什么问题吗?我不认为我必须映射 SSL
和 SSL_SESSION
的所有成员,因为我发现 SSLHook 库不会这样做 - link
我能够成功注入 dll,当我不尝试访问参数时它确实有效。
代码:
typedef struct
{
int ssl_version;
unsigned char master_key[48];
} SSL_SESSION;
typedef struct
{
SSL_SESSION* session;
} SSL;
typedef int(__cdecl* SSL_METHOD_TEMPLATE)(SSL* s);
SSL_METHOD_TEMPLATE Target_SSL_connect = (SSL_METHOD_TEMPLATE)0x14018c540;
int __cdecl Detour_SSL_connect(SSL* s) {
int ssl_version = s->session->ssl_version;
std::string message = "done. ssl_version: " + std::to_string(ssl_version);
MessageBoxA(HWND_DESKTOP, message.c_str(), "title", MB_OK);
return Target_SSL_connect(s);
}
VOID AfterAttach()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)Target_SSL_connect, Detour_SSL_connect);
long lError = DetourTransactionCommit();
if (lError != NO_ERROR) {
MessageBoxA(HWND_DESKTOP, std::to_string(lError).c_str(), "err", MB_OK);
}
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
AfterAttach();
}
return TRUE;
}
I don't think I must map all of the members of SSL and SSL_SESSION, because I found that SSLHook library doesn't do this
如果您仔细观察,您会发现它们并没有映射所有内容,而是保持成员顺序,并且复制所有成员,直到结构中与它们相关的“点”为止。忽略结构注入中的原始填充几乎总是非常关键,而且我猜通常是未定义的行为,所以你很幸运能在这里获得相当确定的崩溃 :) 所以你可以提供完整的结构或至少提供一个简化的结构根据您的会话成员指针“之前”的最终填充。
我正在尝试连接 OpenSSL 的 int SSL_connect(SSL *s)
方法。 OpenSSL 1.0.2l 版本。
这是源代码:
目标:
打印任何 SSL_SESSION
成员(如 ssl_version 或 master_key)
问题:
尝试访问挂钩方法中的 SSL *s
参数时出现访问冲突异常。我的结构有什么问题吗?我不认为我必须映射 SSL
和 SSL_SESSION
的所有成员,因为我发现 SSLHook 库不会这样做 - link
我能够成功注入 dll,当我不尝试访问参数时它确实有效。
代码:
typedef struct
{
int ssl_version;
unsigned char master_key[48];
} SSL_SESSION;
typedef struct
{
SSL_SESSION* session;
} SSL;
typedef int(__cdecl* SSL_METHOD_TEMPLATE)(SSL* s);
SSL_METHOD_TEMPLATE Target_SSL_connect = (SSL_METHOD_TEMPLATE)0x14018c540;
int __cdecl Detour_SSL_connect(SSL* s) {
int ssl_version = s->session->ssl_version;
std::string message = "done. ssl_version: " + std::to_string(ssl_version);
MessageBoxA(HWND_DESKTOP, message.c_str(), "title", MB_OK);
return Target_SSL_connect(s);
}
VOID AfterAttach()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)Target_SSL_connect, Detour_SSL_connect);
long lError = DetourTransactionCommit();
if (lError != NO_ERROR) {
MessageBoxA(HWND_DESKTOP, std::to_string(lError).c_str(), "err", MB_OK);
}
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
AfterAttach();
}
return TRUE;
}
I don't think I must map all of the members of SSL and SSL_SESSION, because I found that SSLHook library doesn't do this
如果您仔细观察,您会发现它们并没有映射所有内容,而是保持成员顺序,并且复制所有成员,直到结构中与它们相关的“点”为止。忽略结构注入中的原始填充几乎总是非常关键,而且我猜通常是未定义的行为,所以你很幸运能在这里获得相当确定的崩溃 :) 所以你可以提供完整的结构或至少提供一个简化的结构根据您的会话成员指针“之前”的最终填充。