Сейчас на форуме: jinoweb, bartolomeo, rmn (+4 невидимых)

 eXeL@B —› Программирование —› Перехватить чтение с диска и подставить свои данные
Посл.ответ Сообщение


Ранг: 71.9 (постоянный), 4thx
Активность: 0.040
Статус: Участник

Создано: 17 мая 2014 20:39
· Личное сообщение · #1

Есть некая программа которая читает файл с диска. Я сам ее загружаю в память, обрабатываю ее импорт, гружу DLL которые ей необходимы а потом запускаю. Адреса функций CreateFile и ReadFile заменяю указателями на мои функции. Поэтому все операции чтения с диска я контролирую. Когда в CreateFile я ловлю название некого хитрого файлика, мне нужно подменить его своими данными в ReadFile.
Проблема в том, что с установленным хуком на ReadFile программа отказывается работать правильно, может как-то узнает это и обламывает меня. Хук на CreateFile работает нормально.
Поэтому интересно, можно ли в CreateFile подставить указатель на буфер памяти, где лежат мои данные, и чтобы ReadFile читала их "думая", что читает с диска?



Ранг: 3.5 (гость), 3thx
Активность: 0.010
Статус: Участник

Создано: 17 мая 2014 20:54 · Поправил: Initial
· Личное сообщение · #2

Запишите свои данные в файл и откройте этот файл вместо того, который хочет программа в CreateFile.
Как вариант.

А вообще, лучше разберитесь что у Вас не так с ReadFile, может параметр теряете и программа падает. Попробуйте перехватить функцию пониже (ZwReadFile).




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 17 мая 2014 20:57
· Личное сообщение · #3

CreateFile возвращает хендл, если что. И буфер памяти к хендлу никакого отношения не имеет.
Лучше бы разобрался, что с ReadFile не так, чем гадать.




Ранг: 71.9 (постоянный), 4thx
Активность: 0.040
Статус: Участник

Создано: 17 мая 2014 21:04
· Личное сообщение · #4

Archer - а можно в захученной CreateFile открыть пайп и вернуть хендл пайпа, а не хендл открытого файла.
ReadFile будет также читать данные с пайпа как и с диска?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 17 мая 2014 21:37
· Личное сообщение · #5

Можно и пайп открыть. Только зависит от операций потом с этим хендлом. Чтение и запись прокатят. Но не все операции, которые можно делать с файлом, прокатят на пайпе. Да и сервер для пайпа придётся писать, что лишняя возня.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 18 мая 2014 12:13
· Личное сообщение · #6

Если Вы знаете в каком месте читается файл и есть ссылка на строку в образе, то еще можно просто создать файл blablabla.dat в той же папке, набитый своими данными и банально сделать редирект на него, динамически подправив строку или захукав только CreateFile/ZwCreateFile, не затрагивая ReadFile ...




Ранг: 71.9 (постоянный), 4thx
Активность: 0.040
Статус: Участник

Создано: 18 мая 2014 13:02 · Поправил: jangle
· Личное сообщение · #7

В общем разобрался с ReadFile. В HookedCreateFile я перехватываю имя файла + его хендл, записываю их в массив.
В HookedReadFile пробегаю по массиву и сравниваю хендл в hFile и сохраненный, если хендл нужного мне файлика,
то вместо чтения ReadFile записываю в lpBuffer мои данные, и возвращаю 1 и количество подставленных
байтов в lpNumberOfBytesRead. Программа "думает" что прочитала данные с диска.
Такой способ как мне кажется, лучше чем хранение промежуточных файлов на диске, т.к. никаких следов в файловой
системе не остается.


Code:
  1. BOOL WINAPI HookedReadFile(
  2.     _In_         HANDLE hFile,
  3.     _Out_        LPVOID lpBuffer,
  4.     _In_         DWORD nNumberOfBytesToRead,
  5.     _Out_opt_    LPDWORD lpNumberOfBytesRead,
  6.     _Inout_opt_  LPOVERLAPPED lpOverlapped)
  7. {
  8.  
  9.    ......   в Buf лежит мои данные
  10.  
  11.             std::copy(Buf, Buf + readedCount, (LPBYTE)lpBuffer);
  12.     }
  13.     lpNumberOfBytesRead = &readedCount;
  14.     return 1;
  15. }





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 18 мая 2014 18:55
· Личное сообщение · #8

Таки воспользуюсь полномочиями модератора и позволю себе отписаться в закрытый топ.
А именно предложу пересмотреть это явно неправильное место lpNumberOfBytesRead = &readedCount;
И заодно намекну, что есть TRUE для BOOL вместо 1.


 eXeL@B —› Программирование —› Перехватить чтение с диска и подставить свои данные
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати