使用LoadLibrary的STATUS_STACK_BUFFER_OVERRUN

时间:2011-03-10 12:00:34

标签: c++ visual-studio-2008 buffer-overflow loadlibrary getprocaddress

当我用LoadLibrary加载iphlpapi.dll时,我的堆栈缓冲区溢出!我怎么解决 这个问题?!

typedef DWORD (*GetExtendedTcpTable)(PVOID, PDWORD, BOOL, ULONG, TCP_TABLE_CLASS, ULONG);   
GetExtendedTcpTable _GetExtendedTcpTable;

// load function at runtime 
HINSTANCE hstLibrary = LoadLibrary("C:\\Windows\\System32\\Iphlpapi.dll");

if(!hstLibrary)
{
    ::MessageBox(NULL,"Can't load Iphlpapi.dll!\n","Error",
            MB_OK + MB_ICONEXCLAMATION + MB_TASKMODAL);

    FreeLibrary(hstLibrary); // free memory

    exit(0);
}

// load function address from dll
_GetExtendedTcpTable = (GetExtendedTcpTable)GetProcAddress(hstLibrary, "GetExtendedTcpTable");

加载lib函数并执行正常但在某些时候我的程序抛出STATUS_STACK_BUFFER_OVERRUN异常! (某些观点:当我评论字符串操作时,错误会在几行之后发生)

当我不使用LoadLibrary和GetProcAddress(静态绑定)时 - >没有缓冲区溢出!

谢谢和问候,

leon22

2 个答案:

答案 0 :(得分:3)

您需要指定调用约定:

typedef DWORD (WINAPI * GetExtendedTcpTable)(PVOID, PDWORD, BOOL, ULONG, TCP_TABLE_CLASS, ULONG);   

VS中的默认调用约定为__cdecl,Windows API需要__stdcall。这些参数的堆栈处理方式不同,最值得注意的是__cdecl需要调用者清理而__stdcall需要调用的函数来清理。

WINAPI定义为__stdcall

参见例如Calling Conventions Demystified

答案 1 :(得分:0)

我的第一个猜测是你对库的功能使用了错误的调用约定,这可能导致堆栈损坏(在调用之后可能稍后出现的其他奇怪问题)。 检查您是否不需要在函数原型中使用__stdcall或其他内容。