- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
已阅读this interesting article在概述调试堆损坏的技术时,我开始想知道如何根据自己的需要调整它。基本思想是提供一个自定义的 malloc() 来分配整页内存,然后为这些页面启用一些内存保护位,以便程序在写入时崩溃,并且可以在行为中捕获有问题的写指令.示例代码是Linux下的C(mprotect()用于开启保护),我很好奇如何将其应用于原生C++和Windows。 VirtualAlloc() 和/或 VirtualProtect() 看起来很有前途,但我不确定使用场景会是什么样子。
Fred *p = new Fred[100];
ProtectBuffer(p);
p[10] = Fred(); // like this to crash please
我知道在 Windows 中存在用于调试内存损坏的专门工具,但我仍然很好奇是否可以使用这种方法“手动”执行此操作。
编辑:此外,这在 Windows 下是个好主意,还是只是一种有趣的智力练习?
最佳答案
是的,您可以使用 VirtualAlloc 和 VirtualProtect 设置内存部分以防止读/写操作。
您将不得不重新实现 operator new
和 operator delete
(以及它们的 [] 亲戚),以便您的内存分配由您的代码控制。
请记住,它只会以每页为基础,每次分配您将使用(至少)三页值(value)的虚拟内存 - 在 64 位系统上不是一个大问题,但可能如果您在 32 位系统中有很多分配,则会导致问题。
大致需要做的事情(您实际上应该找到构建 Windows 的页面大小 - 我太懒了,所以我将使用 4096 和 4095 来表示页面大小和页面大小-1 - 你还需要比这段代码做更多的错误检查!!!):
void *operator new(size_t size)
{
Round size up to size in pages + 2 pages extra.
size_t bigsize = (size + 2*4096 + 4095) & ~4095;
// Make a reservation of "size" bytes.
void *addr = VirtualAlloc(NULL, bigsize, PAGE_NOACCESS, MEM_RESERVE);
addr = reinterpret_cast<void *>(reinterpret_cast<char *>(addr) + 4096);
void *new_addr = VirtualAlloc(addr, size, PAGE_READWRITE, MEM_COMMIT);
return new_addr;
}
void operator delete(void *ptr)
{
char *tmp = reinterpret_cast<char *>(ptr) - 4096;
VirtualFree(reinterpret_cast<void*>(tmp));
}
正如我所说的那样——我没有尝试编译这段代码,因为我只有一个 Windows 虚拟机,而且我懒得下载编译器并查看它是否真的编译。 [我知道这个原理是有效的,因为我们在几年前的工作中做过类似的事情]。
关于c++ - 是否可以保护内存区域免受 WinAPI 的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14595989/
我正在尝试进行一些高度递归的模拟和数学运算,在某些边缘情况下,我会溢出调用堆栈并获得 EXC_BAD_ACCESS 信号。将算法更改为迭代形式是不可行的,因为它是很多遗留代码。并且递归深度限制没有用,
我们有一堆调用 Python C/C++ 绑定(bind)的测试。我们用 Nose 运行这些测试: nosetests myapp ..... ----------------------------
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
我对不使用 SSL 保护 PHP session 的主题很感兴趣。 令我惊讶的是,如果中间人嗅探用户和服务器之间交换的数据包,即使已通过身份验证,也很容易窃取 session 。我知道有一些策略可以限
我对不使用 SSL 保护 PHP session 的主题很感兴趣。 令我惊讶的是,如果中间人嗅探用户和服务器之间交换的数据包,即使已通过身份验证,也很容易窃取 session 。我知道有一些策略可以限
我正在创建一个 API,下面的方法通过查询参数中的员工姓名或所有员工获取员工。但是,[FromQuery(Name = "name")] 是否可以防止 SQL 注入(inject),不确定这是否是 .
我想保护我的应用免受 XSS 攻击。我可以使用任何开箱即用的功能吗?一个外部库来保护整个应用程序的请求?还是 Tomcat 过滤器/阀? 谢谢! 最佳答案 您可以使用的选项: > Java Encod
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
这个问题在这里已经有了答案: How to prevent spoofing of DLLs in .NET (2 个答案) 关闭 7 年前。 我想保护我的 DLL 不被修补程序修改。听说对DLL进
我刚刚在我的 Azure Web 应用程序上安装了 SSL 证书。我已使用可用的 Symantec SSL 检查器工具检查安装是否正确 here . 在结果中我可以读到 BEAST This serv
我正在为一组网站设计 API。这些站点非常相似(有点像 StackOverflow、SuperUser 和 ServerFault),它们有一个共享的后端是有意义的。因此,我们决定尝试使用一个很好的
我正在开发一个使用 SQLite 作为数据库管理系统的 PHP 应用程序,MySQL 和 PostgreSQL 等不是替代方案(尽管我真的很想使用 pgsql),因为我希望设置对初学者非常友好并且为零
我们使用 native Apache Portable Runtime SSL 连接器在 Tomcat 6 上运行 Web 应用程序以提供 SSL 连接。我们如何配置服务器以防止 BEAST 攻击?。
我有一个聊天窗口(使用 )有时需要获取多行条目。到现在为止,我只是简单地替换了传入的 \n与 并显示带有 .append() 的文本.不幸的是,我发现留下一个裸体 .append()基于用户输入允许
我已经研究过这个主题,但找不到任何相关信息 我们是否需要采取任何安全措施来保护 javax.xml.transform.Transformer 免受 XML 外部实体攻击? 我做了以下,它似乎扩展了
例如,我有一个用 Node.js 编写的 REST api 端点。非技术用户可以从网页访问,也可以使用 curl 命令通过命令行访问。它不需要任何凭据即可访问它,因为它旨在对任何人开放以供访问。我要解
我托管了我的博客 Amazon Web Services S3(托管静态文件)。我是否应该添加任何策略或措施来进一步保护我的帐户免受 DDoS/高带宽消耗? 最佳答案 我认为这是一场音乐会。不是在技术
我有一个网站使用数据库为网站用户存储信息。所有 mysql 数据库调用都是 SELECT。我使用 $_GET 将变量从一个页面传递到另一个页面,然后在 mysql SELECT 调用中使用这些变量。我
我刚读过 http://www.ruby-lang.org/en/news/2013/02/06/rdoc-xss-cve-2013-0256/ ,关于 RDoc 中 XSS 攻击的报告。 我使用的是
我正在处理一个相当复杂的数学库,当客户端代码使用 auto 时,我发现了一个令人讨厌的错误。在创建一个最小的复制案例来询问有关它的问题的过程中,我意识到我可以单独使用标准库来复制类似的东西。看这个简单
我是一名优秀的程序员,十分优秀!