0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 4
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Перехват API вызовов через таблицу импорта09.12.2012, 19:03. Показов 3177. Ответов 4
Метки нет (Все метки)
Доброго времени суток. Есть следующая задача. Нужно перехватить вызов некоторых определённых функций из определённого приложения и заменить их на свои. Пытаюсь провернуть всё это созданием удалённого потока с помощью функции CreateRemoteThread и внедрения в этот поток Dll файла. Функция которая должна подменять адреса в таблице импорта вызывается в теле DllMain. В нашем случае будем подменять вызов функции CreateFileW. Сама функция выполняющая замену называется ReplaceIATEntryInOneMod. Проблема состоит в том, что при срабатывании ReplaceIATEntryInOneMod адрес в таблице импорта подменяется и следующий вызов CreateFileW следующий сразу за ReplaceIATEntryInOneMod успешно отлавливается, однако все вызовы CreateFileW которые находятся в главном потоке приложения продолжают вызывать функцию из первоначальной библиотеки.
Сама DllMain:
0
|
09.12.2012, 19:03 | |
Ответы с готовыми решениями:
4
Перехват API вызовов Перехват API функций. Таблица импорта Перехват API Перехват API функции |
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
09.12.2012, 20:33 | 2 |
То есть VirtualAllocEx с одним MEM_COMMIT работает? Вообще, как я понимаю, тут надо бы MEM_COMMIT | MEM_RESERVE.
Видимо, адреса импортируемых функций где-то сохраняются... Процесс, в котором надо перехватывать, всегда создаётся твоей прогой или это только для примера?
0
|
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 4
|
|
09.12.2012, 20:50 [ТС] | 3 |
Поставил MEM_COMMIT | MEM_RESERVE никаких изменений не произошло.
Создание процесса только для примера, его можно и в ручную запустить.
0
|
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
09.12.2012, 20:59 | 4 |
Если самому процесс запускать, можно его запустить с CREATE_SUSPENDED, потом поправить импорт, потом ResumeThread для главного потока. Тогда если адреса импортов сохраняются не в DllMain'е какой-то из dll'ок, всё должно быть нормально.
Если заранее известная прога может запускаться вручную, можно попробовать написать запускалку для неё, которую юзер будет запускать вместо самой проги. Тогда получится то же, что и в предыдущем случае. В общем случае, если процесс заранее неизвестен, то, думаю, менять таблицу импорта уже может быть бесполезно - тогда надо ставить jmp в начало самой перехватываемой функции.
1
|
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 4
|
|
10.12.2012, 02:22 [ТС] | 5 |
Спасибо, буду думать
Добавлено через 51 минуту Пробовал создавать процесс с флагом CREATE_SUSPENDED и использовать ResumeThread после того как удалённый процесс завершится, но тогда функция GetLastError в теле DllMain возвращает значение 87 : Параметр задан неверно. Из-за чего может возникнуть эта ошибка в данном случае? Добавлено через 4 часа 25 минут Решение было найдено. Ошибка была в том что я меня таблицу импорта самой Dll библиотеки, а не процесса в целом. Для исправления этой ошибки нужно передавать в вызове ReplaceIATEntryInOneMod в DllMain четвёртым параметром дескриптор файла, используемого для создания процесса. Получить его можно вызовом GetModuleHandle(NULL).
0
|
10.12.2012, 02:22 | |
10.12.2012, 02:22 | |
Помогаю со студенческими работами здесь
5
Перехват API, Рихтер Перехват API функций Перехват API с возвратом значения Перехват API через таблицу импорта Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |