Внедрение DLL через реестр

Тема в разделе "WASM.WIN32", создана пользователем NDIS, 15 авг 2008.

  1. NDIS

    NDIS NDIS

    Публикаций:
    0
    Регистрация:
    16 авг 2007
    Сообщения:
    41
    Адрес:
    Москва
    Привет.

    Возможно ли внедрять DLL во все процессы (кроме системных) посредством прописывания своей DLL в каком-либо ключе реестра? Интересует хоть какой-нибудь мало-мальски рабочий способ. Нужно для XP и Vista. Кто что знает поделитесь! Сам знаю только два способа:

    1. Ключ HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls, значение AppSecDll типа REG_EXPAND_SZ. Туда можно прописать несколько DLL. Такая DLL должна содержать как минимум один экспорт со следующим именем и сигнатурой:

    Код (Text):
    1. 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'ом и запущены.

    Спасибо.
     
  2. NDIS

    NDIS NDIS

    Публикаций:
    0
    Регистрация:
    16 авг 2007
    Сообщения:
    41
    Адрес:
    Москва
    Кстати, вот в этой же статье - Working with the AppInit_DLLs registry value - говорится следующее:

    Вопрос - какие "other techniques" имелись в виду? Какие-то другие ключи или что?
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    NDIS
    Скажи конкретно что делать будет модуль, немного проблемно видеть на таком расстоянии.
    Надо во все процессы - запиши загрузчик в UserSharedData и оттуда его юзай.
     
  4. NDIS

    NDIS NDIS

    Публикаций:
    0
    Регистрация:
    16 авг 2007
    Сообщения:
    41
    Адрес:
    Москва
    Модуль будет перехватывать некоторые высокоуровневые юзермодные API методом сплайсинга. А по поводу UserSharedData можно подробности?
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Можно. Скажи список имён апи и я подумаю как реализовать.
     
  6. NDIS

    NDIS NDIS

    Публикаций:
    0
    Регистрация:
    16 авг 2007
    Сообщения:
    41
    Адрес:
    Москва
    Эм, а разве есть существенная разница? Вообще, в идеале хотелось бы универсальный вариант, т.е. чтобы можно было похучить любую функцию из всех DLL, которые грузятся позже ntdll.dll. Например, tapi32.dll!lineOpen. Но при чём здесь API, речь идёт о внедрении.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Тогда у меня вариантов нет.
     
  8. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Clerk для
    SetWindowTextA
    GetWindowTextA
    lstrlenA

    что посоветуешь?
     
  9. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    NDIS
    я так делал в молодости - собрал свой шелл, прописал его в реестр, он на интерактив-логоне сам стартил ехплорер и хучил в нем CreateProcessInternalW и так далее по цепочке - все предки ехплорера получали мою ДЛЛ в подарок. Работало

    где-то вроде код валялся, ассемблер х32, надо - подарю
     
  10. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    А если запустить прогу через taskman то в неё дллка не попадёт :)
     
  11. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    2FED
    хе, я этим пользовался :) дырка должна быть! везде 8-D
     
  12. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    z0mailbox Подари мне тож если найдёшь =)
     
  13. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    да пожалуйста
    тут немного другой вариант, че-то я через шелл-ключ не нахожу
    но этот даже и лучше - таск-манагер ловит ';)
     
  14. z_x_spectrum

    z_x_spectrum New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    145
    архив битый
     
  15. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Нужно хукать создание нового потока, при этом в энтри-поинте дллки создаете поток и смотрите его реальный энтри-поинт (через ZwQueryInformationThread) далее запоминаете его (это будет BaseThreadStart) далее в хуке создания потока сравниваете энтри поинты, если это не BaseThreadStart то значит это BaseProcessStart, дальше дело техники (создаете суспендед и проч.).
    Грузиться пофиг каким способом, после загрузке прогрузить себя во все процессы через RtlCreateUserThread (работает на висте для всех процессов в отличие от RemoteThread)
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    tylerdurden
    Точна, тока в DllEntryPoint ntdll хукать надо, в остальные модуля хитрый поток может не попасть. Мы делаем так.
    Код (Text):
    1. RegisterCalloutsForDll(
    2. IN OUT *PVOID Handler):PVOID
    3.  
    4. RegisterCalloutsForDll proc Handler:PVOID
    5.     assume fs:nothing
    6.     mov edx,fs:[TEB.Peb]
    7.     mov ecx,Handler
    8.     mov edx,PEB.Ldr[edx]
    9.     mov eax,dword ptr [ecx]
    10.     mov edx,PEB_LDR_DATA.InLoadOrderModuleList[edx]
    11.     assume edx:PLDR_DATA_TABLE_ENTRY    ;Main module
    12.     mov edx,LDR_DATA_TABLE_ENTRY.InLoadOrderModuleList.Flink[edx]   ;ntdll.dll
    13.     lock xchg [edx].EntryPoint,eax
    14.     mov dword ptr [ecx],eax
    15.     ret
    16. RegisterCalloutsForDll endp
    17.  
    18. PsRegisterCalloutsForDll(
    19. IN HANDLE ProcessHandle,
    20. IN OUT *PVOID Handler):NTSTATUS
    21.  
    22. PsRegisterCalloutsForDll proc ProcessHandle:HANDLE, Handler:PVOID
    23. Local ProcessInformation:PROCESS_BASIC_INFORMATION
    24. Local Loader:PULONG, ReturnLength:ULONG
    25.     _setseh_
    26.     invoke ZwQueryInformationProcess, ProcessHandle, ProcessBasicInformation, addr ProcessInformation, SizeOf PROCESS_BASIC_INFORMATION, addr ReturnLength
    27.     test eax,eax
    28.     jnz exit_
    29.     add ProcessInformation.PebBaseAddress,PEB.Ldr
    30.     invoke PsReadVirtualMemoryProtected, ProcessHandle, ProcessInformation.PebBaseAddress, addr Loader, SizeOf PVOID, addr ReturnLength
    31.     test eax,eax
    32.     jnz exit_
    33.     add Loader,PEB_LDR_DATA.InLoadOrderModuleList
    34.     invoke PsReadVirtualMemoryProtected, ProcessHandle, Loader, addr Loader, SizeOf PVOID, addr ReturnLength
    35.     test eax,eax
    36.     jnz exit_
    37.     add Loader,LDR_DATA_TABLE_ENTRY.InLoadOrderModuleList.Flink
    38.     invoke PsReadVirtualMemoryProtected, ProcessHandle, Loader, addr Loader, SizeOf PVOID, addr ReturnLength
    39.     test eax,eax
    40.     mov edx,Handler
    41.     jnz exit_
    42.     mov eax,dword ptr [edx]
    43.     add Loader,LDR_DATA_TABLE_ENTRY.EntryPoint
    44.     mov dword ptr [ProcessInformation],eax
    45.     invoke PsReadVirtualMemoryProtected, ProcessHandle, Loader, Handler, SizeOf PVOID, addr ReturnLength
    46.     test eax,eax
    47.     jnz exit_
    48.     invoke PsWriteVirtualMemoryProtected, ProcessHandle, Loader, addr ProcessInformation, SizeOf PVOID, addr ReturnLength
    49. exit_:
    50.     _endseh_
    51.     ret
    52. PsRegisterCalloutsForDll endp