Нужно найти утечку объектов создаваемых функцией. Для этого я каждому объекту сделал свойство адрес возврата из ф-и создания (можно приблизительно сказать где утечка) Вот например для памяти: Код (Text): #include <windows.h> #include <crtdbg.h> class CMalloc { public: CMalloc() { _RPT1(0, "[%p] create\n", this); } virtual bool __stdcall CreateBuffer(unsigned uSize, void** ppBuffer) { // было бы замечательно если бы был оператор __return_address return CreateBufferEx(0, uSize, ppBuffer); } bool CreateBufferEx(const void* retaddr, unsigned uSize, void** ppBuffer) { *ppBuffer = malloc(uSize); return *ppBuffer != NULL; } }; #include <pshpack1.h> struct CreateBufferInfo { const void* retaddr; CMalloc* pThis; unsigned uSize; void** ppBuffer; }; #include <poppack.h> bool __stdcall CreateBufferEntry(CreateBufferInfo* p) { _RPT2(0, "[%p] hook, ra = %p\n", p->pThis, p->retaddr); return p->pThis->CreateBufferEx(p->retaddr, p->uSize, p->ppBuffer); } __declspec(naked) bool __stdcall CreateBufferHook(CMalloc* pThis, unsigned uSize, void** ppBuffer) { __asm { lea eax, [esp] push eax call CreateBufferEntry ret } } void main() { CMalloc mem; void* ptr; // mem.CreateBuffer(1, &ptr); CreateBufferHook(&mem, 1, &ptr); // осталось теперь подменить vtable // mem.CreateBuffer = CreateBufferHook; } Проблема в том что naked ф-и нельзя сделать для члена класса я переопределил ф-ю vtable (для virtual bool __stdcall CreateBuffer) и пришлось писать на C. Может я изобрел велосипед и есть более простой способ? жаль нет оператора типа __return_addr - адрес возврата из ф-и. что можете предложить для х64?
естественно есть =) но это тоже не плюсы впрочем. стандартный стековый фрейм (вниз - более младшие адреса) argn ... arg0 ret ebp local0 ... localn и соответственно берем адрес либо arg0 либо local0 тогда ret = *(DWORD *)((DWORD)&arg0 - 4) = *(DWORD *)((DWORD)&local0 + 8) соответственно, подгоняем под разные случае, размер элементов и тд. К примеру может быть поднят флаг /GS и тогда придется во втором случае адаптировать оффсет, тк на стеке между local и ebp будет ebp поксоренный с security cookies. И в общем для arg0 нужно смотреть какая конвенция вызовов, но это не ваш случай. Ps только заметил x64 ... ну там возможно тоже самое, я их не ковырял =) только размеры элементов другие =)
да, это проще, если есть исходники. я просто делал hook для одного сом'a... type Function(param0, param1, ...) { size_t ret_addr = *((size_t*)¶m0 - 1); } class A { type __stdcall/__cdecl Function(param0, param1, ...) { size_t ret_addr = *((size_t*)¶m0 - 2); // в стеке еще указатель на vtable, для __thiscall он в ecx } }; работает и для x64. Спасибо.