基于堆栈的缓冲区溢出

Stackbased buffer overrun

本文关键字:缓冲区 溢出 堆栈 于堆栈      更新时间:2023-10-16

当运行我的代码时,我得到以下错误:

GameLauncher.exe中的0x00BA16A0未处理异常:堆栈cookie检测代码检测到基于堆栈的缓冲区溢出。

我不知道是什么原因造成的。它是由以下代码引起的:

#include "stdafx.h"
#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
int main()
{
    std::cout << "Which process would you like to close? (Include .exe)" << std::endl;
    wchar_t userProcessToFind;
    std::wcin.getline(&userProcessToFind, 20);
    HANDLE processSnapshot;
    DWORD processID = 0;
    PROCESSENTRY32 processEntery;
    processEntery.dwSize = sizeof(PROCESSENTRY32);
    processSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, processID);
    if(Process32First(processSnapshot, &processEntery) == TRUE)
    { 
        while (Process32Next(processSnapshot, &processEntery) == TRUE)
        {
            if (_wcsicmp(processEntery.szExeFile, &userProcessToFind) == 0)
            {
                HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, processEntery.th32ProcessID);
                TerminateProcess(hProcess, 0);
                CloseHandle(hProcess);
            }
        }
        CloseHandle(processSnapshot);
    }
    return 0;
}

In

wchar_t userProcessToFind;
std::wcin.getline(&userProcessToFind, 20);

您已经为单个wchar_t分配了空间,但是您试图读取最多20个字符并将其放在userProcessToFind地址的内存中。这将导致堆栈损坏,因为您将尝试写入不属于&userProcessToFind的内存。你需要做的是创建一个像

这样的数组
wchar_t userProcessToFind[20];
std::wcin.getline(userProcessToFind, 20);

或者您可以使用std::wstring,您的代码将变成

std::wstring userProcessToFind;
std::getline(std::wcin, userProcessToFind);

这样做的好处是不必为进程名使用任意大小,因为std::wstring将根据输入进行缩放。如果您需要将底层的wchar_t*传递给一个函数,您可以使用std::wstring::c_str()来获取它。