Подмена CreateFile и ReadFile
От: Adnako СССР  
Дата: 30.12.13 12:57
Оценка:
Здравствуйте.

Задача в общих чертах такая — существует некий процесс который подгружает мою 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 Все умные статьи, на подобие этой я уже перечитал. Возможно не всё понял, но материал достаточно обширен и времени погружаться в ассемблер нету. Может быть кто-то уже реализовывал подобные задачи и хотя бы посоветует какую статью изучить внимательнее, чтобы добиться положительного результата.

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.