Привет. Возможно ли внедрять DLL во все процессы (кроме системных) посредством прописывания своей DLL в каком-либо ключе реестра? Интересует хоть какой-нибудь мало-мальски рабочий способ. Нужно для XP и Vista. Кто что знает поделитесь! Сам знаю только два способа: 1. Ключ HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls, значение AppSecDll типа REG_EXPAND_SZ. Туда можно прописать несколько DLL. Такая DLL должна содержать как минимум один экспорт со следующим именем и сигнатурой: Код (Text): NTSTATUS CreateProcessNotify ( LPCWSTR lpApplicationName, ULONG Reason ); Более подробно здесь. Проблема в том, что указанные DLL будут загружены только в процессы, которые пытаются создать другие процессы, не ранее. Т.е. если процесс вообще никогда не создаёт другие процессы, то указанные DLL никогда не будут подгружены в него. 2. Ключ HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows, значение AppInit_DLLs типа REG_SZ. Недостаток всем известен - указанные DLL будут загружены только в процессы, в которые загружается USER32.DLL. Более подробно здесь. Выше приведённые способы могут быть полезны только в случае, если необходимо внедрить DLL хоть куда-нибудь. Мне же нужно внедрить её во все несистемные процессы, начиная с Shell ( EXPLORER.EXE ) и далее во все, которые SHELL'ом и запущены. Спасибо.
Кстати, вот в этой же статье - Working with the AppInit_DLLs registry value - говорится следующее: Вопрос - какие "other techniques" имелись в виду? Какие-то другие ключи или что?
NDIS Скажи конкретно что делать будет модуль, немного проблемно видеть на таком расстоянии. Надо во все процессы - запиши загрузчик в UserSharedData и оттуда его юзай.
Модуль будет перехватывать некоторые высокоуровневые юзермодные API методом сплайсинга. А по поводу UserSharedData можно подробности?
Эм, а разве есть существенная разница? Вообще, в идеале хотелось бы универсальный вариант, т.е. чтобы можно было похучить любую функцию из всех DLL, которые грузятся позже ntdll.dll. Например, tapi32.dll!lineOpen. Но при чём здесь API, речь идёт о внедрении.
NDIS я так делал в молодости - собрал свой шелл, прописал его в реестр, он на интерактив-логоне сам стартил ехплорер и хучил в нем CreateProcessInternalW и так далее по цепочке - все предки ехплорера получали мою ДЛЛ в подарок. Работало где-то вроде код валялся, ассемблер х32, надо - подарю
да пожалуйста тут немного другой вариант, че-то я через шелл-ключ не нахожу но этот даже и лучше - таск-манагер ловит '
Нужно хукать создание нового потока, при этом в энтри-поинте дллки создаете поток и смотрите его реальный энтри-поинт (через ZwQueryInformationThread) далее запоминаете его (это будет BaseThreadStart) далее в хуке создания потока сравниваете энтри поинты, если это не BaseThreadStart то значит это BaseProcessStart, дальше дело техники (создаете суспендед и проч.). Грузиться пофиг каким способом, после загрузке прогрузить себя во все процессы через RtlCreateUserThread (работает на висте для всех процессов в отличие от RemoteThread)
tylerdurden Точна, тока в DllEntryPoint ntdll хукать надо, в остальные модуля хитрый поток может не попасть. Мы делаем так. Код (Text): RegisterCalloutsForDll( IN OUT *PVOID Handler):PVOID RegisterCalloutsForDll proc Handler:PVOID assume fs:nothing mov edx,fs:[TEB.Peb] mov ecx,Handler mov edx,PEB.Ldr[edx] mov eax,dword ptr [ecx] mov edx,PEB_LDR_DATA.InLoadOrderModuleList[edx] assume edx:PLDR_DATA_TABLE_ENTRY ;Main module mov edx,LDR_DATA_TABLE_ENTRY.InLoadOrderModuleList.Flink[edx] ;ntdll.dll lock xchg [edx].EntryPoint,eax mov dword ptr [ecx],eax ret RegisterCalloutsForDll endp PsRegisterCalloutsForDll( IN HANDLE ProcessHandle, IN OUT *PVOID Handler):NTSTATUS PsRegisterCalloutsForDll proc ProcessHandle:HANDLE, Handler:PVOID Local ProcessInformation:PROCESS_BASIC_INFORMATION Local Loader:PULONG, ReturnLength:ULONG _setseh_ invoke ZwQueryInformationProcess, ProcessHandle, ProcessBasicInformation, addr ProcessInformation, SizeOf PROCESS_BASIC_INFORMATION, addr ReturnLength test eax,eax jnz exit_ add ProcessInformation.PebBaseAddress,PEB.Ldr invoke PsReadVirtualMemoryProtected, ProcessHandle, ProcessInformation.PebBaseAddress, addr Loader, SizeOf PVOID, addr ReturnLength test eax,eax jnz exit_ add Loader,PEB_LDR_DATA.InLoadOrderModuleList invoke PsReadVirtualMemoryProtected, ProcessHandle, Loader, addr Loader, SizeOf PVOID, addr ReturnLength test eax,eax jnz exit_ add Loader,LDR_DATA_TABLE_ENTRY.InLoadOrderModuleList.Flink invoke PsReadVirtualMemoryProtected, ProcessHandle, Loader, addr Loader, SizeOf PVOID, addr ReturnLength test eax,eax mov edx,Handler jnz exit_ mov eax,dword ptr [edx] add Loader,LDR_DATA_TABLE_ENTRY.EntryPoint mov dword ptr [ProcessInformation],eax invoke PsReadVirtualMemoryProtected, ProcessHandle, Loader, Handler, SizeOf PVOID, addr ReturnLength test eax,eax jnz exit_ invoke PsWriteVirtualMemoryProtected, ProcessHandle, Loader, addr ProcessInformation, SizeOf PVOID, addr ReturnLength exit_: _endseh_ ret PsRegisterCalloutsForDll endp