Помощь в написании студенческих работ
Антистрессовый сервис

Внедрение DLL в адресное пространство процесса

РефератПомощь в написанииУзнать стоимостьмоей работы

В функцию передаются четыре параметра. Первый параметр — это тип сообщений, которые мы собираемся захватывать. Например, если мы используем WH_KEYBOARD, значит, мы собираемся захватывать сообщения от клавиатуры. Вторым параметром является адрес функции (в процессе А), которая вызывается каждый раз, когда окно собирается обработать сообщение. Третий параметр — виртуальный адрес библиотеки DLL… Читать ещё >

Внедрение DLL в адресное пространство процесса (реферат, курсовая, диплом, контрольная)

Приемы внедрения DLL в адресное пространство чужого процесса впервые были описаны Джеффри Рихтером. Как только библиотека DLL окажется загруженной в чужой процесс, появляется возможность изменить ход выполнения любых API-функций.

Внедрение DLL с помощью реестра В операционных системах Windows NT/2000/ХР/2003 существует ключ реестра HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsNT.

CumntVersionWin-dowsAppInit_DLLs. Руткит может установить в качестве значения этого ключа одну из своих библиотек DLL, которая модифицирует IAT целевого процесса или изменяет непосредственно файл kernel32. dll или ntdll.dll. Когда загружается любое приложение, использующее библиотеку user32. dll, все библиотеки DLL, перечисленные в этом разделе реестра, тоже загружаются в адресное пространство этого приложения.

Загрузка каждой из этих библиотек происходит вызовом LoadLibrary. При загрузке каждой библиотеки DLL ее функция DllMain вызывается с параметром DLLPROCESSATTACH. Существует всего четыре варианта загрузки DLL в адресное пространство процесса, но интересует именно вариант с DLLPROCESSATTACH. В момент загрузки DLL с этим параметром руткит должен произвести захват нужных ему функций. С этого момента каждое приложение, которое использует библиотеку user32. dll, а таких большинство (за исключением некоторых консольных приложений), можно будет очень легко обмануть, захватив API-функции. Будет возможность скрывать присутствие файлов, записей в реестре и т. д.

В некоторых источниках информации говорится, что этот метод имеет серьезный недостаток — для того, чтобы изменение в реестре возымело действие, требуется перезагрузка компьютера. Однако это не совсем верно. Все процессы, созданные до изменения ключа в реестре, останутся нетронутыми, остальные же без всякой перезагрузки получат новую библиотеку DLL в свое адресное пространство.

Внедрение DLL путем захвата Windows-сообщений Приложения получают множество сообщений о различных событиях. Например, приложение может получить сообщение, когда нажата какая-либо клавиша на клавиатуре в то время, когда одно из окон приложения активно, или же когда нажата кнопка мыши.

Компания Microsoft предложила функцию, позволяющую захватывать оконные сообщения другого процесса. Мы можем использовать ее для внедрения своей библиотеки DLL в чужое адресное пространство.

Пусть приложение, в которое вы хотите внедрить DLL, называется процесс В. Тогда другой процесс, назовем его процессом А, или загрузчиком руткита, может вызывать функцию SetWindowsHookEx. Прототип этой функции, взятый из MSDN, выглядит следующим образом:

ННООК SetWindowsHookEx (int idHook, HOOKPROC Ipfn, HINSTANCE hMod, DWORD dwThreadld);

В функцию передаются четыре параметра. Первый параметр — это тип сообщений, которые мы собираемся захватывать. Например, если мы используем WH_KEYBOARD, значит, мы собираемся захватывать сообщения от клавиатуры. Вторым параметром является адрес функции (в процессе А), которая вызывается каждый раз, когда окно собирается обработать сообщение. Третий параметр — виртуальный адрес библиотеки DLL, содержащей эту функцию. Последний параметр — это идентификатор потока, который мы хотим захватить. Если он равен 0, тогда захватываются все существующие в системе программные потоки.

