![]() |
eXeL@B —› Программирование —› Как получить адрес оконной функции в Windows Seven 64? |
Посл.ответ | Сообщение |
|
Создано: 28 февраля 2010 16:32 · Личное сообщение · #1 Пытаюсь получить адреса оконных функций в Windows Seven в 64 битном режиме и не получается функция стандартная API-шная выдвет код ошибки - доступ запрещен. В 32-битном режиме в той же операционке, тоже приложение, но откомпилированное под 32-бита работает и возвращает адреса, запускаю тоже приложение (но 64-битное) в режиме отладке - функция не выполняется. В чем может быть проблема (привилегии отладчика и админа у меня есть)? ![]() |
|
Создано: 28 февраля 2010 16:41 · Личное сообщение · #2 |
|
Создано: 28 февраля 2010 17:37 · Личное сообщение · #3 Сначала я перечислял все окна для процесса к которому подключаюсь отладчиком (с этом проблем нету), а затем для каждого hwnd выполнял слудющие операции (примерно так): address = GetClassLongA(hwnd, GCL_WNDPROC); if (GetClassNameA(hwnd, nameA, 255) == 0) nameA[0] = 0; if (address > 0xffff0000) { address = GetClassLongW(hwnd, GCL_WNDPROC); if (GetClassNameW(hwnd, nameW, 255) == 0) nameW[0] = 0; } Это для 32-битного приложения, умничить по поводу того что GetClassLong работает только с 32-битными приложениями не надо, я мсдн читал ![]() Но замена на GetClassLongPtr не дает адекватного результата, пишет достут запрещен. ![]() |
|
Создано: 28 февраля 2010 18:38 · Поправил: Clerk · Личное сообщение · #4 |
|
Создано: 28 февраля 2010 18:45 · Личное сообщение · #5 > Прежде чем писать отладчик нужно уметь работать с осью. На сколько помню оконную процедуру > можно получать только из текущего процесса. Извлекайте инфу из разделяемой памяти шадова, либо > исполняете код в контексте целевого процесса. вы не правы, код которой я привел выше, прекрасно работает в 32-битном режиме, мне его просто нужно портировать в 64-битный режим. Отладчик у меня замечательно работает в 32- и 64-битном режиме, просто начал его наворачивать для удобного перехвата оконных функций. В 64-битном режиме не получается ![]() ![]() |
|
Создано: 28 февраля 2010 18:46 · Личное сообщение · #6 |
|
Создано: 28 февраля 2010 18:54 · Личное сообщение · #7 |
|
Создано: 28 февраля 2010 19:00 · Личное сообщение · #8 |
|
Создано: 28 февраля 2010 19:11 · Личное сообщение · #9 |
|
Создано: 28 февраля 2010 19:19 · Личное сообщение · #10 Mag_3d Отладчиком пройдите и узнайте где ошибка. В x86 NT много инфы содержится в секции шадова и такой код возвращает ссыль на процедуру без обращения к ядру: Code:
Как в x64 мне не известно, впрочем продебажить вызов минутное дело ![]() ![]() |
|
Создано: 01 марта 2010 08:37 · Личное сообщение · #11 |
|
Создано: 01 марта 2010 14:40 · Поправил: Mag_3d · Личное сообщение · #12 |
|
Создано: 01 марта 2010 15:20 · Личное сообщение · #13 Clerk Пробую собрать твой код, но компилятор ругается на _imp__IsMenu Как её определить? Code:
----- Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes ![]() |
|
Создано: 01 марта 2010 15:37 · Поправил: mak · Личное сообщение · #14 Mag_3d ![]() Вызов функции SetClassLongPtr с индексом GCLP_WNDPROC создает подкласс класса окна, который воздействует на все окна, впоследствии созданные с классом. Приложение может поделить на подклассы системный класс, но не должно делить на подклассы класс окна, созданный другим процессом. Таким образом, ошибка Access Denied может быть тогда когда окно не от этого процесса ,но окно зарегистрировано в этом процессе. Выход из такого положения это инжект в чужой процесс. Coderess msdn.microsoft.com/en-us/library/ms647989(VS.85).aspx ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 01 марта 2010 15:41 · Личное сообщение · #15 Coderess Обычный прототип определите для редактора связей(обычно это динамически определяют): Code:
Ну или так: Code:
Константы HM* это для извлечения ссылки на обьект из таблицы описателей на основе описателя(хэндла), здесь не нужно, ибо группа функций менеджера HMValidateHandle() и пр. это сами делают. Если вручную, то так: Code:
Вобще извлечение инфы из памяти менеджера обьктов(gpHmgrSharedHandleSection в ядре) это тру техника. ![]() |
|
Создано: 01 марта 2010 18:32 · Личное сообщение · #16 |
![]() |
eXeL@B —› Программирование —› Как получить адрес оконной функции в Windows Seven 64? |