Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Вызов функции из DLL с помощью Winlogon

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Вызов функции из DLL с помощью Winlogon
Имя
Сообщение << Старые топики   Новые топики >>
Вызов функции из DLL с помощью Winlogon - 2007-01-21 04:54:31.373333   
voody

Сообщений: 958
Оценки: 0
Присоединился: 2005-02-06 22:28:30
Всем привет. Читал как-то давно статью про автозагрузку программ через ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Winlogon\Notify. Содаешь там новый раздел с произвольным названием, в нем еще несколько параметров, главные - Impersonate типа REG_DWORD, Asynchronus тоже типа REG_DWORD, путь к библиотеке типа REG_SZ и хотя бы один параметр типа REG_SZ (можно несколько), имя которого - системное событие (Logon, Logoff, Startup, и т.д.), а значение - функция из библиотеки. Так вот, решил недавно попробовать как все это работает, скомпилил быстро в MSVC++ 2005 библиотеку, почти ничего не меняя, единственное, вставил в DllMain один MessageBox и один в отдельную функцию, которую я, собственно говоря, и экспортирую и пишу в качестве значения одного из ключей реестра. Решил поставить вызов функции на событие Logon (вход в систему), перезагружаюсь, загружается Винда, я ввожу свой пароль, жму Enter и все … Комп показал MessageBox и завис. Ни на что не реагировал. Еле Винду потом откачал, т.к. даже безопасный режим не прокатывал, а Norton Commander не понимает NTFS [:(]. Повезло, что у меня был под рукой старый винч, я его подцепил, загрузил с него Винду и удалил эту DLL'ку :). Все прошло. Потом поменял событие на Startup. Комп завис еще при загрузке. Поступил так же, как и в первый раз. В чем дело? Может надо в код библиотеки что-то дописать, чтобы Винда не висла? Если можно - дайте код такой библиотеки на C++. Заранее спасибо.
Post #: 1
RE: Вызов функции из DLL с помощью Winlogon - 2007-01-21 21:25:33.716666   
Freackazoid

Сообщений: 47
Оценки: 0
Присоединился: 2006-04-30 23:39:27
Как то тоже это пользовала, винда при старте реально подвисала но потом все проходило… Правда я писала свой код DLL'ки и взяла только саму идею ветки реестра.

Так что неплохо было бы если бы ты выложил код DLL или хотя бы линк на статью.
Post #: 2
RE: Вызов функции из DLL с помощью Winlogon - 2007-01-21 23:09:06.813333   
voody

Сообщений: 958
Оценки: 0
Присоединился: 2005-02-06 22:28:30
В качестве кода я взял шаблон обычной DLL'ки в MSVC++ 2005, добавив туда 2 MessageBox'а:

#include "stdafx.h" #ifdef _MANAGED #pragma managed(push, off) #endif void __declspec(dllexport) testfunc(void) {MessageBox(NULL, TEXT("Function called!"), TEXT("DLL"), 64); ExitProcess(0);} BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { MessageBox(NULL, TEXT("DLL loaded!"), TEXT("DLL"), 64); return TRUE; } #ifdef _MANAGED #pragma managed(pop) #endif
Ссылки на статью нет, но есть сама статья, вот кусок из нее:
______________________________________________________
quote:

[запуск из-под Winlogon]
Если начать искать более незаметные методы автозагрузки в реестре, то выясняется, что их превеликое множество. Для начала рассмотрим раздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify, в котором хранятся списки DLL, подгружаемых процессом winlogon.exe при наступлении определенных событий в системе. Неплохим методом автозапуска является запись в этот раздел реестра собственной DLL. Один из его плюсов то, что наша DLL может быть запущена от процесса System при старте системы. При этом хакер получает полный доступ к системе, но, правда, лишается доступа к шифрованным файлам пользователя (на NTFS). Обойти это ограничение он может с помощью запуска DLL при входе пользователя в систему (с включенной имперсонацией), либо сделав инжект в пользовательский процесс. Также хакеру, вероятно, будет полезно то, что есть возможность определить несколько функций в одной DLL, которые будут вызываться при разных системных событиях, к примеру, при старте системы и при входе пользователя в систему.
Итак, для запуска своей DLL нам необходимо создать в Winlogon\Notify раздел с произвольным именем. Обязательными параметрами этого раздела будут являться Asynchronous, DllName, Impersonate и один или несколько параметров отвечающих за событие при котором DLL будет загружена. Параметр Asynchronous (REG_DWORD) определяет тип вызова функций из DLL. При значении 0 функции будут вызываться из основного потока процесса winlogon.exe, и загрузка системы не сможет быть продолжена до тех пор, пока функция не вернет управление. При значении 1 функция будет вызвана асинхронно, в отдельном потоке, а, следовательно, она сможет никогда не возвращать управление системе. Параметр DllName определяет путь к загружаемой DLL. Если DLL находится в системной папке, то можно прописать только ее имя. Параметр Impersonate определяет права доступа потока, в котором будет вызвана наша функция. При значении 0 поток получит права системы, а при значении 1 - права пользователя, с которым связано произошедшее событие. Рассмотрим теперь типы событий и имена соответствующих им ключей в реестре.
Logon - событие входа пользователя в систему, его применение целесообразно тогда, когда требуется выполнять действия от имени пользователя.
Logoff - выход пользователя из системы.
ScreenSaver - запуск скринсейвера, следует применять тогда, когда нужно выполнять действия приводящие к большой загрузке системы (а, следовательно, заметные пользователю).
StopScreenSaver - завершение работы скринсейвера.
Shutdown - завершение работы системы, на это событие можно повесить сохранение каких-либо данных.
StartShell - запуск оболочки, происходит при старте explorer.exe. Обрати внимание, это событие не эквивалентно Logon, так как может быть вызвано несколько раз из за рестарта оболочки при возникающих сбоях.
PostShell – событие, возникающее после запуска оболочки.
Startup - старт системы, наверняка хакер будет использовать именно это событие для загрузки трояна. Следует заметить, функция повешенная на это событие будет всегда вызываться от имени системы, независимо от значения параметра Impersonate.
Lock - событие блокировки рабочей станции, оно возникает при смене пользователя без выхода из системы, либо при блокировке с помощью клавиш Win+L (Windows XP).
Unlock - разблокировка рабочей станции, либо переключение на другого залогиненного в системе пользователя.
Disconnect - отключение рабочей станции от домена.
Reconnect - подключение рабочей станции к домену.
Как видишь, набор событий весьма велик, и на каждое можно повесить свой обработчик. Это позволит отслеживать действия пользователя и выбирать наиболее удачный момент для запуска той или иной функции трояна.
Вот, к примеру, исходный код DLL, запускающей notepad.exe от имени System при входе пользователя в систему:
library Run;
uses
windows;
procedure ExecuteNotepad();
var
St: TStartupinfo;
Pr: TProcessInformation;
begin
ZeroMemory(@St, SizeOf(St));
St.cb := SizeOf(St);
St.lpDesktop := PChar('winsta0\default');
CreateProcess(nil, 'notepad.exe', nil, nil, false, 0, nil, nil, St, Pr);
end;
exports
ExecuteNotepad;
begin
end.
Эта DLL содержит только одну функцию - ExecuteNotepad, которая вешается на событие Logon. Для установки надо скопировать эту DLL в папку \windows\system32 и выполнить REG-файл следующего содержания (думаю, содержимое этого файла будет тебе понятно и без моих комментариев):
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\Run]
"Asynchronous"=dword:00000001
"Impersonate"=dword:00000000
"DllName"="run.dll"
"Logon"="ExecuteNotepad"
Недостаток этого метода в том, что раздел реестра, куда прописывается троян, документирован в MSDN, а, следовательно, некоторые пользователи могут его иногда проверять. Однако, не смотря ни на что, метод работает в 99% случаев и показал себя достаточно надежным для использования в RAT.

Post #: 3
RE: Вызов функции из DLL с помощью Winlogon - 2007-01-25 02:07:55.843333   
voody

Сообщений: 958
Оценки: 0
Присоединился: 2005-02-06 22:28:30
quote:

ORIGINAL: Freackazoid
Так что неплохо было бы если бы ты выложил код DLL или хотя бы линк на статью.
Какой смысл просить выкладывать код и статью, если все-равно не собираешься больше отвечать на эту тему?
Post #: 4
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Вызов функции из DLL с помощью Winlogon







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.