【问题标题】:Debugging the stack corruptuion around a variable in windbg围绕windbg中的变量调试堆栈损坏
【发布时间】:2019-08-01 07:37:07
【问题描述】:

我正在尝试在 Windows 中使用 .dll 来测试 Windows 中的自定义登录。这是source of dll

注意: 这更像是一个一般的调试问题(可能不需要我正在使用的 .dll 插件的工作)

Dll 加载正常(我可以在 Windows 登录屏幕上直观地验证这一点)但是当我输入密码和 Otp 并提交时,它会给出错误提示 stack around the variable onelinew is corrupted。据我所知,这意味着它要么是因为写入的数据超出缓冲区可以容纳的量,要么是因为试图引用不在内存中的东西?

我尝试附加windbg 调试器以查找堆栈损坏的来源并尝试查看堆栈帧/调用堆栈/寄存器值等各种事物......但我被困在如何理解这是因为我对这种调试方式有点陌生(现在 2 天)。

我将附上错误和堆栈调用的屏幕截图,希望有人能告诉从这里继续往哪里走。

此插件创建的日志文件中的最后一条日志是MultiotpCredential::Dll compiled with SKIP_OTP_CHECK !!!!!!!!",即defined here

出现在错误框中的变量onelinewdefined here

void PrintLn(const wchar_t *message, int line)
{
    INIT_ZERO_CHAR(date_time, MAX_TIME_SIZE);
    GetCurrentTimeAndDate(date_time);
    WriteLogFile(date_time);

    // MessageBox(NULL, (LPCWSTR)message, NULL, MB_ICONWARNING);

    wchar_t onelinew[1024];
    swprintf_s(onelinew, sizeof(onelinew), message, line);

    //  OutputDebugStringW(message);
    WriteLogFile(onelinew);
    WriteLogFile("\n");
}

【问题讨论】:

    标签: windows debugging dll windbg


    【解决方案1】:

    你已经完成了更困难的部分,那就是找到罪魁祸首。错误消息告诉您存在基于堆栈的缓冲区溢出。

        wchar_t onelinew[1024];
        swprintf_s(onelinew, sizeof(onelinew), message, line);
    

    请注意,在您的情况下,由于代码使用 wchar_t,因此每个字符有 2 个字节。简而言之,您的缓冲区可以包含最多 1024 wchar_t。如果message 大于 1024 wchar_t(2048 个字节,包括空字符),那么您的缓冲区就会溢出。

    swprintf_s 的文档不是很清楚,但如果我没记错的话(我认为swprintf 的文档更清楚)第二个参数是字符数,而不是字节数。

    问题在于sizeof 运算符将返回字节数(在本例中为 2048),它告诉 API 缓冲区是 2048 个字符,但您的缓冲区只有 1024字符

    因此您应该这样指定它(或使用_countof 宏):

        wchar_t onelinew[1024];
        swprintf_s(onelinew, sizeof(onelinew) / sizeof(wchar_t), message, line);
    

    【讨论】:

    • @Neista 非常感谢,这行得通!!。过去两天我的头被撞了:D
    • 如果您在 C++17 代码库中工作,std::size 是 MSVC 特定的 _countof() 宏的一个很好的替代品。
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2023-04-06
    相关资源
    最近更新 更多