Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с Read/WriteProcessMemory из разных модулей


SPeller ©   (2010-01-26 05:28:00) 

Всем доброго времени суток!

Использую перехват API функций путем правки таблиц импорта. Использую пример с rsdn, переведенный в паскаль. Запись адресов перехватчиков производится через WriteProcessMemory во всех загруженных на текущий момент модулях, плюс перехват LoadLibrary и GetProcAddress чтобы править в них таблицы и подсовывать адреса перехватчиков во вновь загружаемых модулях. Всё работает отлично и замечательно на все 100%, проверено много раз.

Проблема возникла в том, что когда я пытаюсь сделать 2 перехватчика на одну и ту же функцию (один в ехе программы, второй в динамически загружаемой длл), то при вызове работает только второй. Оно вроде бы и логично, ведь он ставился вторым и затер значения, записанные первым хуком. Но беда в том, что когда я во втором хуке перед записью делаю ReadProcessMemory по тому адресу, куда собрался писать адрес перехватчика, я неизменно получаю оттуда адрес оригинальной системной функции. Хотя он на этот момент, по идее, должен был быть переписан на адрес перехватчика первым хуком.

Вот и вопрос - почему так и как побороть? Где грабли?


Сергей М.   (2010-03-26 08:27:00) [1]

Удалено модератором
Примечание: Offtopic


vadim-86   (2010-03-26 08:22:00) [2]

Удалено модератором
Примечание: Offtopic


vadim-86   (2010-03-26 08:22:00) [3]

Удалено модератором
Примечание: Offtopic


SPeller   (2010-01-29 03:05:00) [4]

Задача у них - перехватить функции, которые в процессе своей работы вызывает система, чтобы заменить логику работы системной функции своей логикой. Однин код использовал такой механизм в экзешнике, второй в дллке. Сейчас всё это вынес в одну общую длл, проблема ушла.


Сергей М.   (2010-01-27 10:52:00) [5]

> загружаю свою длл с таким же кодом перехвата, как и в ехе

Нафига в программе два (!) модуля, делающих одно и то же ?)


SPeller   (2010-01-27 00:41:00) [6]

Блин, я загружаю свою длл с таким же кодом перехвата, как и в ехе, который и переписывает импорты свои и то, что еще не успел переписать код в ехе. Получаются в одном процессе 2 конкурирующих перехватчика. Кто что успеет себе "урвать". Это есть плохо.

А в произвольной бибилиотеке функции перехватываются за счет того, что в программе уже глобально перехвачены вызовы LoadLibrary/Ex, и после вызова оригинала сразу же проверяется ее таблица импорта с целью поиска функций, которые нужно перехватить.


Сергей М.   (2010-01-26 09:51:00) [7]


> В загружаемой библиотеке такой же код перехвата


Какой может быть "код перехвата" в произвольнойбиблиотеке ?


SPeller   (2010-01-26 09:47:00) [8]

В загружаемой библиотеке такой же код перехвата, как и в exe. И ему там совсем не известно, какие таблицы были модифицированы.


Сергей М.   (2010-01-26 09:24:00) [9]


> Алгоритм пробегает по всем iat всех загруженных в данный
> момент модулей


Ну пробежал он одинраз в момент Х. Заменил интересующие тебя точки входа на нужные, сохранив оригинальные.

Зачем второй-то раз по ним бежать ?

Ты же везде перехватил LoadLibrary, значит получил возможность отслеживать запросы на загрузку новых модулей. По факту обнаружения этих запросов ты вызываешь оригинальную LoadLibrary для запрошенного к загрузке модуля, впосле чего проверяешь, модифицирована ли уже тобой его IAT (т.е. модуль уже бы загружен в момент Х) и если нет, то модифицируешь.


SPeller   (2010-01-26 08:43:00) [10]

Алгоритм пробегает по всемiat всех загруженных в данный момент модулей. Второй раз получить доступ хотелось для того, чтобы отрабатывали оба хука, а не только один


Сергей М.   (2010-01-26 08:37:00) [11]


> получается что второй хук не узнает, что за функция изначально
> крылась в записи таблицы


Так а зачем ты лезешь в IAT этого модуля двараза ?
Непонятно мне ..


SPeller   (2010-01-26 08:34:00) [12]

Похоже что проблема совсем в другом и проблема озвучена совершенно некорректно. Дело в том, что я не заметил что нахождение записи в таблице импорта происходит путем сравнения адреса каждой записи с адресом оригинала. Совпало - переписали. Вот и получается что второй хук не узнает, что за функция изначально крылась в записи таблицы, поскольку адрес там уже вписан левый.

Теперь вот прихожу к выводу что надо этот код перехвата выносить в одну общую длл, поскольку второму хуку не судьба узнать какие записи в таблицах были переписаны первым хуком.


Сергей М.   (2010-01-26 08:25:00) [13]


> один в ехе программы, второй в динамически загружаемой длл


У каждого PE-модуля своя таблица импорта.


> ReadProcessMemory по тому адресу, куда собрался писать адрес перехватчика, я неизменно получаю оттуда адрес оригинальной системной функции


Ну а что там еще быть должно, если конкретно к этойIAT ты обращаешься в первый раз ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо