精华内容
下载资源
问答
  • Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任务管理器(Task Manager), 资源监视器...

     

    Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon)

    微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任务管理器(Task Manager) 资源监视器(Resource Manager), 性能监视器(Performance Monitor), 还有SysInternals工具,  RamMap, PoolMon用以分析内存问题。
    本文简单介绍上述工具的快速使用方法,如果需要了解深入了解,请参考微软相关链接。

    任务管理器

    Windows 系统可以使用任务管理器进行内存监控,监控可以显示出详细的内存占用的进程。尤其是在性能中检查虚拟内存的使用情况,已提交虚拟内存(Commited Bytes)/虚拟内存上限(Commit Limit)。如果已提交非常接近上限,那么系统会出现性能问题。
    Windows 2008 R2
    示例
    通过查看还可以添加各类内存指标进行检查,请重点检查工作集(进程物理内存占用) 提交大小(非保留的虚拟内存空间)


    Windows 2012
    示例

    资源监视器

    通过任务管理器,可以打开资源监视器 Resource Manager进一步检查内存的使用情况,尤其是每个进程的使用情况。对于各个进程而言,请重点关注"提交(KB)"内存的大小,监控是否有进程消耗过多资源。

    物理内存的使用包含以下几个部分:
    为硬件保留的内存
    正在使用:由进程、驱动程序、操作系统使用的内存
    已修改:内容必须写入磁盘才能用于其它用途的内存
    备用:包含未使用的缓存数据和代码的内存
    可用:不包含任何有价值数据,以及当进程、驱动程序、操作系统需要更多的内存时优先使用的内存

    缓存:当文件被打开时,系统会把文件保存在缓存中,才以便下次迅速读写。Windows 2008 R2及以后,对这个缓存的使用也做了限制:有一部分物理内存不会被缓存使用,保证系统即使在缓存过大的时候,也有可用物理内存,满足程序使用需求。

    性能监视器

    Performance Monitor 性能监视器是Windows 监控,收集系统资源消耗的重要工具。
    监控性能消耗
    通过添加指定的计数器,可以实时检查系统资源消耗的情况

    此外,还可以通过"数据收集搜集"->"用户定义" 手工添加各类计数器,例如Logical Disk, Memory, System, Processor, Process来收集系统各类资源的实时运行情况,同时通过采样间隔来定义收集频率。例如,如果机器有内存泄露问题很久才能复现,可以配置采样间隔为5秒,如果机器很容易出现CPU异常,那么可以配置采样间隔为1秒。

    RamMap, Process Explorer

    有时在任务管理器的监控窗口中查看不到占用内存异常的进程,但物理内存显示已经负载的状态了。
    这种情况一般是系统底层有占用内存的情况,可以通过RamMap工具查看系统内存的占用情况,该工具是微软官方的软件,相关信息及下载地址如下: https://technet.microsoft.com/en-us/sysinternals/ff700229.aspx

    下载后直接运行,就可以查看任务管理器中不显示的系统占用内存的情况。
    详细介绍:
    Introduction to the new Sysinternals tool: RAMMap

    Process Explorer 也可以查看进程的详细资源占用情况,例如打开后也可以查看到进程的各类内存资源使用情况。

    Pool Monitor

    对于WIndows内核而言,其两项核心的内存资源为non paged pool(非页面缓冲池)以及paged pool (页面缓冲池)。操作系统出现内存性能问题,很可能是上述2个资源消耗殆尽。虽然通过上述提到的工具可以查看到资源消耗的情况,但是如果需要定位是系统哪个Tag消耗的资源,需要使用PoolMon来定位。
    poolmon
    使用参考:
    https://technet.microsoft.com/en-us/library/cc737099(v=ws.10).aspx

    检查perfmon 日志来定位究竟是哪个Pool Tag导致的资源消耗殆尽,例如一个案例,检查到IoDn tag导致资源消耗完,通过如下命令定位到是SafeDogFileGuard.sys, 而后通过修正该应用解决。

    关于Tag的介绍,请参考微软官方Blog
    http://blogs.technet.com/b/askperf/archive/2008/04/11/an-introduction-to-pool-tags.aspx

     

    来自:https://help.aliyun.com/knowledge_detail/41079.html

    转载于:https://www.cnblogs.com/time-is-life/p/7401245.html

    展开全文
  • Windows内存清理工具实现——从现象到本质

    万次阅读 多人点赞 2016-10-16 15:58:30
    Windows内存清理工具实现——从现象到本质

    目前,有很多Windows清理内存的工具,如Wise Memory Optimizer、 MemoryZipperPlus、SweepRAM等,360安全卫士、腾讯电脑管家、鲁大师等等系统工具也带有清理内存的功能,这类工具数不胜数。


    这些工具主要使用的是Windows提供的API:EmptyWorkingSet 或SetProcessWorkingSetSize 进行所谓的内存清理。


    EmptyWorkingSet 强制将进程工作集中的内存尽可能多地移动到页面文件中 (Removes as many pages as possible from the working set of the specified process.),函数原型为:

    BOOL WINAPI EmptyWorkingSet(
      _In_ HANDLE hProcess
    );


    SetProcessWorkingSetSize可以设置进程工作集中内存的最大最小值(Sets the minimum and maximum working set sizes for the specified process.),函数原型为:

    BOOL WINAPI SetProcessWorkingSetSize(
      _In_ HANDLE hProcess,
      _In_ SIZE_T dwMinimumWorkingSetSize,
      _In_ SIZE_T dwMaximumWorkingSetSize
    );
    其中,如果后两个参数均为-1时,该函数效果与EmptyWorkingSet相同(The working set of the specified process can be emptied by specifying the value (SIZE_T)–1 for both the minimum and maximum working set sizes. This removes as many pages as possible from the working set. The EmptyWorkingSet function can also be used for this purpose.)。


    使用上面介绍的API,我们就可以实现自己的内存清理工具:


    第一步,提升程序进程权限,两个API函数均需要传入要清理的线程句柄,该句柄可以通过OpenProcess得到,而如果进程权限不够,将导致打开进程失败。

    准确地说,不是提升权限,而是把令牌中禁用的权限启用。

    MSDN上指出,如果需要打开其他进程并获得所有权限,需要启用SeDebugPrivilege权限(To open a handle to another process and obtain full access rights, you must enable the SeDebugPrivilege privilege)。

    启用SeDebugPrivilege权限,需要用到的API有:OpenProcessTokenLookupPrivilegeValueAdjustTokenPrivilegesCloseHandle,以上API用法MSDN上有详细的讲解(Enabling and Disabling Privileges in C++),下面给出相关代码:

    BOOL EnableDebugPrivilege()
    {
    	BOOL bRet = FALSE;
    	HANDLE hToken;
    	if (::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
    	{
    		LUID luid;
    		if (::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
    		{
    			TOKEN_PRIVILEGES tp;
    			tp.PrivilegeCount = 1UL;
    			tp.Privileges[0].Luid = luid;
    			tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    			if (::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
    			{
    				bRet = TRUE;
    			}
    		}
    		::CloseHandle(hToken);
    	}
    	return bRet;
    }

    第二步,遍历系统所有进程,调用上面两个函数传入的只是一个进程的句柄,也就是说每次调用只针对于一个进程的内存空间,所以我们还需要遍历整个系统的所有进程,然后获取每个进程的句柄,将该句柄当做参数传入上面两个函数。遍历系统所有进程有很多方法,这里使用ToolHelp API获取。其中用到3个API函数:CreateToolhelp32SnapshotProcess32FirstProcess32Next,以上API用法MSDN上已有详细介绍与例子(Taking a Snapshot and Viewing Processes),这里也不再一一介绍。


    第三步,在上面遍历过程中调用EmptyWorkingSet 或 SetProcessWorkingSetSize 来实现“清理内存”。下面给出实现代码,由于EmptyWorkingSet需要包含Psapi.h头文件,代码中使用的是SetProcessWorkingSetSize函数

    BOOL EmptyAllProcess()
    {
    	BOOL bRet = FALSE;
    	HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0UL);
    	if (hProcessSnap != INVALID_HANDLE_VALUE)
    	{
    		PROCESSENTRY32 pe32;
    		pe32.dwSize = sizeof(PROCESSENTRY32);
    		if (::Process32First(hProcessSnap, &pe32))
    		{
    			do
    			{
    				HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
    				if (hProcess)
    				{
    					::SetProcessWorkingSetSize(hProcess, (SIZE_T)-1, (SIZE_T)-1);
    					::CloseHandle(hProcess);
    				}
    			} while (::Process32Next(hProcessSnap, &pe32));
    			bRet = TRUE;
    		}
    		::CloseHandle(hProcessSnap);
    	}
    	return bRet;
    }


    第四步,为了更加直观的显示优化后所腾出的内存空间,可以在清理前后获取系统内存使用状态。这里用到GlobalMemoryStatusEx函数来获取当前系统物理内存与虚拟内存。GlobalMemoryStatus函数也可以获取,但在内存超过4GB时得到的结果不正确(On computers with more than 4 GB of memory, the GlobalMemoryStatus function can return incorrect information, reporting a value of –1 to indicate an overflow. )。显示内存使用状况代码参考于MSDN上例子,这里使用宏以便于控制内存大小输出时的单位,代码实现如下:

    #define MB_UNIT
    
    #if defined KB_UNIT
    
    #define DIV	(1024ULL)
    #define WIDTH	10
    
    #elif defined MB_UNIT
    
    #define DIV	(1024ULL * 1024ULL)
    #define WIDTH	7
    
    #elif defined GB_UNIT
    
    #define DIV	(1024ULL * 1024ULL * 1024ULL)
    #define WIDTH	4
    
    #endif
    
    void PrintMemoryStatus()
    {
    	MEMORYSTATUSEX statex;
    	statex.dwLength = sizeof(statex);
    	if (::GlobalMemoryStatusEx(&statex))
    	{
    #if defined KB_UNIT
    		_tprintf(_T("There is  %*ld percent of memory in use.\n"), WIDTH, statex.dwMemoryLoad);
    		_tprintf(_T("There are %*I64d total KB of physical memory.\n"), WIDTH, statex.ullTotalPhys / DIV);
    		_tprintf(_T("There are %*I64d free  KB of physical memory.\n"), WIDTH, statex.ullAvailPhys / DIV);
    		_tprintf(_T("There are %*I64d total KB of paging file.\n"), WIDTH, statex.ullTotalPageFile / DIV);
    		_tprintf(_T("There are %*I64d free  KB of paging file.\n"), WIDTH, statex.ullAvailPageFile / DIV);
    		_tprintf(_T("There are %*I64d total KB of virtual memory.\n"), WIDTH, statex.ullTotalVirtual / DIV);
    		_tprintf(_T("There are %*I64d free  KB of virtual memory.\n"), WIDTH, statex.ullAvailVirtual / DIV);
    		//_tprintf(_T("There are %*I64d free  KB of extended memory.\n"), WIDTH, statex.ullAvailExtendedVirtual / DIV);
    #elif defined MB_UNIT
    		_tprintf(_T("There is  %*ld percent of memory in use.\n"), WIDTH, statex.dwMemoryLoad);
    		_tprintf(_T("There are %*I64d total MB of physical memory.\n"), WIDTH, statex.ullTotalPhys / DIV);
    		_tprintf(_T("There are %*I64d free  MB of physical memory.\n"), WIDTH, statex.ullAvailPhys / DIV);
    		_tprintf(_T("There are %*I64d total MB of paging file.\n"), WIDTH, statex.ullTotalPageFile / DIV);
    		_tprintf(_T("There are %*I64d free  MB of paging file.\n"), WIDTH, statex.ullAvailPageFile / DIV);
    		_tprintf(_T("There are %*I64d total MB of virtual memory.\n"), WIDTH, statex.ullTotalVirtual / DIV);
    		_tprintf(_T("There are %*I64d free  MB of virtual memory.\n"), WIDTH, statex.ullAvailVirtual / DIV);
    		//_tprintf(_T("There are %*I64d free  MB of extended memory.\n"), WIDTH, statex.ullAvailExtendedVirtual / DIV);
    #elif defined GB_UNIT
    		_tprintf(_T("There is  %*ld percent of memory in use.\n"), WIDTH, statex.dwMemoryLoad);
    		_tprintf(_T("There are %*I64d total GB of physical memory.\n"), WIDTH, statex.ullTotalPhys / DIV);
    		_tprintf(_T("There are %*I64d free  GB of physical memory.\n"), WIDTH, statex.ullAvailPhys / DIV);
    		_tprintf(_T("There are %*I64d total GB of paging file.\n"), WIDTH, statex.ullTotalPageFile / DIV);
    		_tprintf(_T("There are %*I64d free  GB of paging file.\n"), WIDTH, statex.ullAvailPageFile / DIV);
    		_tprintf(_T("There are %*I64d total GB of virtual memory.\n"), WIDTH, statex.ullTotalVirtual / DIV);
    		_tprintf(_T("There are %*I64d free  GB of virtual memory.\n"), WIDTH, statex.ullAvailVirtual / DIV);
    		//_tprintf(_T("There are %*I64d free  GB of extended memory.\n"), WIDTH, statex.ullAvailExtendedVirtual / DIV);
    #endif
    		_tprintf(_T("\n"));
    	}
    	else
    	{
    		_tprintf(_T("GlobalMemoryStatusEx Failed!\n\n"));
    	}
    }


    程序为了编写简便,创建为控制台工程,编译链接后运行效果截图如下:



    程序及完整源代码下载链接点击打开链接



    //------------------------------------------------------------华丽的分割线-----------------------------------------------------------------------------------------------------//



    看了上面介绍,相信大部分人会认为这是一个非常有效的方法,因为使用后确实能够腾出大量内存空间,明显减小内存的占用率。可是,你看了下文就不得不承认,这种伎俩其实只是一种假象,所有的努力可能只会让事情变得更加糟糕!不信继续往下看。


    为什么这么说呢,因为使用上面两个API并不能减小程序的内存,只不过是强制将正在运行的程序工作内存写入Windows的页面文件。这样看似内存使用量是下降了,其实只不过是把内存转到了慢速存储之中。当程序再次需要使用到这些内存时,由于内存已经移入页面文件,虚拟内存位置被标记为了"不存在",这时将会产生一个缺页中断,也就是平常说的页面错误,这时,操作系统又不得不重新将这些内存由硬盘移到内存之中。


    比如你正在看一个视频,现在先暂停它,接着使用内存清理工具来“清理”内存。清理完后,你再回过头来继续播放刚才的视频或者执行其他程序,你会发现,程序略有卡顿(对于小内存机器尢为明显),在卡顿过后,系统的内存又有所上升,一段时间后,内存使用量也慢慢又涨上去了。如果你在刚清理后使用某个程序并在系统任务管理器里查看进程信息(需要在“选择列”对话框中选中“页面错误增量”),你会发现该程序的页面错误增量会明显地增加,这个时候系统就正在把内存重新搬回到工作集内存之中。



    曾有一文就这一问题进行了深入分析,在此一并贴出:


    Why Memory Optimizers and RAM Boosters Are Worse Than Useless


    Many companies want to sell you “memoryoptimizers,” often as part of “PC optimization” programs. These programs areworse than useless — not only will they not speed up your computer, they’llslow it down.

    Such programs take advantage ofinexperienced users, making false promises about boosting performance. Inreality, your computer knows how to manage RAM on its own. It will use RAM toincrease your computer’s performance — there’s no point in having RAM sitempty.

    Is Your Computer’s RAM Filling Up? That’s Good!

    Memory optimizers are based on amisunderstanding. You may look at your computer’s RAM and see it filling up —for example, you may have 4 GB of RAM and see that 3 GB is full with only 1 GBto spare. That can be surprising to some people — look how bloated modernversions of Windows are! How are you ever going to run additional programs withso little memory available?

    In reality, modern operating systems arepretty good at managing memory on their own. That 3 GB of used RAM doesn’tnecessarily indicate waste. Instead, your computer uses your RAM to cache datafor faster access. Whether it’s copies of web pages you had open in yourbrowser, applications you previously opened, or any other type of data youmight need again soon, your computer hangs onto it in its RAM. When you needthe data again, your computer doesn’t have to hit your hard drive — it can justload the files from RAM.

    Crucially, there’s no point inhaving RAM empty. Even if your RAM is completely full and your computer needsmore of it to run an application, your computer can instantly discard thecached data from your RAM and use that space for the application. There’s nopoint in having RAM sit empty — if it’s empty, it’s being wasted. If it’s full,there’s a good chance it can help speed up program loading times and anythingelse that would use your computer’s hard drive.

    Notice that very little RAM is actually“free” in the screenshot below. The RAM is being used as a cache, but it’sstill marked as available for any program that needs to use it.


    In the past, full RAM did indicate aproblem. If you were running Windows Vista on a computer with half a gig ofRAM, you could feel the computer constantly slowing down — it had to constantlyread and write to the hard drive, using the hard drive’s page file as aninefficient replacement for RAM. However, modern computers generally haveenough RAM for most users. Even low-end computers generally ship with 4GB of RAM, which should be more than enough unless you’re doing intensive gaming,running multiple virtual machines, or editing videos.

    Even if RAM was a problem for you,there’s no reason to use a memory optimizer. Memory optimizers are snake oilthat are useless at best and harmful at worst.

    How Memory Optimizers Work

    When you use a memory optimizer, you’llsee your computer’s RAM usage go down. This may seem like an easy win — you’vedecreased RAM usage just be pressing a button, after all. But it’s not thatsimple.

    Memory optimizers actually work in oneof two ways:

    ·        They call the EmptyWorkingSet Windows API function,forcing running applications to write their working memory to the Windows pagefile.

    ·        They quickly allocate a large amount of memory tothemselves, forcing Windows to discard cached data and write application datato the page file. They then deallocate the memory, leaving it empty.

    Both of these tricks will indeed free upRAM, making it empty. However, all this does is slow things down — now theapplications you use will have to get the data they need from the page file,reading from the hard drive and taking longer to work. Any memory being usedfor cache may be discarded, so Windows will have to get the data it needs fromthe hard drive.

    In other words, these programs free upfast memory by forcing data you need onto slower memory, where it will have tobe moved back to fast memory again. This makes no sense! All it accomplishes isselling you another system optimization program you don’t need.


    If Windows needs RAM, it will push datato the page file or discard cached data, anyway. This all happens automaticallywhen it needs to — there’s no point in slowing things down by forcing it to happenbefore it's necessary.

    Like PC cleaning apps, memoryoptimizers are a scam. They appear to be doing something positive to people whodon’t understand how memory management works, yubut they’re actually doingsomething harmful.

    How to Actually “Optimize” Your Memory

    If you do want to have more availableRAM, skip the memory optimizer. Instead, try to get rid of running applicationsyou don’t need — purge unnecessary programs from your system tray, disableuseless startup programs, and so on.

    If you do need more RAM for what you do,try buying some more RAM. RAM is pretty cheap and it’s not too hard to installit yourself using one of the RAM installing guides available online.Just ensure you buy the correct type of RAM for your computer.



    文中从内存管理本质上来说明这类工具不仅无所贡献,反而可谓“越帮越忙”。对于现在的操作系统,并不是你内存空闲越多,程序运行就越快。就算你系统内存真快耗尽,操作系统也会自动丢弃掉一部分缓存数据,同时将不频繁访问的页面从工作集中移出,暂时保存在内存中的“转换列表”中,或者进一步换出到页面文件中,进而腾出内存供需要的程序使用,我们自己完全没有理由也没有必要在不必要的时候做这些“无厘头”的事。


    至此,想必大家已经从本质上明白了这类工具实现的原理。对于上面实现的程序只是一个简单地展示,不建议(甚至可以说不应该)用于解决内存不足的问题。


    基本网上各种内存清理工具使用的都是这种方式,更有甚者,有的工具还允许设置自动清理,可以每隔一定时间自动进行清理...... 当你明白了这些工具的实现原理后,你会发现,这类工具仅仅是一个骗局而已,它们只不过是在安慰那些不懂内存管理的人罢了。


    除了使用这种方式,有些清理工具还进行暴力清理。这类工具自身大量申请内存,快速填满你的内存,这时你的系统会被迫丢弃大量缓存文件,同时调用转换操作,将其他进程的内存空间转换到虚拟内存。之后,这类工具再突然释放所申请的大量空间,让你觉得腾出了很大的空间。使用这种暴力清理可能腾出比使用EmptyWorkingSet或SetProcessWorkingSetSize更多的内存空间,但在所谓的“清理”过程中的开销也更大,最终同样也只是让事情变得更加糟糕。


    也有部分清理内存工具,还会结束掉一些闲置的服务与一些进程的残留项以进一步减小内存使用量(如360安全卫士)。这种方式确实有一定的效果,能真正地腾出一定的空间。但由于可以结束的进程是有限的,而且这些进程所占内存往往不会太大,通常也不能够腾出多少内存空间,优化效果并不会明显。


    综上,我个人认为,无论清理内存或者内存优化之类的工具没什么实用价值与实际意义。对于内存小的机器,它们只会更加拖慢你的系统;对于大内存的机器,就算它们有用,你也没有理由去用。你清或者不清,它就在那里,不增不减。所以,要解决内存不够的问题,最有效的方式就是——插内存条插内存条插内存条


    展开全文
  • Windows内存泄漏检测工具总结

    千次阅读 2018-03-26 00:02:24
    Windows内存泄漏检测工具总结 前言 Win32内存管理结构 Windows内存泄漏检测工具简单原理 Windows内存泄漏检测工具总结 前言 做C\C++开发的时候,经常会有程序内存(资源)泄漏的Bug。对于这类Bug,除了提高...

    Windows内存泄漏检测工具总结



    前言

    做C\C++开发的时候,经常会有程序内存(资源)泄漏的Bug。对于这类Bug,除了提高代码质量(比如使用智能指针),我们也可以借助一些调试工具来帮助我们定位问题。
    Windows平台下还是有很多的内存泄漏检测工具的,这里我自己总结一下使用过的免费工具(基本上是开源的)。
    



    Win32内存管理结构

    Win32内存管理可以分为三层。VM,Win32 Heap, CRT Heap。在我们一般的编程过程中,使用的是CRT Heap(malloc,free,new,delete)
    这里写图片描述



    Windows内存泄漏检测工具简单原理

    这里我简单描述自己了解的一种实现原理,只是一种可行的方法

     1. 远程注入DLL到目标进程(VLD是需要目标进程链接DLL的),关键部分就是这个DLL中的逻辑

     2. 当DLL被加载目标进程的时候,HOOK内存分配释放函数。当程序分配内存的时候,记录下这次分配的信息(分配的位置,大小,调用堆栈等)到一个map中,当程序释放内存的时候,就从map中移除。

     3. 在进程退出或者某个时候,可以遍历map,打印出还没有被释放的内存块的信息。

    上面只是一个简单的描述,具体的话涉及的问题还比较多,当然资料也很多。

    远程注入:关键点CreateRemoteThread
    HOOK:HOOK有现成库detours,minihook等
    调用堆栈:可以使用DbgHelp相关的函数来加载pdb,解析堆栈StackWalk64



    Windows内存泄漏检测工具总结

    • Leak Mon

      • 这个是CodeProject上的一个开源工具,远程注入不需要修改代码
    • VLD

      • 这个工具使用的时候需要修改源代码
    • UMDH

      • 这个工具是MS提供的检测用户模式的内存泄露问题,使用起来稍微有点麻烦,需要对目标进程抓取两份log,然后比较
      • gflags /i ImageName +ust (create user mode stack trace)
      • umdh -p:124 -f:log1.txt
      • umdh -p:124 -f:log2.txt
      • umdh log1.txt log2.txt > logcompare.txt
    • Dr.Memory

      • 这个工具是基于动态二进制插桩工具DynamoRIO开发的,检测原理不一样。并且能够检测到更多的错误(比如读取未初始化的内存,访问越界等),但我感觉对程序性能影响很大
    • CRT

      • VC++的CRT库在Debug下支持内存的诊断的,我们在调试程序,进程退出的时候看到”Detected memory leaks! Dumping objects -> “就说明有内存没有正确的释放,当时看不到代码行号。
      • #define _CRTDBG_MAP_ALLOC 定义_CRTDBG_MAP_ALLOC宏,能使得CRT库打印行号。
      • 同时CRT库提供丰富的API来支持调试,包括HOOK分配和释放函数。
    • Debug Dialog, Leak Diag.

    展开全文
  • Poolmon是一款windows平台下的核心内存泄漏检测工具,核心内存windows分配给系统内核或驱动所需的内存空间,核心分页池内存或未分页池内存如果增长表明你的电脑存在核心内存泄漏,如果达到了windows所分配的最大值,...
  • POOLMON 内存分析工具

    2018-01-29 15:24:57
    WINDOWS 内存泄露分析工具 。经典工具!!!!!!!
  • 转载自公众号:取证者联盟 ...在与供应商进行沟通以后我们了解到,市面上国内外几款比较流行的取证软件虽然支持针对某信Windows端的解析,但是大多还是需要用户扫描二维码进行登录。对内存解析...

    转载自公众号:取证者联盟

    目录

    1. 前言

    2. 准备工作

    3. 内存镜像解析

    4. 踩过的坑和感悟

    5. 技术要点总结

    前言

    某年月日,我司在项目中遇到了一个不太常见的需求:根据内存镜像解析电脑中的某即时通讯软件(即“某信”)的聊天信息。在与供应商进行沟通以后我们了解到,市面上国内外几款比较流行的取证软件虽然支持针对某信Windows端的解析,但是大多还是需要用户扫描二维码进行登录。对内存的解析只有一家产品支持,实际试用后也遗憾地失败了。事后分析可能是与操作系统及某信软件的版本有关。

    然后我们又在网上进行了一系列的搜索。虽然确实查到许多资料描述如何解析某信数据库,但是其中对内存镜像进行解析的内容几乎为零。我们只能摸着前人的石头过河。所幸走了不少弯路以后还算有了一个比较满意的结果,这才有了这篇小文。

    ****对于Volatility内存分析工具有一定认识的朋友可以直接查看结尾的技术总结。***

    准备工作

    登录某信后,使用FTK Imager制作笔记本电脑的内存镜像。

    1. 登录某信
    图片
    1. 使用FTK Imager制作内存镜像
    图片
    图片

    在这里有几个选项,是否需要保存pagefile(“Include pagefile”)以及是否需要制作AD1格式的镜像(“Create AD1 file”)。经过测试在解析密钥时并不需要这两个功能,所以为了节约时间我们这里就不用勾选了,毕竟pagefile的文件大小还是很惊人的。

    图片
    图片

    这一步大概花费5到10分钟,根据内存的大小不同。

    3. 拿到内存镜像后不要就觉得万事大吉了。密钥密钥光有钥匙没有门我们不是一顿白忙活?

    请记得制作笔记本电脑镜像并从中导出某信数据库文件。具体步骤这里就略过了。某信数据库的默认地址为“C:\Users[Windows User Name]\Documents\WeChat Files[WeChat account]”。

    图片

    内存镜像解析-Volatility

    铺垫了这么久终于可以上主菜了。这里解析内存镜像我们还是用Volatility。

    Volatility是一款开源内存取证框架,能够对导出的内存镜像进行分析,通过获取内核数据结构,使用插件获取内存的详细情况以及系统的运行状态。

    软件官网:https://www.volatilityfoundation.org

    Github主页:https://github.com/volatilityfoundation/volatility

    1. 分析内存镜像并判断适用的配置文件(profile)

    命令:volatility.exe –f memdump.mem imageinfo

    图片

    Volatility需要从用户配置文件中读取内核的相关信息,通过这些信息来定位内存中的关键信息并对其进行解析。因此我们需要获取用户配置文件,且这些配置文件需与你要分析的内核版本相匹配,其中包含了内核数据结构以及调试符号。

    这里个人将用户配置文件理解成一张地图,而内存镜像就是对应的实际地形。由于不同的系统版本对应不同的地图,只有使用相匹配的地图Volatility才能带我们找到想要的东西。

    这一步会花费几个小时起步的漫长时间。所以个人建议先对笔记本硬盘镜像进行分析,然后根据操作系统的信息判断适用的配置文件会比较快。

    2. 寻找某信进程的pid

    命令:volatility.exe –f memdump.mem --profile=****Win7SP1x64** pslist >pslist.txt

    *粗体下划的****Win7SP1x64****为配置文件名称,使用时请根据上一步结果/具体情况进行修改。

    图片
    图片

    这里我们使用命令pslist将内存镜像中所有进程列表导出到文档文件pslist.txt中,然后查找WeChat.exe即可得到该进程pid为1072。需要注意的是在实际分析过程中这一步可能得到两个或者更多的pid。我们可以通过后面的分析或者根据是否存在Exit时间排除已经退出的进程。

    1. 寻找WeChatWin.dll的基址

    命令:volatility.exe –f memdump.mem --profile= Win7SP1x64 ldrmodules –p 1072 >dlllist.txt

    图片
    图片

    使用插件ldrmodules将pid为1072的进程所有关联的dll文件导出并查找WeChatWin.dll的基址。此处为0x53210000。

    这里我们也可以使用Volatility自带的命令dlllist来查询关联的dll文件。但是插件ldrmodules可以关联部分隐藏的dll,功能更为强大。实际项目过程中我们发现部分电脑ldrmodules可以找到,而部分电脑ldrmodules无法找到而dlllist可以找到。所以个人建议两个命令都试下。

    1. 查询某信数据库密钥

    命令:

    volatility.exe –f memdump.mem --profile= Win7SP1x64 volshelll

    cc(name=”WeChat.exe”)

    dd(****base address of** WeChatWin.dll + **fixed offset****, length=4)

    #返回结果为数据库密钥地址

    db(****address of decryption key****, length=32)

    #返回结果为数据库密钥

    图片

    Volshell插件用来进入Volatility的shell,在该shell中可以使用cc命令来切换当前进程,使用dd和db命令分别打印dwords和具体bytes内容到屏幕上。

    这里我们使用volshell插件进入shell以后使用cc命令切换到WeChat.exe进程。由于数据库密钥地址为32位的dwords,所以这里我们使用dd命令将该地址打印到屏幕上。需要注意的是这里我们使用“0x17734a8”来获取密钥地址,该常数根据某信版本不同可能有所变化。在这里测试所使用的版本为某信2.9.5.41。该常数的获取需要一定的逆向工程知识,网上也有很多现成的资料,在这里就不赘述了。

    (参考:《PC某信逆向:两种姿势教你解密数据库文件》,链接地址:https://blog.csdn.net/qq_38474570/article/details/96606530)

    最后在获得密钥地址为“0x07bc0a70”后,我们使用db命令将32位的密钥打印到屏幕上。

    5. 使用获得的密钥即可解密数据库并查看具体内容。

    图片

    某信Windows端使用sqlcipher进行加密,配置环境后可以使用SQLite进行解密。

    那么关于某信数据库的解析到这里也就圆满结束了,剩下的工作就是将数据导出成Excel等易于查看的格式。

    踩过的坑和感悟

    首先是第一个大坑,不知道是不是我搜索的姿势有误,但是感觉内存取证方面的资料明显没有计算机取证/移动端取证那样丰富,仅有的资料也有些晦涩难懂。不知是否因为内存取证门槛相对较高?市场上能找到的也就Volatility一家,官网最近的更新时间还是2016年。虽然Github上能看到他们家在推新版本(Volatility3,Github主页:https://github.com/volatilityfoundation/volatility3),但是插件的开发好像还没有跟上。我们一度由于陈旧的版本缺少支持最新Windows系统的profile而无法进行。然后在实际项目中也遇到了由于不同系统版本和某信版本导致的众多小问题。例如在查询某信进程pid时碰到多个进程,需要仔细分辨那些是之前已经结束的进程而那个才是当前运行的。在查询WeChatWin.dll时也有ldrmodules插件无法查询到而Volatility自带的命令dlllist反而可以找到的情况。在最后查询数据库密钥时也碰到因为某信版本不同而需要回头对硬盘镜像中的某信程序进行逆向分析来判断所使用的常数。只有掌握全面的技能才能兵来将挡水来土掩。

    絮絮叨叨说了这么多,其实最后真正有用的可能也就7行命令和1个常数。但是为了得到这些,我们却花了将近一周的时间。好在最后结果还是相对圆满的,达到的客户的期望。之前对内存取证的认识一直停留在做题的阶段。打比赛也好能力验证也罢,对这方面的内容似乎都只是浅尝辄止。在平时工作中就更少碰到这方面的需求了。通过这次小小的研究也让我对内存取证和某信解析有了更加深入的认识。之前也一直听说某信Windows端的数据库密钥只有在登陆时才能从服务器端或者从内存中获取,但是没有碰到过实践的机会。直到这次项目的实际需求对我们提出挑战。可见很多知识平时一直只停留在知其然的地方是远远不够的。只有平时多做积累,掌握各种工具,在实际遇到挑战时才能有足够的能力解决问题。

    技术要点总结

    1. 分析内存镜像并判断适用的配置文件(profile)

    volatility.exe –f memdump.mem imageinfo

    2. 寻找某信进程的pid

    volatility.exe –f memdump.mem --profile=Win7SP1x64 pslist >pslist.txt

    1. 寻找WeChatWin.dll的基址

    volatility.exe –f memdump.mem --profile= Win7SP1x64 ldrmodules –p pid of WeChat.exe >dlllist.txt

    1. 查询某信数据库密钥

    volatility.exe –f memdump.mem --profile= Win7SP1x64 volshell

    cc(name=”WeChat.exe”)

    dd(base address of WeChatWin.dll + fixed offset, length=4)

    #返回结果为数据库密钥地址

    #常数fixed offset根据某信版本不同可能有所变化。在这里测试所使用的版本为某信2.9.5.41,该常数为“0x17734a8”。

    db(address of decryption key, length=32)

    #返回结果为数据库密钥

    原文地址:https://mp.weixin.qq.com/s/KQ58rPQC2id-9nO81b-EzA

    展开全文
  • 介绍了一种使用Volatility从内存镜像中分析某即时通讯软件Windows端数据库密钥的方法。
  • 使用RAMMAP的工具检查,发现这些内存被Metafile占用了,经查阅Metafile是系统缓存的一部分同时也包含了NTFS的数据。。此问题可能是由于Server 2008中为保证服务器性能不限制系统缓存,服务器系统长时间执行I/O,系统...
  • Java内存泄露分析和解决方案及Windows自带查看工具
  • JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
  • IBM内存分析工具JCA

    2013-03-08 17:10:41
    IBM提供的分析javacore和dump的内存分析工具,非常好用。
  • 内存分析工具

    千次阅读 2018-05-26 00:38:49
    内存分析工具1. 测试工具介绍1.1测试目的java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统...
  • MemoryAnalyzer-1.9.2.20200115-win32.win32.x86_64 虚拟机内存分析工具,直接解压 打开MemoryAnalyzer.exe 进去后左上角导入.hprof文件即可查看详情
  • dumpAnalyzer图形化进行内存分析,可以很方便的知道系统里面什么地方存在性能瓶颈
  • JAVA内存泄露分析和解决方案及WINDOWS自带查看工具Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,...
  • DATE: 2020-1-11 1、Windows平台内存调试工具 windbg/ umdh/ htrace ...【Tools】WinDbg–gflags调试工具使用方法 ...【Tools系列】windows自带内存检测工具CRTDBG ...【Tools系列】Windows调试分析工具:Sysint...
  • Committed: 进程向OS宣称要使用的内存大小(在虚拟内存进行了分配),基本上都不等于进程实际使用的物理内存大小。一是其中统计了进程所链接的所有动态库的空间,比如标准C库,而实际上OS在内存中只加载一份C库的代码...
  • MAT内存分析工具,支持版本windows64位。 最近项目遇到oom问题,上传一下查询oom的心酸路程的工具
  • 如你所知,内存泄露是... 当然,在Windows服务器中止之前,一般有其他内存泄露的症状。主要值得注意的是来自服务器服务(SRV组件)的系统事件日志的入口。尤其是注意:  Event ID 2019: The server was unable t...
  • Android内存分析工具:Memory Profiler

    万次阅读 2018-01-11 11:04:08
    Android Memory Profiler内存工具
  • Windows自带Java内存查看工具以及命令

    千次阅读 2020-08-27 15:18:31
    jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。 jmap:打印出某个java进程(使用pid)内存内的所有’对象’的情况(如:产生那些对象,及其数量)。 jconsole:一个...
  • Unity性能分析和内存分析工具

    千次阅读 2020-01-09 10:14:08
    引言 Unity是商业引擎,除了购买源代码...针对内存分析,还有一个官方工具MemoryProfiler。本文主要针对这两个工具,做一下简单介绍加实际分析。 编辑器Profiler Profiler窗口在Windows/Profiler菜单下可以打开,...
  • 推荐:可以解决Windows内存问题的工具 时间:2012-06-27 16:51来源:未知 作者:admin 点击: 791次
  • 无 论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方。 Android tools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使用eclipse的ADT插件,...
  • 这一章主要介绍利用工具进行android APP内存泄露分析
  • Windows 内存泄露分析

    2018-01-25 09:41:28
    转自:... 1.准备工具:windbg 2.准备环境:需要设置windbg符号路径 ...内存泄露分析demo [cpp] view plain copy int _tmain(intargc, _TCHAR* 
  • vmmap是一个进程虚拟和物理内存分析实用程序。它显示进程提交的虚拟内存类型以及操作系统分配给这些类型的物理内存量(工作集)的细分。除了内存使用的图形化表示,vmmap还显示摘要信息和详细的进程内存映射。强大的...
  • 工具为MAT(MemoryAnalyzerTools)win32位工具,用来做内存分析,供JAVA或android开发者使用,解压即用相当方便,喜欢的小伙伴可以试试!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 177,712
精华内容 71,084
热门标签
关键字:

windows内存分析工具