Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 18
1

Мониторинг файлов в папке

01.07.2018, 09:55. Показов 3026. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хотел отследить, к какому файлу из папки обращается программа (при разных условиях, обращается к разным файлам в одной папке) и собственно выводило об этом инфу.
Первое что попробовал, это было: "ReadDirectoryChangesW". Вроде бы классно, выводит файл из выбранной папки, в котором был изменен атрибут/имя/размер/дата, учитывая вложенные папки
Но после тестов, оказалось, что при открытии данных файлов программой, время последнего доступа на файле не изменяется. А значит, что данная функция не подходит, для этой задачи.

При помощи procmon выяснил, что программа обращается к файлу, по функциям "CreateFile", "QueryBasicInformationFile", "CloseFile", "ReadFile".
Есть ли возможность как то отследить подобное обращение к файлу, но зная только папку в котором произойдет данное обращение?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2018, 09:55
Ответы с готовыми решениями:

Вывод имен файлов в папке
Нужно вывести на экран имена всех фалов , но вместо этого выводит адреса #include...

Получение списка файлов в определённой папке
Как получить список всех файлов в определённой папке, включая подпапки, без использования рекурсии....

Вывести имена всех файлов в папке (задача с подвохом)
Друзья! Дело в том, что имена у файлов какие-то хитрые. Скачайте прилагающиеся два файла (они...

Мониторинг файлов в папке
Всем огромный привет! :) Задача. Есть некий прибор, с него снимается телеметрия. Данные с...

6
CEO
Эксперт С++
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
02.07.2018, 23:36 2
tarelka95, советовал бы использовать глобальный HOOK на файловую систему, много полезного про хуки есть на cyberguru (WIN32 API. HOOKS (ХУКИ))
0
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 18
03.07.2018, 22:11  [ТС] 3
Alligieri, глобальный хук на файловую систему найти не удалось, что подразумевается под файловой системой?

Нашел только локальный хук(встраивание dll) на CreateFile:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <windows.h>
#include <Dbghelp.h>
#include <fstream>
 
HANDLE hCreateFile(LPCTSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
HANDLE htstCreateFile(LPCTSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
 
PVOID HookImportedFunction(const char *Dll, const char *FuncName, void *Function);
DWORD HookGeneralFunction(const char *Dll, const char *FuncName, void *Function, unsigned char *backup);
void NumOut(char *format, ...);
 
DWORD createFileAddr=0;
BYTE backup[6];
ofstream fout("C:\\dll.txt");
 
BOOL APIENTRY DllMain( HMODULE hModule, DWORD  fwReason, LPVOID lpReserved)
{
 
    switch (fwReason)
    {
        case DLL_PROCESS_ATTACH:
            {   
                DisableThreadLibraryCalls(hModule); //keeps it from being re-called
                fout << "In DLL process Attach" << endl;
                //HookImportedFunction("Kernel32.dll", "CreateFileA", hCreateFile);
                createFileAddr = HookGeneralFunction("Kernel32.dll", "CreateFileA", hCreateFile, backup);
                return true;
 
            }
            break;
        case DLL_THREAD_ATTACH:
            fout << "In DLL thread Attach" << endl;
            break;
        case DLL_THREAD_DETACH:
            fout << "In DLL thread detach" << endl;
            fout.close();
            break;
        case DLL_PROCESS_DETACH:
            {
                fout << "In DLL Process Detach" << endl;
 
                if(createFileAddr)
                    WriteProcessMemory(GetCurrentProcess(), (void*)createFileAddr, backup, 6, 0);
 
                fout.close();
                return true;
 
            }
            break;
    }
    return false;
}
 
HANDLE hCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
 
    fout << "Function call to CreateFileA and lpFilename is " << lpFileName << endl;
    
    HANDLE fHandle = CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
 
    fout << "The File handle is " << fHandle << endl;
 
    return fHandle;
}
 
 
 
HANDLE htstCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
    
    //restore the bytes at MessageBox
    WriteProcessMemory(GetCurrentProcess(), (void*)createFileAddr, backup, 6, 0);
    
    //use the true msgbox
    //MessageBox(0, "Incoming Text", "HOOKED hihi!", 0);
    HANDLE ret = CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
 
    //restore the hook
    createFileAddr = HookGeneralFunction("kernel32.dll", "CreateFileA", htstCreateFile, backup);
    return ret;
}
0
Эксперт WindowsАвтор FAQ
18012 / 7713 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
10.07.2018, 21:21 4
Лучший ответ Сообщение было отмечено tarelka95 как решение

Решение

tarelka95, вам это задача на один раз? Не обязательно из-под своего приложения?

Если да, то есть ведь API мониторы, или можно включить фиксацию времени последнего доступа к файлу:

Windows Batch file
1
FSUTIL behavior set disablelastaccess 0
1
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 18
14.07.2018, 12:45  [ТС] 5
Dragokas, Как понять на один раз? Один раз я посмотреть в procmon могу. Мне сойдет и winapi(если он это умеет), или чья-то чужеродная бесплатная библиотека.
Если чужое приложение умеет отсылать инфу в мое приложение почему бы и нет .

С вашей командой(Batch), "ReadDirectoryChangesW" вроде иногда отрабатывает, но не всегда, пока пытаюсь понять в какой вариации не ловит.
0
Эксперт WindowsАвтор FAQ
18012 / 7713 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
14.07.2018, 15:50 6
Создайте удалённый поток для приложения-цели с кодом вашего хука и пусть передаёт вам информацию.
0
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
11.08.2018, 17:37 7
https://yandex.ru/search/?text... ryChangesW
0
11.08.2018, 17:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2018, 17:37
Помогаю со студенческими работами здесь

Мониторинг файлов в папке
Всем Привет! Помогите пожалуйста!!! В интернете нашел скрипт для мониторинга файлов в папке. Он...

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

Мониторинг появления файлов в заданной папке, их печать и удаление
Задача такая: Если в папке какой-то файл есть, должен этот файл печататься и потом удалятся. Для...

Мониторинг файлов в папке: программа иногда не может получить размер файла
Всем привет, если не в том разделе создал тему , то извините ) Написал я программу для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru