Ответы пользователя по тегу Системное администрирование
  • Как сделать такую ловушку?

    @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()");
    }


    Это функция для смены адреса функции в разделе импорта на свой. Джеффри Рихтер
    Ответ написан
    Комментировать