c# - 为什么我的 Interop 代码会抛出 "Stack cookie instrumentation code detected a stack-based buffer overrun"异常?

标签 c# c++ arrays memory limit

因为我在内存读取等方面有点乱。我制作了包含 1000000 个元素的 byte[] 数组,这样它们每个可以存储 1MB 的数据。我最终使用了这 1000000 个元素数组中的大约 750 个,我在检索数据时一个一个地添加,例如:获取 MB 内存,添加到列表,获取下一个 MB。但它只是因溢出异常而失败。那么 List 可以包含多少元素是否存在实际限制,或者 List 是否存在“数据”限制?如果我没有超过这个限制,是什么导致了这个问题的发生?

编辑:异常截图 enter image description here

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

编辑3: 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:现在全部修复,程序正在运行

最佳答案

好的,代码让它显而易见。

您在 C++ 端分配一个本地数组,并返回一个指向它的指针。如果您习惯于使用 native 代码,那应该已经敲响了警钟——您不会返回指向本地的指针!

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

但是,我不明白您为什么要使用 C++ 库来调用 ReadProcessMemory - 为什么不直接调用它呢?我在我的小工具中就是这样做的 https://github.com/Luaancz/AutoPoke .

关于c# - 为什么我的 Interop 代码会抛出 "Stack cookie instrumentation code detected a stack-based buffer overrun"异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31832145/

相关文章:

c++ - 有没有办法使用 transform 而不是 for_each 来实现这个?如果是,这样做真的更好吗?

javascript - 设置对象键 JavaScript 值时的括号位置

java - 将 JSON 对象数组转换为列表<String>

c# - 如何消除可空 boolean 值的使用

c# - 需要在c#中计算存储在Azure存储中的文件的SHA1哈希值

c# - WP7 : Type. GetMethods 抛出 MethodAccessException。这个错误有解决方法吗?

c++ - 我应该用 GSL 跨度替换 (void*, size) 吗?

C++ <algorithm> : copy map<A, B> 计算?

javascript - 字数组转字符串

c# - 使用 VSTO 获取 excel 列的默认数据类型