Здравствуйте.
Задача в общих чертах такая — существует некий процесс который подгружает мою dll, необходимо перехватить обращения только этого процесса (и всех его загруженных модулей, кроме моего) к определённым файлам, чтобы "на лету" подменять содержимое читаемых процессом данных.
Изучая гугл пришёл к выводу, что писАть свой драйвер-фильтр будет "немножко" overkill, и остановился на методе модификации IAT. Возможно это не самый правильный способ, просто я пока не нашёл ещё других.
За основу был взят
этот алгоритм "прочёсывания" всех IAT процесса и его модулей.
Теперь, собственно, проблема.
После получения структуры
IMAGE_THUNK_DATA у меня все параметры имеют одинаковое значение, например:
PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)((PBYTE) hMods[i] + pImportDesc->FirstThunk);
pThunk.u1 =
ForwarderString 2147483665 unsigned long
Function 2147483665 unsigned long
Ordinal 2147483665 unsigned long
AddressOfData 2147483665 unsigned long
Соответственно при попытке прочитать структуру
IMAGE_IMPORT_BY_NAME:
PIMAGE_IMPORT_BY_NAME import = (PIMAGE_IMPORT_BY_NAME)((DWORD)hMods[i] + pOriginalThunk->u1.AddressOfData);
В
import лежит мусор.
Почти та же петрушка, если получать
IMAGE_THUNK_DATA не по смещению
FirstThunk, а по
OriginalFirstThunk. Вся разница лишь в том, что значения смещений
FirstThunk и
OriginalFirstThunk разные и по итогу в
import лежит немного другой мусор.
На SO
есть похожий неудачник, но он более счастливый — он сам контролирует запускаемый процесс и мусор у него, потому, что процесс запущен с флагом
CREATE_SUSPENDED, что в моём случае вообще безынтересно.
Я, конечно, попробовал — в моём случае после некоего таймаута, после загрузки моей dll, мусор лежит уже по смещению
pImportDesc->FirstThunk, а попытка получить
IMAGE_IMPORT_BY_NAME по смещению из
OriginalFirstThunk приводит к результатам, что были ранее.
Небольшое уточнение — я всё это пытаюсь запустить из под Visual Studio 2008 на Windows 7 SP1 x64 в режиме Win32.
Неделя копания в гугле, компиляция кучи примеров не принесли положительных результатов — в результате у всех примеров лежит мусор в структуре
IMAGE_IMPORT_BY_NAME.
Помогите, пожалуйста с советом — куда копать?
Актуальна ли на существующий день методология модификации IAT?
Есть ли какие-либо современные варианты перехвата WinAPI?
PS Все умные статьи, на подобие
этой я уже перечитал. Возможно не всё понял, но материал достаточно обширен и времени погружаться в ассемблер нету. Может быть кто-то уже реализовывал подобные задачи и хотя бы посоветует какую статью изучить внимательнее, чтобы добиться положительного результата.
Спасибо.