PDA

Просмотр полной версии : Доступ к заблокированному файлу


Alanez
17.12.2016, 00:27
Если способы получить доступ на запись к заблокированному файлу другим процессом, не останавливая блокирующий процесc??

Veil
17.12.2016, 02:34
Пожалуйста конкретней!

Alanez
17.12.2016, 09:50
↑ (https://antichat.live/posts/4025391/)
Пожалуйста конкретней!


Приложение создает на диске файл и работает с ним - что-то пишет/читает. При этом доступ к файлу блокирующий - другие приложения не могут открыть файл на чтение/запись.

Задача - внести изменение в файл не останавливая процесс, который блокирует файл.

Есть программы типа Unlocker, которые снимают блокировку убивая блокирующий процесс - не годиться.

pas9x
18.12.2016, 23:55
Это возможно, но сделать сложно. Надо уметь кодить и знать winapi.

При этом менять содержимое файла не закрывая дескриптор - очень плохая идея. Во-первых это может сломать логику программы и она может покрашиться; либо запишет в файл что-то своё не зная о твоих изменениях и файл закосячится.

Можно находить дескриптор файла и закрывать его. Тогда файл не закосячится, но программа всёравно от этого тоже может покрашиться. Унлокер кстати так и делает. Хз с чего ты взял, что он убивает процесс (может просто программа падала из-за вмешательства?).

В общем идея хреновая, лучше этого не делать.

master_555
19.12.2016, 02:53
есть вариант, инжект кода в процесс, работаем с хедлом файла,

в это время основной поток этого процесса ставим на паузу

потом перед ResumeThread() восстанавливаем все (позиция в файле, и т.д.)

Alanez
20.12.2016, 00:45
↑ (https://antichat.live/posts/4026055/)
есть вариант, инжект кода в процесс, работаем с хедлом файла,
в это время основной поток этого процесса ставим на паузу
потом перед ResumeThread() восстанавливаем все (позиция в файле, и т.д.)


при "усыплении треда" разве освободится доступ к файлу?

master_555
20.12.2016, 02:00
работаем с тем же хедлом, но с другого потока

Alanez
26.12.2016, 22:46
Я правильно понимаю идею?:

1. создать свой процесс.

2.В нем запустить в отдельном дочернем потоке программу, блокирующую доступ к файлу

3. Взять ссылку на хэдл к файлу у этого потока. Как получить хэндл дочернего потока к нужному файлу по имени файла???

4. Изменить параметры доступа к файлу

5. Внести необходимые изменения сторонним приложением в файл

6.Восстановить параметры доступа к файлу.

master_555
02.01.2017, 18:14
>Как получить хэндл дочернего потока к нужному файлу по имени файла???

а не нужно конкретный поток, получаешь хендл файла и ставишь все потоки на паузу

NtQuerySystemInformation(SYSTEM_HANDLE_INFORMATION , ...) - перечисление хендлов, найдешь свой

Alanez
11.01.2017, 23:46
Найду свой handle. Дальше будет проверка прав доступа по параметру SECURITY_ATTRIBUTES... в которых права ограничены, в доступе к ресурсу будет отказано... разве не так?

Понял, про инжект упустил..

Alanez
17.01.2017, 18:09
Кто-нибуть может подсказать как убить handle к файлу, также как это делает ProcessExplorere?

binarymaster
18.01.2017, 18:13
↑ (https://antichat.live/posts/4035143/)
Найду свой handle. Дальше будет проверка прав доступа по параметру SECURITY_ATTRIBUTES... в которых права ограничены, в доступе к ресурсу будет отказано... разве не так?


Если пользователь - админ, и есть привилегия отладки, то вряд ли такое произойдёт.


↑ (https://antichat.live/posts/4037093/)
Кто-нибуть может подсказать как убить handle к файлу, также как это делает ProcessExplorere?


CloseHandle(hFile);

Alanez
18.01.2017, 21:27
↑ (https://antichat.live/posts/4037564/)
Если пользователь - админ, и есть привилегия отладки, то вряд ли такое произойдёт.
CloseHandle(hFile);


а получить hFile через DuplicateHandle?

binarymaster
18.01.2017, 21:30
↑ (https://antichat.live/posts/4037636/)
а получить hFile через DuplicateHandle?


Попробуйте.

Alanez
29.01.2017, 22:32
↑ (https://antichat.live/posts/4037637/)
Попробуйте.


нашел нужный Handle, получил его дубликат. Но CloseHandle(dupHandle) не закрывает оригинальный хэндл...

Пример взял отсуда: https://forum.sysinternals.com/howto-enumerate-handles_topic18892.html

binarymaster
29.01.2017, 22:35
↑ (https://antichat.live/posts/4042071/)
нашел нужный Handle, получил его дубликат. Но CloseHandle(dupHandle) не закрывает оригинальный хэндл...


В общем-то как я и думал. Оригинальный закрывать надо, не дублируя его.

Alanez
30.01.2017, 00:04
Пытаюсь закрыть оригинальный - CloseHandle((HANDLE)handle.Handle); - выбрасывет исключение...

binarymaster
30.01.2017, 00:22
↑ (https://antichat.live/posts/4042106/)
Пытаюсь закрыть оригинальный - CloseHandle((HANDLE)handle.Handle); - выбрасывет исключение...


Сейчас почитал то, что по ссылке.

Там ведь написано, что DuplicateHandle с последним аргументом DUPLICATE_CLOSE_SOURCE = 1 как раз закрывает его в удалённом процессе.


#define DUPLICATE_CLOSE_SOURCE 0x1

DuplicateHandle(hProcess,hFile,NULL,NULL,0,false,D UPLICATE_CLOSE_SOURCE);

SooLFaa
30.01.2017, 18:11
Скопируй его, сделай что надо, потом удали. ПРОФИТ.

UPDATE: Программно тот же алгоритм.

Alanez
30.01.2017, 21:18
binarymaster-у и всем кто принял участие в обсуждении спасибушки! Цель поражена!

binarymaster
30.01.2017, 23:29
Кто такой benmaster?