[英]Stackbased buffer overrun
運行我的代碼時,出現以下錯誤:
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;
}
在
wchar_t userProcessToFind;
std::wcin.getline(&userProcessToFind, 20);
您已經為單個wchar_t
分配了空間,但是您嘗試讀取最多20個字符並將其放置在內存中的userProcessToFind
地址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()
來獲取它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.