Hook HeapAlloc遇到的问题

来源:互联网 发布:87版红楼梦配乐知乎 编辑:程序博客网 时间:2024/06/06 00:00

描述一下问题:


想在程序申请内存时获得当前进程占用内存大小,以便找到内存占用瞬间增大的点

实现方式是在hook heapalloc时,调用GetProcessMemoryInfo获取内存大小并记录,结果导致GetProcessMemoryInfo后边的所有代码都没法进入

问题找了很久,之后求助开发宋大侠找到了原因,原来,GetProcessMemoryInfo内部实现的时候也会调用heapalloc导致递归执行无限循环了。

最终如下:

CRITICAL_SECTION g_csHeapAlloc = {0};class t_autoCS {public:t_autoCS(CRITICAL_SECTION& p_cs){::InitializeCriticalSectionAndSpinCount(&p_cs, 0x800000100);}}g_autoCSHeapAlloc(g_csHeapAlloc);LPVOID __stdcall MineHeapAlloc(   HANDLE hHeap ,   DWORD dwFlags ,    SIZE_T dwBytes   ){static volatile LONG s_bHooking = 0;::EnterCriticalSection(&g_csHeapAlloc);if ( ::InterlockedIncrement(&s_bHooking) != 1 ){LPVOID res = Real_HeapAlloc(hHeap, dwFlags,dwBytes);::InterlockedDecrement(&s_bHooking);::LeaveCriticalSection(&g_csHeapAlloc);return res;}s_bHooking = true;SYSTEMTIME st = {0};GetLocalTime(&st);HANDLE handle = GetCurrentProcess();PROCESS_MEMORY_COUNTERS pmc;GetProcessMemoryInfo(handle, &pmc, sizeof(pmc));LPVOID res = Real_HeapAlloc(hHeap, dwFlags,dwBytes);::InterlockedDecrement(&s_bHooking);::LeaveCriticalSection(&g_csHeapAlloc);return res;}
第一次进函数的时候,肯定是程序中的调用,而第二次进入,则肯定是这个函数里边调用,则不再进行HOOK而是直接调用真正的 HeapAlloc
0 0