簡體   English   中英

基於堆棧的緩沖區溢出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM