Вопрос по открытым хендлерам файла.

Тема в разделе "WASM.ASSEMBLER", создана пользователем asmlamo, 16 май 2011.

  1. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.742
    Есть прога работает с файлами открывает пишет закрывает.

    Я сделал инжект dll в процесс этой проги и моя dll так же читает пишет один файл с которым работает прога.

    Иногда происходит блокировка. Прога открыла файл .. а моя dll не может читать писать.

    Что делать ?

    Точнее как получить хендлер уже открытого прогой файла и его юзать ?

    Или найти хендлекр и принудительно его закрыть а затем заново открыть свой файл с блекджеком и шлюхами ...
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Что меня смущает -- не сказано с какими ошибками происходит чтение/запись файла. Т.е. я так понял, что новая dll пытается открыть файл и получает ошибку, что он уже открыт?

    Если так, надо перехватить CreateFile и сохранить HANDLE, который она возвращает при открытии целевого файла. Далее для операций использовать этот HANDLE. Единственная проблема -- делать это надо осторожно, т.к. если программа думает, что работает с файлом одна, то можно нечаянно преподнести ей сюрприз, записав в файл какие-то данные.
     
  3. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Случайно не STATUS_SHARING_VIOLATION(ERROR_SHARING_VIOLATION) ?
    Тогда необходимо остановить потоки, работающие с файлом и найти его описатель. Для этого нужно сделать слепок(SystemHandleInformation), найти описатель типа File, для каждого получить Nt-имя файла(ObjectNameInformation) и сравнить с необходимым(при необходимости сконвертировав его в Dos-имя, тоесть раскрыв символическую ссылку заранее). Получение слепка можно опустить, просто перечислив все описатели, но это плохой способ.
     
  4. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.742
    > я так понял, что новая dll пытается открыть файл и получает ошибку, что он уже открыт?

    да

    >Для этого нужно сделать слепок(SystemHandleInformation), найти описатель типа File, для каждого получить Nt-имя файла(ObjectNameInformation) и сравнить с необходимым(при >необходимости сконвертировав его в Dos-имя, тоесть раскрыв символическую ссылку заранее). Получение слепка можно опустить, просто перечислив все описатели, но это плохой способ.

    Спасибо. Я о чем то подобном и думал только не знал с какой стороны копать.
     
  5. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.742
    А какая функция перечисляет все описатели процесса ?
     
  6. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    По-моему, перехватить CreateFile проще. Но asmlamo, конечно, виднее.
     
  8. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.742
    Изучив тему тоже склоняюсь к этому ...
     
  9. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    asmlamo
    С перехватом, тоже все не будет так уж просто ибо:
    1.просто засунуь в самое начало push/ret или jmp уже не поможет ибо функцию нужно перехватывать ПОСЛЕ работы.
    2. если вы перехватите CreateFileW (а по хорошему это нужно сделать) то получите кучу вызовов из разных сторонних библиотек, которые нужно будет обрабатывать.
    3. если библиотека аттачится к процессу после его создания часть хандлов Вы рискуете потерять.