Articles of 堆

现代Windows中的ASLR和NX-bit?

当攻击者获得对x86-64上Windows指令指针的控制权时,如何保护NX位和ASLR,NX位保护是否closures? 我假设系统调用禁用此function只是在一个非ASLRed地址,并可以直接调用? 似乎堆喷洒经常被用来利用现代Windows机器(例如,在Javascript实现中的错误),显然这需要一个可执行的堆,那么在堆喷之前堆是如何可执行的呢? 是否有一些文件清楚地显示了在Windows上如何完成?

C ++堆状态差异

有一个用C ++编写的大项目。 一些gui动作(button点击)分配2 MB的内存。 这不是内存泄漏,当然内存将被释放。 但是我需要调查什么对象被分配来试图减less内存分配的大小。 所以我试图使用debuggingcrt OnBtnClick() { //breakpoint1 _CrtMemState s1; _CrtMemCheckpoint( &s1 ); //The logic itself _CrtMemDumpAllObjectsSince(&s1); _CrtMemState s2; _CrtMemCheckpoint( &s2 ); _CrtMemState s3; if ( _CrtMemDifference( &s3, &s1, &s2) ) _CrtMemDumpStatistics( &s3 ); //breakpoint2 } debugging报告说只有400 KB被分配。 但任务pipe理器中的2个断点之间的进程内存增加了2 MB。 所以,创build的转储是无用的。 你能解释一下剩下的内存分配情况吗?

find一个地址属于哪个堆?

我正在创build一个内存pipe理系统,我需要一种方法来查找在哪个堆中分配我所做的。 例如我使用HeapAlloc并使用GetProcessHeap()返回的堆作为堆分配给我希望它分配到该堆,但似乎没有。 当我使用GetProcessHeaps通过堆运行时,我发现进程堆是像0x00670000和我分配的地址是像0x0243a385什么的。 (换句话说,就是离它不远)有时它实际上可能在它之前(如0x004335ab或其他) 所以,我想知道是否有一种方法可以可靠地获取堆的起始地址(以及尽可能的最终地址?

HeapWalk块枚举返回不在堆中的地址

背景:在我的工作(运行Windows XP Embedded的工业CNC机床)中,我们有一个使用VirtualAlloc和VirtualLock系列函数将其所有内存locking到物理RAM中的过程。 我知道在这一点上,将内存locking到物理RAM中可能不会带来过去的好处(在以前的Windows版本如NT中),但是我们已经到了最后期限,所以虽然我们可能能够调查今后将其删除,这是一个很难的要求。 所以,最近我对这个进程使用的dll进行了一些改动,而这个dll又引入了更多的dll,其中一些创build了自己的堆(除了已经在进程加载的其他库中创build的dll之外)。 代码的基本结构(psuedocode)是: foreach( heap in GetProcessHeaps() ) { HeapLock(heap) if(!HeapValidate(heap)) { error/assert } while(HeapWalk(heap, &heap_entry)) { size = GetProcessWorkingSetSize() SetProcessWorkingSetSize(size,size) VirtualQuery(heap_entry, page_info) if( page_info.State != MEM_RESERVE || page_info.State != MEM_COMMIT ) { VirtualAlloc(heap_entry.ptr, heap_entry.data_size, MEM_RESERVE) } VirtualAlloc(heap_entry.ptr, heap_entry.data_size, MEM_COMMIT) if( !HeapValidate(heap, heap_entry.ptr) ) { error/assert } VirtualLock(heap_entry.ptr, heap_entry.data_size) } HeapUnlock(heap) } […]

查询,如果堆是可执行的

比方说,我有一个从HeapCreate堆或其他堆相关的函数。 我想知道给定的句柄当前是否为它设置了HEAP_CREATE_ENABLE_EXECUTE标志。 目前我没有看到API,可以做到这一点,因为唯一相关的函数HeapQueryInformation做了一些完全不同的事情。 显然,所有这些使用visual c。 这样的事情可能吗?

在C#GetWriteWatch()?

我试图用一个定时器监视一个进程的内存变化。 所以我看到GetWriteWatch API给了我更改的页面。 但是我无法在.NET中find一个例子。 有人可以帮忙吗?

给日食更多的堆空间编译项目?

我想在eclipse中编译真正大的程序(inheritance它)。 当试图构build项目时,我得到了堆空间exception,所以我不能完全编译它。 我可以更新可用于eclipse的最大堆量吗? 这个常见问题说我可以把这个ini文件(或者至less我是这样解释): -Xmx512m 给它更多的堆内存。 它是否正确? 我正在使用3.5,伽利略。 我没有看到我的eclipse ini文件中的任何-Xmx256mtypes参数开始,所以不知道这是否正确。 谢谢

为什么Windows允许创build私有堆?

我正在学习Windows中的内存pipe理。 我知道Windows中的进程默认是堆,可以在将来扩展。 此外,进程可以创build额外(私人)堆。 为什么Windows允许创build私有堆? 这种方法有什么好处? 据我了解使用默认堆(可能重新分配)就足够了。 或者也许是另一种优化重新分配的方法?

从地址查找堆或堆块或段

我一直在debugging一个软件堆腐败。 我可以将数据写入堆并获得对某些指针的控制权。 我可以在不知道这个的情况下达到我执行代码的目的,但是它让我困惑了一下。 问题是,我找不到在哪个堆中写入的块,也没有堆段。 我在Windbg下使用了: !heap -x [address] and !heap -x -v [address] ,他们没给我任何结果。 我知道有些堆可能保留另一个堆段,当第一个没有未提交的空间可用时。 但是,我已经倾倒了所有的堆段,而且找不到与我正在查找的基地址类似的任何人。 这似乎有点奇怪,有没有进程或应用程序特定的堆有这些块!

C ++ / Windows:HeapAlloc()用于无竞争的每线程堆

我有一个使用boost::thread的multithreading应用程序。 出于性能原因,我想每个线程都有一个独立的堆。 我可以使用HeapCreate()创build一个堆,但是我不清楚如何将它连接到CRT库,以便new和malloc在创build的堆上分配内存。 如何才能做到这一点?