dollar
@dollar
Делай добро и бросай его в воду.

Как сделать такую ловушку?

Хочу сделать такую ловушку, но точно не знаю, как именно:
В папке "мои документы" создаётся файл passwords.txt, и в нём пишется какая-нибудь фигня. Затем нужно отслеживать на самом низком уровне, какие программы (процессы) пытаются прочитать этот файл, его содержимое.
Эти программы естественно должны быть заблокированы и ожидать подтверждения пользователя, либо быть убиты по решению пользователя. Такое возможно реализовать малой кровью? Можно стандартными средствами, чтобы висело на панели задач, лишь бы надёжно работало и не было возможности обойти эту ловушку.

Может, для этого есть какой-то популярный софт. Или очень простой код, чтобы сделать свою минипрограмму.
  • Вопрос задан
  • 577 просмотров
Решения вопроса 1
@sddvxd
Я бы так сделал: сделал бы программу, которая внедряется в процесс, который создает процессы (например explorer.exe), в разделе импорта функции создания процессов поменял бы на свой и перехватывал создание процессов. При перехвате создания процесса вызывать оригинальный CreateProcess и запоминать дескриптор процесса. В только что созданный процесс внедрить dll для обработки опять же только что установленной ловушки на функцию открытия файла. Если filename == path_to_file/passwords.txt тогда самоуничтожение процесса

PROC replaceProcAddress(LPCSTR callerModule, PROC original, PROC swap){
    HMODULE callerHandle = GetModuleHandleA(callerModule);
    if(callerHandle == nullptr)
        throw Exception(L"callerHandle is NULL in Process::replaceProcAddress");

    ULONG size;
    bool found = false;
    PIMAGE_IMPORT_DESCRIPTOR pImageDesc = reinterpret_cast<PIMAGE_IMPORT_DESCRIPTOR>(ImageDirectoryEntryToData(callerHandle, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &size));
    if(pImageDesc == nullptr)
        throw Exception(L"PIMAGE_IMPORT_DESCRIPTOR is NULL in Process::replaceProcAddress()");

    for(; pImageDesc->Name; pImageDesc++){
        PSTR pModName = reinterpret_cast<PSTR>(reinterpret_cast<PBYTE>(callerHandle) + pImageDesc->Name);
            PIMAGE_THUNK_DATA pThunkData = reinterpret_cast<PIMAGE_THUNK_DATA>(reinterpret_cast<PBYTE>(callerHandle) + pImageDesc->FirstThunk);
            for(; pThunkData->u1.Function; pThunkData++){
                PROC* ppOriginalFunc = reinterpret_cast<PROC*>(&pThunkData->u1.Function);
                if(*ppOriginalFunc == original){
                    found = true;
                    DWORD dwOldProtect;
                    if(VirtualProtect(ppOriginalFunc, sizeof(swap), PAGE_WRITECOPY, &dwOldProtect)){
                        if(!WriteProcessMemory(getHandle(), ppOriginalFunc, &swap, sizeof(swap), NULL))
                            throw Exception(L"Write memory is failed for replaceProcAddress");
                        VirtualProtect(ppOriginalFunc, sizeof(swap), dwOldProtect, &dwOldProtect);
                    }
                }
            }
    }
    if(found) return swap;
    throw Exception(L"Address of procedure is not found in Process::replaceProcAddress()");
}


Это функция для смены адреса функции в разделе импорта на свой. Джеффри Рихтер
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08
Возможно это то, что надо: https://habr.com/ru/post/150149/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы