Конференция "WinAPI" » Проблема с Read/WriteProcessMemory из разных модулей
 
  • SPeller © (26.01.10 05:28) [0]
    Всем доброго времени суток!

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

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

    Вот и вопрос - почему так и как побороть? Где грабли?
  • Сергей М. © (26.01.10 08:25) [1]

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


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


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


    Ну а что там еще быть должно, если конкретно к этой IAT ты обращаешься в первый раз ?
  • SPeller © (26.01.10 08:34) [2]
    Похоже что проблема совсем в другом и проблема озвучена совершенно некорректно. Дело в том, что я не заметил что нахождение записи в таблице импорта происходит путем сравнения адреса каждой записи с адресом оригинала. Совпало - переписали. Вот и получается что второй хук не узнает, что за функция изначально крылась в записи таблицы, поскольку адрес там уже вписан левый.

    Теперь вот прихожу к выводу что надо этот код перехвата выносить в одну общую длл, поскольку второму хуку не судьба узнать какие записи в таблицах были переписаны первым хуком.
  • Сергей М. © (26.01.10 08:37) [3]

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


    Так а зачем ты лезешь в IAT этого модуля два раза ?
    Непонятно мне ..
  • SPeller © (26.01.10 08:43) [4]
    Алгоритм пробегает по всем iat всех загруженных в данный момент модулей. Второй раз получить доступ хотелось для того, чтобы отрабатывали оба хука, а не только один
  • Сергей М. © (26.01.10 09:24) [5]

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


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

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

    Ты же везде перехватил LoadLibrary, значит получил возможность отслеживать запросы на загрузку новых модулей. По факту обнаружения этих запросов ты вызываешь оригинальную LoadLibrary для запрошенного к загрузке модуля, впосле чего проверяешь, модифицирована ли уже тобой его IAT (т.е. модуль уже бы загружен в момент Х) и если нет, то модифицируешь.
  • SPeller © (26.01.10 09:47) [6]
    В загружаемой библиотеке такой же код перехвата, как и в exe. И ему там совсем не известно, какие таблицы были модифицированы.
  • Сергей М. © (26.01.10 09:51) [7]

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


    Какой может быть "код перехвата" в произвольной библиотеке ?
  • SPeller © (27.01.10 00:41) [8]
    Блин, я загружаю свою длл с таким же кодом перехвата, как и в ехе, который и переписывает импорты свои и то, что еще не успел переписать код в ехе. Получаются в одном процессе 2 конкурирующих перехватчика. Кто что успеет себе "урвать". Это есть плохо.

    А в произвольной бибилиотеке функции перехватываются за счет того, что в программе уже глобально перехвачены вызовы LoadLibrary/Ex, и после вызова оригинала сразу же проверяется ее таблица импорта с целью поиска функций, которые нужно перехватить.
  • Сергей М. © (27.01.10 10:52) [9]
    > загружаю свою длл с таким же кодом перехвата, как и в ехе

    Нафига в программе два (!) модуля, делающих одно и то же ?)
  • SPeller © (29.01.10 03:05) [10]
    Задача у них - перехватить функции, которые в процессе своей работы вызывает система, чтобы заменить логику работы системной функции своей логикой. Однин код использовал такой механизм в экзешнике, второй в дллке. Сейчас всё это вынес в одну общую длл, проблема ушла.
  • vadim-86 © (26.03.10 08:22) [11]
    Я приветствую всех, не окажет мне помощь, в моей проблеме, при установке игры у меня по завершению установки вылетает сообщение:
    299 0x012B Запрос Read/WriteProcessMemory был выполнен только частично.,
    И возможно ли как это исправить?
  • vadim-86 © (26.03.10 08:22) [12]
    Я приветствую всех, не окажет мне помощь, в моей проблеме, при установке игры у меня по завершению установки вылетает сообщение:
    299 0x012B Запрос Read/WriteProcessMemory был выполнен только частично.,
    И возможно ли как это исправить?
  • Сергей М. © (26.03.10 08:27) [13]

    > vadim-86 ©   (26.03.10 08:22) [11]


    К программированию в среде Delphi эта беда, конечно же, имеет самое непосредственное отношение ..
 
Конференция "WinAPI" » Проблема с Read/WriteProcessMemory из разных модулей
Есть новые Нет новых   [134432   +18][b:0][p:0.001]