Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2014.09.21;
Скачать: [xml.tar.bz2];

Вниз

Проблема с Read/WriteProcessMemory из разных модулей   Найти похожие ветки 

 
SPeller ©   (2010-01-26 05:28) [0]

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

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

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

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


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


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


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


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


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


 
SPeller ©   (2010-01-26 08:34) [2]

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

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


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


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


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


 
SPeller ©   (2010-01-26 08:43) [4]

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


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


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


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

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

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


 
SPeller ©   (2010-01-26 09:47) [6]

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


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


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


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


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

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

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


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

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

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


 
SPeller ©   (2010-01-29 03:05) [10]

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


 
vadim-86 ©   (2010-03-26 08:22) [11]

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


 
vadim-86 ©   (2010-03-26 08:22) [12]

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


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

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2014.09.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
2-1381992380
i2e
2013-10-17 10:46
2014.09.21
не изменяется курсор


15-1392553681
Разведка
2014-02-16 16:28
2014.09.21
как свернуть все процедуры и функции


2-1381845372
Алексей1
2013-10-15 17:56
2014.09.21
Login Form


15-1390288445
JohnKorsh
2014-01-21 11:14
2014.09.21
Не по Delphi (поиск алгорима)


15-1392323403
Юрий
2014-02-14 00:30
2014.09.21
С днем рождения ! 14 февраля 2014 пятница





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский