Привет, проблема такая: открыл в OllyDbg iexplorer.exe или любую другую программу, но ClsProc для некоторых окон показывает неверно, типа ffff02e при выборе контекстного меню Follow ClassProc выходит есстественно в никуда. Версия 1.10. Кто-нибудь сталкивался, как вылечить такое поведение Ольки?
neutronion Верно показывает. Судя по сурцам GCL_WNDPROC определяет не только ссылку на процедуру, может быть есчо хэндл(CallProcData Handle), как в вашем случае. Этот хэндл может быть передан в CallWindowProc(). Ссылку на процедуру можно считать из описателя(CALLPROCDATA[+0x18]), в свою очередь описатель получить посредством менеджера обьектов(HM*, например HMValidateHandleNoRip(), HMValidateHandle() etc.) на основе хэндла, как это делает система: Код (Text): /* * Convert a possible CallProc Handle into a real address. They may * have kept the CallProc Handle from some previous mixed GetClassinfo * or SetWindowLong. */ if (ISCPDTAG(dwData)) { PCALLPROCDATA pCPD; if (pCPD = HMValidateHandleNoRip((HANDLE)dwData, TYPE_CALLPROC)) { dwData = pCPD->pfnClientPrevious; } }
Это чтобы получить адрес WinProc нужно лезть в ядро, что-ли? Откуда код такой? HMValidateHandleNoRip - недокументированная функция менеджера объектов?
neutronion Менеджер обьектов реализован в обоих модах. Функционал в User32.dll Посмотрите тут в коментах http://www.wasm.ru/comment.php?artcode=window_inject. Тут обсуждался не тру способ получения ссылки http://www.wasm.ru/forum/viewtopic.php?id=37943.
Спасибо, но проблему решил проще, неверно показываются ClsProc в Ольке из-за небольшого бага в программе, Оля юзает GetClassLongA, и не все WinProc верно определяются. Поэтому поступил просто, в хекс-редакторе просто нашел название этой функции в OllyDbg.exe и заменил одну букву A на W, т.е. фукция в импорт тайбл в транке стала называтся GetClassLongW. После этого корректно стали отображаться ClsProc.