【问题标题】:STATUS_STACK_BUFFER_OVERRUN with LoadLibrarySTATUS_STACK_BUFFER_OVERRUN 与 LoadLibrary
【发布时间】:2011-03-10 12:00:33
【问题描述】:

当我使用 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

【问题讨论】:

  • 库头文件中GetExtendedTcpTable()的确切定义是什么?

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


【解决方案1】:

您需要指定调用约定:

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

VS 中默认的调用约定是__cdecl,Windows API 需要__stdcall。它们在处理参数堆栈的方式上有所不同,最明显的是__cdecl 需要调用者进行清理,而__stdcall 需要被调用的函数进行清理。

WINAPI 定义为__stdcall

参见例如Calling Conventions Demystified

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 2011-07-09
      • 2013-10-07
      • 1970-01-01
      相关资源
      最近更新 更多