Windows на страже порядка Deeoni$ Спецвыпуск: Хакер, номер #058, стр. 058-004-2 При следующей перезагрузке компьютера Windows сохранит значение этого параметра. Далее, когда User32.dll будет спроецирован на адресное пространство процесса, этот модуль получит уведомление DLL_PROCESS_ATTACH и после его обработки вызовет LoadLibrary для всех DLL, указанных значением AppInit_DLLs. В момент загрузки каждая DLL инициализируется вызовом ее функции DLLMain с параметром fwdReason, равным DLL_PROCESS_ATTACH. Это простейший способ внедрения DLL. Нам не надо делать ничего, кроме как запустить regedit.exe и подредактировать соответствующий ключик. Но у этого способа есть свои недостатки, и они довольно существенны. Во-первых, написанная в поту и крови dll проецируется на адресные пространства только тех процессов, на которые спроецирован модуль User32.dll. Его, как известно, используют все GUI-приложения, но в большинстве консольных программ эта библиотека ни к чему. Из этого вытекает первый недостаток: код можно внедрить только в приложения с графическим интерфейсом. Во-вторых, DLL будет проецироваться на адресные пространства всех запущенных GUI-процессов. Чем больше приложений "подомнет" под себя твой код, тем вероятнее то, что кто-нибудь где-нибудь повиснет или вылетит. Другими словами, значительно повышается риск непредвиденных ошибок. В-третьих, внедренные инструкции обычно нужны не на всем протяжении работы процесса. После того как DLL сделает свое дело, тебе захочется поскорее убрать ее из памяти. Но - не выйдет. Поэтому перейдем к следующему способу, более продвинутому. Внедрение DLL с помощью ловушек Все недостатки, перечисленные немного выше, становятся неактуальны, если для внедрения dll использовать хуки (ловушки). Хук можно поставить используя следующую API-функцию: HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId); Первым параметром этой функции является тип устанавливаемого хука. Например, idHook может быть равен WH_GETMESSAGE. Эта разновидность ловушки срабатывает при генерировании процессом какого-либо сообщения. Параметр lpfn – это указатель на процедуру (в адресном пространстве нашего процесса), которую система должна вызывать всякий раз при срабатывание хука, то есть при обработке окном сообщения. hMod идентифицирует DLL, содержащую функцию, на которую указывает lpfn. В Windows значение hMod для DLL фактически задаст адрес виртуальной памяти, по которому DLL спроецирована на адресное пространство. Последнее значение, передаваемое SetWindowsHookEx, указывает поток, для которого предназначена ловушка. Передавая 0, мы сообщаем системе, что ставим хук для всех существующих в ней GUI-процессов. В случае удачного выполнения функция вернет хэндл на хук-процедуру. В противном случае будет NULL. |