gpt4 book ai didi

c++ - 基于堆栈的缓冲区溢出

转载 作者:行者123 更新时间:2023-11-30 05:38:08 26 4
gpt4 key购买 nike

运行我的代码时出现以下错误:

Unhandled exception at 0x00BA16A0 in GameLauncher.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.

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

#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;
}

最佳答案

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()得到它。

关于c++ - 基于堆栈的缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32922071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com