![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
over |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.7.2008 Репутация: нет Всего: нет |
Пытаюсь перехватить вызов MessageBoxW под х64, инструкцию меняю следующим кодом:
В x32 отрабатывает как нужно (и в своем приложении и через dll) В x64 работает, но на половину, т.е. в своем приложении все ок, а если перенести этот код в dll и подгрузить ее - ошибка на вызове MessageBoxW В чем может быть причина? Это сообщение отредактировал(а) Poseidon - 12.7.2013, 09:18 |
|||
|
||||
over |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.7.2008 Репутация: нет Всего: нет |
Вроде понял в чем причина,
DWORD(@NewMessageBoxW) - DWORD(pa) - (SizeOf(Pointer) + 1) - при использотивании в dll, длина прыжка > 2гб. Теперь другая проблема как обойти эту проблему, ведь всегда есть универсальный способ.. |
|||
|
||||
Illusion Dolphin |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 4 Всего: 63 |
Ошибка как минимум тут:
и тут
Для этого теперь используйте NativeInt/NativeUInt. По моему опыту такого править надо много где ![]() -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||
|
|||||
over |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.7.2008 Репутация: нет Всего: нет |
пробовал и с NativeInt, но не помогло (
|
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 4 Всего: 63 |
Значит ошибка в 17й строчке -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
over |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.7.2008 Репутация: нет Всего: нет |
тут видимо проблема в длине прыжка, которая в некоторых случаях больше 2gb
|
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 4 Всего: 63 |
Проблема в том, что длинна указателя - 8 байт вместо 4 под x86 и всё. Проверяйте вычисления, убирая Cardinal, Integer, DWORD и другую глупость. -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 4 Всего: 63 |
Кстати, я в своём коде (работает под 32/64) не заметил установки опкодов $E9 (JMP), возможно, что стоит кроме того пересмотреть алгоритм сплайсинга.
Добавлено через 6 минут и 46 секунд И не забывайте восстанавливать старые права через VirtualProtect и FlushInstructionCache рекомендуется также. -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
over |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.7.2008 Репутация: нет Всего: нет |
Уже всю голову сломал, как только не пробовал.. наверное что то упускаю.. Если не сложно, приведите рабочий участок кода перехвата.
|
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 4 Всего: 63 |
Вот такой, с вас пиво
![]()
-------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
over |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.7.2008 Репутация: нет Всего: нет |
Спасибо огромное, все заработало, правда пришлось немного допилить:
Это сообщение отредактировал(а) Poseidon - 15.7.2013, 09:26 |
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 4 Всего: 63 |
Лишнее. Смотрите Winapi.Windows.pas -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
Чучмек |
|
||||||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 7 Всего: 41 |
Перехват функции реализуется через запись инструкции jmp по адресу функции.
Для x64 один из джампов выглядит так:
В простейшем случае (без сохранения работоспособности перехватываемой функции)
Добавлено @ 19:55 p.s Поправка на Illusion Dolphin
Или через правку таблицы импорта. Это сообщение отредактировал(а) Чучмек - 22.7.2013, 20:02 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||||
|
|||||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
я писал в начало перехватываемой функции jmp -8, в расчете на то что перед функцией есть минимум 6 инструкций nop
эти 6 свободных байт заменял на call qword ptr [offset], где offset указывает на место в dos-stub куда я записал абсолютный адрес функции-диспетчера хуков. эта функция по адресу возврата на стеке (результат call qword ptr [offset]) определяет адрес хука, подменяет адрес на стеке и делает ret в хук Это сообщение отредактировал(а) bems - 23.7.2013, 13:40 -------------------- Обижено школьников: 8 |
|||
|
||||
over |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.7.2008 Репутация: нет Всего: нет |
Так и не нашел универсального способа под x64, перепробовал и через jmp и редактирование таблицы импорта..
в x64 7-ке почти все отрабатывает нормально, а под x64 XP, либо вообще не работает либо кое как (как пример, перехват MessageBoxW отрабатывает, а StartDocW из gdi32 никак не хочет). Вот и не могу понять в чем разница.. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |