为什么我的Interop代码抛出一个" Stack cookie检测代码检测到基于堆栈的缓冲区溢出"例外?

时间:2015-08-05 12:10:31

标签: c# c++ arrays memory limits

因为我在内存读取等方面有点麻烦。我使用1000000个元素创建了byte []数组,这样它们就可以存储1MB的数据。我使用这些1000000元素阵列中的大约750英寸,我在检索数据时逐一添加,例如:获取内存的MB,添加到列表,获得下一个MB。但它只是失败了溢出异常。那么List是否可以包含多少元素的实际限制,或者是否存在"数据"限制到列表?如果我没有超过此限制,可能导致此问题发生?

编辑:异常的屏幕截图 enter image description here

EDIT2:我从一个c ++ dll调用一个函数来读取下一个1MB并返回一个指向该数组的指针

EDIT3: C#部分

    private static void FetchNextBuffer()
    {
        IntPtr pRaw = Wrapper.GetNextMB();
        byte[] buff = new byte[1000000];
        Marshal.Copy(buff, 0, pRaw, 1000000);
        RawDataFetch.Add(buff);
    }

包装

[DllImport("Dumper.dll")]
public static extern IntPtr GetNextMB();

<小时/> c ++部分 .cpp文件

extern byte * __cdecl GetNextMB()
{
    if (!VarsSet) SetVars();
    byte buffer[1000000];
    ReadProcessMemory(pHandle, (void*)Address, &buffer, sizeof(buffer), 0);
    Address = Address + sizeof(buffer);
    return buffer;
}

.h文件

extern "C"
{
    __declspec(dllexport) DWORD __cdecl GetPID();
    __declspec(dllexport)  byte * __cdecl GetNextMB();
}

EDIT4:感谢您提供所有见解和快速反应的人(如果他们在场外还有女孩:S)

EDIT5:现在全部修复,程序正在滚动 [![在此处输入图像说明] [2]] [2]

2 个答案:

答案 0 :(得分:3)

好的,代码很明显。

您在C ++端分配一个本地数组,并返回指向该数组的指针。如果您习惯使用本机代码,那应该已经敲响了警钟 - 您没有返回指向当地人的指针!

然后你不恰当地使用Marshal.Copy来杀死它 - 而不是从你从C ++代码中获得的数据中复制(这可能是格式错误的,因为你正在返回指向本地的指针......),您将C#字节数组复制到从C ++函数获得的指针 - 覆盖C ++堆栈。吊杆。

但是,我不明白你为什么只使用C ++库来调用ReadProcessMemory - 为什么不直接调用呢?我正在https://github.com/Luaancz/AutoPoke的小工具中做到这一点。

答案 1 :(得分:1)

是的,但它取决于你有多少记忆。

如果你有足够的内存来添加超过Int32.MaxValue的值会破坏List<T>类。

这可能是OverflowException的原因。

如果您的内存不足我会期待OutOfMemoryException

您获得的错误不是C#异常,而是C ++异常,investigated in this question

您在C ++代码中做错了什么,或者您从C#中错误地调用了它。请注意,这与我认为已经回答的原始问题非常不同。