Если процесс А делает вызов SetWindowsHookEx (WH_KEYBOARD, myKeyBrdFuncAd, myDllHandle, 0), например, в тот момент, когда процесс В вот-вот получит сообщение от клавиатуры, в адресное пространство процесса В будет загружена библиотека DLL, указанная в параметре myDllHandle и содержащая функцию myKeyBrdFuncAd. И снова библиотека DLL, являющаяся частью руткита, получит возможность захватывать IAT в адресном пространстве процесса или реализовывать захват функций путем непосредственной модификации их кода.

Внедрение DLL с помощью удаленных потоков Еще один способ внедрения DLL в адресное пространство чужого процесса состоит в использовании технологии удаленных программных потоков, создаваемых в чужом процессе. Нужно написать программу, которая создаст удаленный поток, загружающий нужную библиотеку DLL в память процесса. Функция CreateRemoteThread принимает несколько параметров:

HANDLE CreateRemoteThread (HANDLE hProcess,.

LPSECURITY_ATTRIBUTES lpThreadAttributes,.

SIZE_T dwStackSize,.

LPTHREAD_START_ROUTINE 1pStartAddress,.

LPVOID IpParameter,.

DWORD dwCreationFlags,.

LPDWORD lpThreadld);

Первый параметр — это описатель процесса, в котором создается поток. Для получения этого описателя загрузчик руткита может воспользоваться функцией OpenProcess, в качестве параметра ей нужно передать идентификатор процесса (Process Identifier, PID). Функция OpenProcess имеет следующий прототип:

HANDLE OpenProcess.

(DWORD dwDesiredAccess,.

BOOL blnheritHandle,.

DWORD dwProcessId);

Используя программу Taskmgr. exe, можно узнать PID процесса. Естественно, получить его можно и программным способом.

Второй и седьмой параметры функции CreateRemoteThread устанавливаются в NULL, третий и шестой — в 0. Остались четвертый и пятый параметры, они для атаки самые важные. Загрузчик руткита должен передать в качестве четвертого параметра адрес функции LoadLibrary в целевом процессе. Можно воспользоваться адресом LoadLibrary загрузочного приложения. Это сработает, только если целевой процесс импортирует какие-либо функции из библиотеки Kernel32. dll, в которой и находится функция LoadLibrary. Итак, чтобы получить нужный адрес, необходимо воспользоваться функцией GetProcAddress:

GetProcAddress (GetModuleHandle (TEXT («Kernel32»)), «LoadLibraryA»);

Приведенный ранее код получает адрес LoadLibrary из процесса, выполняющего внедрение. Можно, не опасаясь, воспользоваться этим адресом, так как библиотека Kernel32. dll располагается в целевом процессе по тем же самым виртуальным адресам, что и в процессе, выполняющем внедрение. (Это обычное явление. Изменение адресной базы библиотеки требует дополнительных временных затрат, и Microsoft, естественно, старается их избежать.) Функция LoadLibrary имеет тот же самый формат, что и функция THREAD_START_ROUTINE, поэтому она может быть использована в качестве четвертого параметра CreateRemoteThread. Последний пятый параметр — это адрес аргумента, который будет передан функции LoadLibrary. Нельзя просто передать сюда адрес строки, содержащей имя DLL, так как эта строка на самом деле находится в адресном пространстве приложения, выполняющего внедрение, следовательно, этот адрес не имеет смысла для целевого процесса. Существуют две функции, позволяющие загрузчику руткита обойти это препятствие. При помощи функции VirtualAllocEx можно выделить память в адресном пространстве целевого процесса:

LPVOID VirtualА11осЕх.

(HANDLE hProcess,.

LPVOID lpAddress,.

SIZE_T dwSize,.

DWORD flAllocationType, DWORD flProtect);

Чтобы записать имя DLL в память, которая была только что выделена функцией VirtualAllocEx, можно воспользоваться функцией WriteProcessMemory. Она имеет следующий прототип:

BOOL WriteProcessMemory (HANDLE hProcess,.

LPVOID lpBaseAddress, LPCV0I0 lpBuffer,.

SIZE_T nSize,.

SIZE_T* lpNumberOfBytesWritten);

Данные захваты (захват IAT и захват функций путем непосредственной модификации их кода) вполне типичны и для их реализации требуется получить доступ к адресному пространству целевого приложения. Обычные способы сделать это — внедрение DLL или создание удаленного программного потока.

Показать весь текст
Заполнить форму текущей работой