Операционная система Android
Общий обзор проблемы безопасности ОС Android. Развитие индустрии по борьбе с вредоносным и мошенническим ПО. Разработка Системы ранжирования уровней опасности Android приложений. Выбор производителя и типа СУБД. Тестирование программного обеспечения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 13.02.2016 |
Размер файла | 2,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
· Method_descr - таблица соответствия идентификатора опасного метода его описанию, которое будет предоставлено пользователю
Рисунок 14. Структура таблиц баз данных Системы
На ранке существуют множество различных реляционных СУБД, но наиболее популярные из них три: MySQL, Microsoft SQL Server, Oracle. В виду того что освоение ORACLE требует много времени, как правило связано с проектированием больших и сложных БД, использовать такие мощности для достаточно простой системы нецелесообразно.
СУБД MySQL отличается большой популярность, стабильностью и простой развёртывания. Но обладает слабой интегрированностью со средой разработки Microsoft Visual Studio. Так как в данном проекте используется язык программирования С# разумнее всего использовать СУБД Microsoft SQL Server. Даная система отличается высокой степенью интеграции со средой Visual Studio и предполагает плавный переход от решения простых задач к проектированию сложных Баз данных.
2.2.5 Механизм ранжирования приложений по метаданным и по исполняемому коду
Метаданные.
В качестве метаданных в данном проекте будет использоваться только файл AndroidManifest.XML. Структура этого файла уже была описана в разделе в параграфе 1.6 раздела 1.
В этом файле наибольший интерес представляет список названий требуемых приложением разрешений (доступ в Интернет, отправка SMS и т.п.).
Исходя из общего списка разрешений, опубликованного на официальной странице операционной системы, проведём анализ опасности каждого разрешения и выставим ему уровень опасность путём попарного сравнения каждого разрешения.
Исполняемый файл
Для того чтобы понять уровень опасности по исполняемому файлу необходимо разобраться в его структуре. Решение задачи находится на поверхности - структура файла стандартизована разработчиками ОС. В данную структуру входит специальная секция в файле содержащая имена используемых в приложении имён методов и классов.
Для корректного ранжирования опасности по исполняемому файлу потребуется обратится к документации разработчика ОС составив список библиотечных классов и методов (примером метода является опасный SendTextMessage, класса SmsManager).
Результатом анализа библиотечных методов на предмет опасности может стать список опасных методов полученных в результате аналогичной схеме по Метаданным.
Таким образом имеем два списка с рангами:
· Список с разрешениями.
· Список с названиями методов.
В обоих случаях шкала опасности определяется Таблицей 3:
Таблица 3. Шкала опасности Android приложений.
Суммарный ранг |
Уровень опасности |
|
0-4 |
Приложение не опасно |
|
5-10 |
Приложение потенциально опасно |
|
10- |
Приложение крайне опасно |
2.2.6 Интерфейс пользователя
Разработанная система имеет наиболее простой интерфейс пользователя, построенный на генерации форм Microsoft Windows. Динамическая обработка данных пользователя и вывод результатов осуществляется при запросов к базе и отображении отчетов в отдельной форме.
Общий вид. На Рисунке 15 представлено основная форма Системы.
Рисунок 14. Структура таблиц баз данных Системы
Задание входных данных для обработки системой. На рисунке 15 представлен ввод входных данных.
Рисунок 15. Ввод данных в систему
Получение результатов обработки приложения. На рисунке 16 представлен ввод результата обработки приложения.
Рисунок 16. Вывод результатов обработки приложения.
Следует отметить, что в рамках разворачивания инфраструктуры непосредственный обработчик установочных пакетов может является консольным приложением, запускаемым при необходимости. Обработчик осуществляет статический анализ установочного пакета, заносит информацию в базу данных и даёт сигнал обработчику графики о том, что результаты готовы для показа пользователю.
2.2.7 Схема работы модулей системы
Следует отметить, что проектируемая система достаточно сложна, чтобы весь её функционал реализовать в одном блоке. Для проектирования такого рода программных средств целесообразно использовать модульный подход, при котором базовые операции Системы раздроблены на составляющие систему модули (блоки).
При таком подходе проектирования обеспечивается информативный вид кода, понятная логическая структура программного продукта. Проста поддержки Системы и её сопровождения.
На рисунке 17 представлена блок-схема взаимодействия модулей программных разрабатываемой системы.
Рисунок 17. Блок-схема модулей системы.
Выводы
В рамках проектирования системы в данной дипломной работе потребовалось изучить особенности популярных языков программирования, выявить их слабые и сильные стороны и принять решение о том в какой среде разрабатывать систему. Выбор пал на язык программирования C# и его библиотеку .Net.
Исходя из требований к данному дипломному проекту, был разработан алгоритм функционирования системы, предусматривающий использование базы данных.
Так как система предполагает взаимодействие с пользователем возникла необходимость разработать интерфейс взаимодействия. Для этого необходимо спроектировать оконные формы ввода данных и получения результатов.
Первичные запуски системы показали её эффективность при определении уровня опасности. Таким образом, можно сказать, что поставленные перед системой задачи выполнены.
Для дальнейшего внедрения системы требуется детальное тестирование.
Раздел 3. Оценка эффективности принятых решений
3.1 Выбор и обоснование оценок эффективности
аndroid программный приложение
В данном дипломном проекте разрабатывается программный продукт, как и любой другой продукт, он нуждается в оценке его эффектности. Так как в данном дипломном проекте к программному продукту предъявлены определённые технические требования, то необходимо оценить способность системы к решению поставленных перед ней задач. Данную оценку эффективности можно дать двумя способами.
1. Провести многократное тестирование системы «по белому ящику»
2. Провести однократное тестирование системы по черному ящику но используя заведомо подготовленные известные данные.
Наряду с функционалом системы необходимо оценить эффективность системы при сравнении ей с работой систем-конкурентов, данного рода оценку можно дать, только проверив временную характеристику работы систем на специально подготовленных тестовых данных.
Таким образом, при оценке эффективности имеет смысл провести полное тестирование, оценив то число по скольким приложениям система сможет выдать верный вердикт, а так же замерить скорость выполнения запросов. И сравнив скорость дать оценку эффективности.
3.2 Выбор и обоснование методики тестирования
Для осуществления тестирования были предложены следующие методы.
Так как тестирование проводится по белому ящику необходимо
1) Подготовить специальное тестовое приложение.
2) Загрузить приложение в систему
3) Посмотреть результаты работы.
Зная уровень опасности созданного приложения необходимо сверить результаты с эталоном.
Так же в целях тестирования необходимо проверить работу системы в исключительных ситуациях.
Проверка обработки исключений, возникающих в процессе работы Системы осуществляется путем создания критических условий, характерных для нестабильного функционирования испытуемой системы, и по её реакции принимается решение о правильности обработки исключительных ситуаций..
Ещё одним вариантом методики является проверка хаотично выбранного приложения доступного из сети INTERNET. В данном случае методика предполагает следующие шаги:
1) Найти ресурс сети INTERNET, распространяющий приложения для ОС Android. Скачать несколько приложений
2) Вручную обработать приложения силами таксировщика выявив опасный функционал (если есть)
3) Загрузить файлы в систему.
4) Сверить результаты с анализом.
Если сравнивать две методики между собой, то разумнее всего использовать подготовленные заранее данные. Это проще с точки зрения подготовки данные для теста. Быстрее с точки зрения анализа результатов. Но есть и минус - такое тестирование слегка отдалено от действительности, но в целом весьма эффективное.
Таким образом при тестирование будет использоваться методика с заготовленными данными.
Так же надо учесть методики тестирования на корректную обработку системой критических ситуации. Для этого потребуется так же специальное приложение, структура которого специально испорчена.
Исходя из вышесказанного, тестирование будет по трём методиками:
1) Загрузка в систему специального тестового приложения - корректного.
2) Загрузка в систему специального тестового приложения - некорректного.
3) Загрузка в систему любого приложения - замер времени выполнения.
3.3 Тестирование разработанного программного обеспечения
На данном этапе проектирования системы необходимо провести оценочные мероприятия по выявлению тех или иных особенностей и неполадок в работе системы.
Необходимо провести тестирование системы. Тестирование разработанного ПО можно проводить двумя путями.
Первый вариант - это тестирование по черному ящику. В рамках этого тестирования на вход системе подаются данные, вердикт по которым известен заранее. Система тестируется комплексно, главным образом результаты работы.
Второй вариант - это анализ работы тестовых заданий, времени обработки результата, анализ надежности и удобства.
Так как тестирование по черному ящику предполагает сильное вмешательство в код системы возрастает вероятность человеческой ошибки. Поэтому в данном дипломном проекте будет проводится тестирование только по белому ящику.
Объектом тестирования является Система автоматического ранжирования уровня опасности Android приложений.
Цель тестирования - Испытание разработанной Системы автоматического ранжирования уровня опасности Android приложений для проверки соответствия требованиям технического задания и оценки надежности, эффективности.
3.3.1 Требования к Системе
В техническом задании на дипломный проект заявлены следующие требования к разрабатываемой Системе.
Общие требования
Данная Система ранжирования уровней опасности Android приложения должна выполнять следующие основные функции:
· создание отчетов в формате WEB страницы(вывод данных)
· статический анализ приложения
· хранение информации в формате Баз данных
· обработка загружаемых файлов (ввод данных)
· хранение признаков уровней опасности в формате БД(ввод данных)
· обработка сохраненной информации;
Входные данные: На вход системе подаётся установочный пакет приложения для ОС Android. Данный пакет имеет специфическую структуру: формат пакета - архив типа ZIP, состоит как минимум из двух файлов: classes.dex и AndroidManifest.xml.
Если при работе системы в неё будет загружен установочный пакет иного формата, то система должна сообщить об ошибке.
Формат файла classes.dex бинарный, для его обработки необходимо разработать специальный статический анализатор.
Выходные данные: Результатом работы системы должен файл отчета содержащий следующие поля:
· Название анализируемого файла
· Имя установочного пакета
· Хеш-сумма MD5, посчитанная от установочного пакета
· Числовое значение уровня опасности приложения с обозначенной рядом шкалой и словесным описанием уровня.
· Список словестных описаний полученного уровня.
Данные так же дублируются на дисплей пользователя в виде отдельного окна интерфейса Системы.
Требования к надежности
Для того чтобы Система работала корректно в течении долгого времени необходимо спроектировать в системе следующие функции:
°проверку входных данных на предмет повреждения и соответствие требованиям;
°ведение диалога с пользователем - сообщая ему об ошибке;
°возможность повторной загрузки.
Требования к условиям эксплуатации
Для работы Системы абсолютно необходимо наличие библиотеки .Net Framework.
Требования к составу и параметрам технических средств
Для функционирования программного обеспечения необходимо наличие следующих технических средств:
°IBM РС-совместимая машина;
°монитор (для ввода-вывода информации);
Требования к информационной и программной совместимости
Данная программа должна представлять собой самостоятельный исполняемый модуль.
Система должна быть реализована с использованием одного из известных языков программирования (Java, C#) и работать под управлением операционной системы Microsoft Windows.
Требования к программной документации
Дня разрабатываемого программного обеспечения должна быть разработана следующая техническая документация:
°текст программы; (см. Приложение 2);
°программа и методика тестирования; (см. раздел 3.3);
°руководство пользователя. (см. Приложение 1)
3.3.2 Средства тестирования
Для тестирования разрабатываемой системы необходимо использовать 1 ПЭВМ со следующими основными характеристиками:
Процессор - Intel Core i7 CPU 2630QM 2 ГГц;
Оперативная память - 6 Гб;
Жесткий диск - 600 Гб;
Сетевой адаптер - Realtek RTL8169/8110 Family Gigabit Ethernet;
Клавиатура, Мышь;
Операционная система - Microsoft Windows 7;.
Тестирование разработанной Системы выполнялось согласно методике испытаний, указанной в разделе 3.2.
Результаты тестирования приведены в таблице 3.
3.3.3 Результаты тестирования системы
Таблица 3. Результаты тестирования Системы.
№ пп раздела 3.2 |
Метод тестирования |
Результат тестирования |
|
3.2.1 п.1 |
Проверить, что загруженное в систему тестовое приложение обработалось системой корректно |
Успех |
|
3.2.1 п.2 |
Проверить, что загруженное в систему повреждённое тестовое приложение обработалось системой корректно |
Исключительные ситуации обрабатываются корректно |
|
3.2.1 п.3 |
Замер скорости выполнения запроса на хаотичном приложении |
1 минута |
В данном тестировании рассматривалась эффективность разработанной системы (временная оценка), по сравнению с некоторыми существующими на сегодняшний день программными средствами определения уровня опасности Android приложений.
В данном тестировании использовались следующие программные продукты: ресурс virustotal.com, Песочница DroidBox, Ативирусное ПО LOOKOUT
Суть сравнительного тестирования состоит в оценке времени за которое вышеуказанные программные средства определят уровень опасности Android приложения в сравнении в разработанной в данной дипломной работе Системой.
Таблица 4. Результаты сравнительного тестирования.
Наименование программного продукта |
||
Спец файл 1 |
||
virustotal.com |
1 минута |
|
DroidBox |
5 минут |
|
LOOKOUT |
10 минут |
|
Система ранжирования уровня опасности Android приложений |
1 минута |
3.4 Оценка и результатов
Результаты тестирования показывают, что разработанная в данной дипломной работе Система ранжирования уровней опасности Android отвечает предъявленным к ней требованиям. Выполняет заложенный в неё функционал.
Для проведения оценок было собрано достаточно данных:
Исходя из таблицы 3, можно сделать вывод о том, что что разработанная в рамках данной дипломной работы Система эффективна с точки зрения заложенного в ней функционала и предъявленных к ней требований.
Исходя из таблицы 4, можно сделать вывод о том, что разработанная в рамках данной дипломной работы Система, превосходит по временным характеристикам возможности представленных в сравнительном тестировании программные средства. Таким образом Система доказывает свою эффективности в разрезе временных характеристик работы.
3.5 Надежность разрабатываемой системы
Одними из самых серьезных проблем программного обеспечения (ПО) являются дороговизна, низкая надежность и свойство системы сохранять во времени в установленных пределах значения всех параметров, характеризующих способность выполнять требуемые функции в заданных режимах и условиях эксплуатации. Чем качественнее система, тем она надежнее, и наоборот. Многие специалисты считают первый из этих недостатков продолжением второго. Поскольку программное обеспечение по самой своей природе ненадежно, его тестирование и сопровождение требует постоянных и существенных расходов. Необнаруженные ошибки в программах могут явиться причиной отказов, последствия которых могут оказаться существенными.
Следует начать с того что озвучить термины надёжности для этого необходимо обратится к трудам "Надёжность программного обеспечения” Майерса и к "Надёжность программных средств" Липаева:
· Если программное обеспечение не выполняет ожидаемых от него функций, то такая ситуация показывает наличие ошибки в ПО;
· отказ программного обеспечения - это появление в нем ошибки;
· под надёжностью программного обеспечения следует понимать вероятность безотказной работы в течении заранее заданного промежутка времени, полученной с учетом потерь полученных пользователем в результате каждого отдельного взятого отказа.
Исходя из данных терминов можно сделать вывод:
· Надежность программного обеспечения является не только внутренним свойством программы;
· надежность ПО - это функция как самого ПО, так и ожиданий (действий) его пользователей.
Основными причинами ошибок ПО являются:
· большая сложность ПО (например, по сравнению с аппаратурой ЭВМ);
· неправильный перевод информации из одного представления в другое на макро и микро уровнях.
Сложность системы является одной из главных причин низкой надежности ПО. В общем случае, сложность объекта является функцией взаимодействия (количества связей) между его компонентами. В борьбе со сложностью ПО используются две концепции. Иерархическая структура. Иерархия позволяет разбить систему по уровням понимания (абстракции, управления). Концепция уровней позволяет анализировать систему, скрывая несущественные для данного уровня детали реализации других уровней. Иерархия позволяет понимать, проектировать и описывать сложные системы.
Источниками ошибок (угрозами надежности) ПО являются:
· внутренние - ошибки проектирования, ошибки алгоритмизации, ошибки программирования, недостаточное качество защиты, ошибки в документации;
· внешние - ошибки пользователей, сбои и отказы аппаратуры ЭВМ, искажение информации в каналах связи, изменения конфигурации системы.
Важным этапом жизненного цикла ПО, определяющим качество и надежность системы, является тестирование. Тестирование - процесс выполнения программ с намерением найти ошибки.
Этапы тестирования:
· автономное тестирование - контроль отдельного программного модуля отдельно от других модулей системы;
· тестирование функций - контроль выполнения системой автоматизируемых функций;
· комплексное тестирование - проверка соответствия системы требованиям пользователей;
· тестирование полноты и корректности документации - выполнение программы в строгом соответствии с инструкциями;
· тестирование конфигураций - проверка каждого конкретного варианта поставки (установки) системы.
Существуют две стратегии при проектировании тестов:
· тестирование по отношению к спецификациям (документации), не заботясь о тексте программы;
· тестирование по отношению к тексту программы, не заботясь о спецификациях.
Разумный компромисс лежит где-то посередине, смещаясь в ту или иную сторону в зависимости от функций, выполняемых конкретным модулем, комплексом или подсистемой.
Показателем надежности программного комплекса может служить вероятность отсутствия обнаружения программных ошибок в течение определенного промежутка времени при эксплуатации программы в расчетном режиме в информационной системе.
Безотказность - свойство объекта непрерывно сохранять работоспособность в течение некоторой наработки или в течение некоторого времени.
Среднее время наработки на ошибку:
, где
- интенсивность ошибок ПО;
Интенсивность ошибок разрабатываемого ПО рассчитывается по формулам:
,
, где
- фактическое время отладки;
- коэффициент крутизны линии, характеризующий скорость роста надежности;
- число обнаруженных ошибок за время отладки t;
- общее число строк;
- коэффициент, учитывающий влияние методологии программирования на надежность ПО;
- коэффициент, учитывающий использование i-той технологии программирования;
- коэффициент, учитывающий использование i-того языка программирования;
- коэффициент, учитывающий использование i-той платформы программирования;
В данном ПО использовались:
-объектно-ориентированная технологий программирования ();
-среда разработки Visual Studio ();
-операционная система семейства Windows ().
Количество строк кода .
Отладка производилась тестированием ПО в течение 140 часов.
Результаты приведены в таблице 5 .
Таблица 5. Интенсивность ошибок.
Количество ошибок |
Продолжительность отладки t, часы |
Интенсивность ошибок , |
|
32 |
20 |
0.00060 |
|
24 |
20 |
0.00045 |
|
18 |
20 |
0.00033 |
|
13 |
20 |
0.00024 |
|
10 |
20 |
0.00018 |
|
7 |
20 |
0.00013 |
|
5 |
20 |
0.00009 |
Интенсивность ошибок, как было сказано выше, рассчитываем по формуле:
Остальные значения считаются аналогично.
На основе полученных данных построим кривую зависимости интенсивности ошибок от времени отладки (рисунок 18).
Рисунок 18.Зависимость интенсивности ошибок от времени отладки.
Как показано выше, функциональная зависимость интенсивности ошибок ПО от времени отладки описывается экспоненциальным законом и зависит от коэффициента крутизны линии, характеризующей скорость роста надежности , и от фактического времени отладки ПО. Анализ результатов тестирования ПО позволил определить .
Таким образом, интенсивность ошибок разрабатываемого ПО составляет:
,
.
Для разрабатываемого ПО средняя наработка на ошибку составит:
Вероятность безошибочной работы системы в течение времени t рассчитывается по формуле:
.
Пусть t = 8 часам. Тогда:
Ремонтопригодность - свойство объекта быть приспособленным к предупреждению и обнаружению отказов и повреждений, к восстановлению работоспособности и исправности в процессе технического обслуживания и ремонта.
Для ПО ремонтопригодность характеризуется коэффициентом готовности. Готовность - свойство ПО быть в состоянии выполнять требуемую функцию в данный момент времени при заданных условиях использования.
Коэффициент готовности рассчитывается по формуле:
, где
- средняя наработка на ошибку (6943 часа);
- время восстановления программы (30 минут = 0.5 часа).
Таким образом, коэффициент готовности разрабатываемой системы равен:
Выводы
1. Разработанная в рамках данной дипломной работы Система удовлетворяет всем требованиям, описанным настоящей пояснительно записки.
2. Разработанная в рамках данной дипломной работы Система успешно прошла тестирование по всем пунктам методики испытаний приведенной в разделе 3.2 пояснительно записки.
3. Использование специальных подготовленных баз данных оправдало себя и дало хорошие показатели производительности.
4. Для повышения надежности и минимизации времени на восстановления работоспособности после сбоев рекомендуется делать резервные копии базы данных на внешний носитель.
Заключение
В данном дипломном проекте ставилась задача разработки Системы автоматического ранжирования уровня опасности Android приложений.
Необходимость в такой системе на моём предприятии была вызвана тем, что нам на обработку присылают большие объемы разного рода приложений, и мы не в силах их обработать вручную. Для того чтобы справиться с потоком был необходим инструмент, позволяющий пре-анализировать приложения. Отличить потенциально опасное приложение от чистого. Для этого не было подходящих готовых решений на рынке. Исходя из вышесказанного можно утверждать, что разработка такой системы является чрезвычайно актуальной для предприятия.
В ходе дипломного проектирования были решены следующие задачи.
На этапе исследований предметной области была разобрана структура операционной системы Android в части её безопасности. Так же была разобрана структура приложений для данной операционной системы. Были получены навыки обратной инженерии. Оценены возможности автоматической обработки приложений - их автоанализ. Для сокращения временных затрат на повторную обработку было принято решение ввести в систему СУБД - для хранения данных.
На этапе разработки Системы, были выбраны средства разработки, а именно язык программирования C#, было принято решение, что интерфейс Системы должен быть в виде WEB страницы. Таким образом достигнута независимость системы от типа клиента, его операционной системы, браузера. Была выбрана СУБД MS SQL Server в качестве хранения данных.
На этапах разработки и тестирования был разработан интерфейс взаимодействия с пользователем, который и является ядром системы. Так же была создана методика тестирования всей системы. Была разработана соответствующая документация. Документация включила в себя наглядное пособие по развёртыванию системы и её эксплуатации с иллюстрациями. На ряду с программной частью была проделана работа по оценке принятый в проекте решений а так же проведен расчет надёжности системы.
В экономическом разделе проекте было приведено технико-экономическое обоснование разработки Системы, а так же была проиллюстрирована экономическая эффективность создаваемой Системы.
В разделе по охране труда было проведено исследование опасных и вредных факторов при работе с ПЭВМ, методы защиты от них, а также приведены эргономические требования к рабочим местам.
Результатом работы над дипломным проектом является разработанная Система ранжирования уровня опасности Android приложений, которая позволила начать автоматическую обработку более 2000 файлов в сутки, поступающих на анализ в Лабораторию Касперского. Таким образом аналитики Лаборатории смогли оперативно реагировать на поступающие запросы и выявлять новые неизвестные опасные объекты.
Список литературы
5. "C# 4.0. Полное руководство ", Герберт Шилдт, Вильямс, 2013 г.
6. "Язык программирования C# 5.0 и платформа .NET 4.5", Эндрю Троелсен, Вильямс, 2013 г.
7. "Инфраструктура программных проектов. Соглашения, идиомы и шаблоны для многократно используемых библиотек .NET", Кржиштоф Цвалина, Брэд Абрамс, Вильямс, 2011 г.
8. "PHP. Объекты, шаблоны и методики программирования", Мэтт Зандстра, Вильямс, 2011 г.
9. "Microsoft SQL Server 2008. Реализация и обслуживание" ,Майк Хотек, Русская Редакция, 2011 г.
10. "SQL и реляционная теория. Как грамотно писать код на SQL", К. Дж. Дейт, Символ-Плюс, 2010 г.
11. "Базы данных", И. А. Кумскова, КноРус, 2011 г.
12. "Безопасность глобальных сетевых технологий", Владимир Зима, Александр Молдовян, Николай Молдовян, BHV-Санкт-Петербург, 2003 г.
13. "Анонимность и безопасность в Интернете", Денис Колисниченко, 2012 г
14. "Основы информационной безопасности. Краткий курс", Феникс, 2008 г.
15. "Надёжность программного обеспечения” Майерс" Г. /Мир. - М., 1980. - 360 с.
16. "Надёжность программных средств" Липаев В.В. /СИНТЕГ. - М., 1998. - 232 с.
17. Интернет ресурсы:
18. http://www.kaspersky.ru
19. http://virustotal.com
20. https://code.google.com/p/droidbox/
21. http://habrahabr.ru
22. https://source.android.com/tech/security/
23. http://play.google.com/
24. http://www.computerra.ru
25. Трудовой кодекс Российской Федерации.
26. ГОСТ 12.0.003-99 Опасные и вредные производственные факторы. Классификация.
27. ГОСТ 12.1.030-81 (2001) Электробезопасность. Защитное заземление. Зануление.
28. ГОСТ ССБТ 12.1.124-83 Средства защиты от статического электричества.
29. СанПиН 2.2.2/2.4.1340-03 Гигиенические требования к персональным ЭВМ и организации работы.
30. ГОСТ 12.1.019-96 Система стандартов безопасности труда (ССБТ). Общие требования и номенклатура видов защиты.
31. Санитарные правила и нормы (СанПиН) 2.2.1/2.1.1.1278-03 Гигиенические требования к естественному, искусственному и совмещенному освещению жилых и общественных зданий.
32. ГОСТ 12.1.004-91 Пожарная безопасность. Общие требования.
Приложение 1. Руководство пользователя
Данная система предназначена для ранжирования уровня опасности Android приложений. Состоит из двух основных частей: основная часть - файл с именем AppRatings.exe, написанный на языке С# с использованием .NET фреймворка и база данных на основе СУБД Microsoft SQL Server 2013,
Таким образом для нормального функционирования системы потребуется провести подготовительные работы следующего характера:
1. Установить Microsoft SQL Сервер, создать внутри СУБД пользователя, выполнить файл db.sql, текст которого содержится в Приложении 2. Дать доступ на созданные базы ранее созданному пользователю с уровнем доступа RW. Ссылка на дистрибутив http://care.dlservice.microsoft.com//dl/download/5/6/5/5656F917-B0AE-415B-9136-A9DC7915143A/SQLServer2012SP1-FullSlipstream-RUS-x64.iso?lcid=1049&cprod=sql2012rtm32cta
2. При необходимости установить комплект библиотек .Net FrameWork
В результате всех описанных выше действий при запуске файла AppRatings.exe должно быть успешное отображение интерфейса системы представленное на Рисунке 1
Рисунок 1. Успешно работающий интерфейс системы.
Работа в системе
Работу в системе можно строить двумя путями
1) Если у пользователя нет исследуемого файла а есть лишь его хеш-сумма, то необходимо ввести её в верхнее поле ввода как показано на рисунке 2. После нажатия на кнопку «Отправить» система сделать запрос к базе данных, и выдаст результат о том известно ли ей информация по указанной хеш-сумме.
Рисунок 2. Ввод данных в систему.
2) Если у пользователя есть исследуемый
Для того чтобы обработать файл необходимо нажать на кнопку «ОБЗОР» и выбрать интересующий файл как показано на рисунке 3
Рисунок 3. Загрузка файла в систему.
После того как выбор сделан необходимо нажать на кнопку отправить - система после непродолжительного ожидания выдаст результаты, пример которых показан на рисунке 3
Рисунок 3. Результаты работы системы
Приложение 2. Распечатка текстов программных модулей
Модуль взаимодействия с пользователем:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 fr2 = new Form2(this);
string md5 = textBox1.Text.ToString();
string File_Path = textBox2.Text.ToString();
if (md5.Length == 0 & File_Path.Length == 0)
{
MessageBox.Show("Пожалуйста, заполните хотя бы одну форму ввода");
}
if (md5.Length != 0 & File_Path.Length != 0)
{
MessageBox.Show("За один раз можно создать только один запрос");
}
if (md5.Length > 0 || File_Path.Length > 0) {
fr2.ShowDialog();
}
}
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
textBox2.Text = openFileDialog.FileName;
}
}
}
}
Модуль вызова обработчика данных и вывода информации пользователю:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;
using System.Data.SqlClient;
using System.Data;
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
private Form1 form1;
public Form2(Form1 form1)
{
// TODO: Complete member initialization
InitializeComponent();
this.form1 = form1;
}
private void Form2_Load(object sender, EventArgs e)
{
string File_Path = form1.textBox2.Text;
string File_md5 = form1.textBox1.Text;
string App_Perms = "";
int rank = 0;
if (File_Path.Length != 0){
Manifest.readManifest(File.ReadAllBytes(File_Path));
var permissions = Manifest.permissions;
var app_name = Manifest.AppName;
XmlDocument doc = new XmlDocument();
try
{
doc.LoadXml(System.IO.File.ReadAllText("permissions.xml"));
}
catch (Exception ex) { MessageBox.Show("Не могу открыть файл permissions.xml!");}
XmlNodeList items = doc.GetElementsByTagName("Permission");
foreach (XmlNode x in items) {
foreach (string p in permissions)
{
if (p.Contains(x.Attributes[0].Value)) {
App_Perms += x.Attributes[3].Value;
try
{
if (Convert.ToInt16(x.Attributes[1].Value) > 5)
{
string hoho = p.Substring(p.LastIndexOf(".") + 1, p.Length - p.LastIndexOf(".") - 1);
listBox1.Items.Add(hoho);
// App_Perms += x.Attributes[3].Value;
}
}
catch (ArgumentOutOfRangeException ex) { MessageBox.Show("No"); }
rank += Convert.ToInt32(x.Attributes[1].Value);
}
}
}
label4.Text = tools.GetMD5(File_Path);
label5.Text = app_name;
if (rank > 10) {
label6.BackColor = System.Drawing.Color.Red;
label6.Text = "Крайне опасно";
label7.Text += " содержит следующие опасные методы:";
this.listBox1.Show();
}
if (rank < 10 & rank > 5)
{
label6.BackColor = System.Drawing.Color.Gray;
label6.Text = "Потенциально опасно";
label7.Text += " содержит следующие потенциально опасные методы:";
this.listBox1.Show();
}
if (rank <= 5)
{
label6.BackColor = System.Drawing.Color.Green;
label6.Text = "Безопасно";
label7.Text += " не содержит опасных методов";
}
string connStr = @"Data Source=(local)\SQLEXPRESS;
Initial Catalog=Android;
Integrated Security=True";
SqlConnection conn = new SqlConnection(connStr);
try
{
//пробуем подключится
conn.Open();
}
catch (SqlException se) { MessageBox.Show("Не могу соединится с сервером"); }
//Заносим данные в основную таблицу с уровнем опасности
string s_prepare = "insert into App_Ranking (file_md5,App_Name,metadrank,exerank) values (0x" + label4.Text + ",'" + app_name + "'," + rank + ",0);";
SqlCommand sqlcmd = new SqlCommand(s_prepare,conn);
try
{
sqlcmd.ExecuteNonQuery();
}
catch { MessageBox.Show("Не могу добавить запись в базу данных, скорее всего она уже существует"); }
//Заносим данные в дополнительную таблицу с разрешением по каждому приложению
string s_prepare1 = "insert into App_Permissions (file_Md5,permissions) values (0x" + label4.Text + ",'" + App_Perms + "');";
SqlCommand sqlcmd1 = new SqlCommand(s_prepare1, conn);
try
{
sqlcmd1.ExecuteNonQuery();
}
catch { MessageBox.Show("Не могу добавить запись в базу данных, скорее всего она уже существует"); }
conn.Close();
conn.Dispose();
}
if (File_md5.Length != 0)
{
string connStr = @"Data Source=(local)\SQLEXPRESS;
Initial Catalog=Android;
Integrated Security=True";
SqlConnection conn = new SqlConnection(connStr);
try
{
//пробуем подключится
conn.Open();
}
catch (SqlException se) { MessageBox.Show("Не могу соединится с сервером"); }
//Запрос к основной таблице уровня опасности, заполнение верхней таблицы
string s_prepare = "select * from App_Ranking where file_md5 = 0x" + File_md5 + ";";
SqlCommand sqlcmd = new SqlCommand(s_prepare, conn);
try
{
sqlcmd.ExecuteNonQuery();
}
catch { MessageBox.Show("Не могу выполнить запрос"); }
using (SqlDataReader dr = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection))
{
while (dr.Read())
{
label4.Text = File_md5;
label5.Text = dr.GetValue(1).ToString();
rank = Convert.ToInt32(dr.GetValue(2));
if (rank > 10)
{
label6.BackColor = System.Drawing.Color.Red;
label6.Text = "Крайне опасно";
label7.Text += " содержит следующие опасные методы:";
this.listBox1.Show();
}
if (rank < 10 & rank > 5)
{
label6.BackColor = System.Drawing.Color.Gray;
label6.Text = "Потенциально опасно";
label7.Text += " содержит следующие потенциально опасные методы:";
this.listBox1.Show();
}
if (rank <= 5)
{
label6.BackColor = System.Drawing.Color.Green;
label6.Text = "Безопасно";
label7.Text += " не содержит опасных методов";
}
}
}
//Запрос к основной таблице разрешений, заполнение нижней таблицы
SqlConnection conn1 = new SqlConnection(connStr);
try
{
//пробуем подключится
conn1.Open();
}
catch (SqlException se) { MessageBox.Show("Не могу соединится с сервером"); }
string s_prepare1 = "select * from App_Permissions where file_md5 = 0x" + File_md5 + ";";
SqlCommand sqlcmd1 = new SqlCommand(s_prepare1, conn1);
try
{
sqlcmd1.ExecuteNonQuery();
}
catch { MessageBox.Show("Не могу выполнить запрос"); }
XmlDocument doc = new XmlDocument();
try
{
doc.LoadXml(System.IO.File.ReadAllText("permissions.xml"));
}
catch (Exception ex) { MessageBox.Show("Не могу открыть файл permissions.xml!");}
XmlNodeList items = doc.GetElementsByTagName("Permission");
using (SqlDataReader dr = sqlcmd1.ExecuteReader(CommandBehavior.CloseConnection))
{
while (dr.Read())
{
App_Perms = Convert.ToString(dr.GetValue(1));
string[] perms = new string[App_Perms.Length / 2];
int k = 0;
int i = 0;
while (k < App_Perms.Length/2)
{
while(i < App_Perms.Length)
{
perms[k] += App_Perms[i];
i++;
if (i % 2 == 0) { k++; break; }
}
}
foreach (string s in perms)
{
foreach (XmlNode x in items)
{
if (s == x.Attributes[3].Value)
{
if (Convert.ToInt16(x.Attributes[1].Value) > 5)
{
listBox1.Items.Add(x.Attributes[0].Value);
}
break;
}
}
}
}
}
conn.Close();
conn.Dispose();
}
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
XmlDocument doc = new XmlDocument();
try
{
doc.LoadXml(System.IO.File.ReadAllText("permissions.xml"));
}
catch (Exception ex) { MessageBox.Show("Не могу открыть файл permissions.xml!"); }
XmlNodeList items = doc.GetElementsByTagName("Permission");
foreach (XmlNode x in items) {
if (listBox1.SelectedItem.Equals(x.Attributes[0].Value)) {
label8.Text = x.Attributes[2].Value;
label8.Show();
}
}
}
}
}
Модуль обработки данных 1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace WindowsFormsApplication1
{
class Dex
{
public Dex(string _filename)
{
// Strings_all = new List<string>();
FileFullName = _filename;
}
public Dex(byte[] buff)
{
//Strings_all = new List<string>();
this.buff = buff;
FileFullName = "";
}
public string FileFullName;
public byte[] buff;
private static byte[] DEXMAGIC = { 0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x35, 0x00 }; //dex\n035\0
private const uint HEADER_SIZE = 0x70;
private const uint MAGIC_SIZE = 8;
private const uint SHA_SIZE = 0x14;
private const uint ENDIAN_TAG = 0x12345678;
public string[] Strings_all;
public string [] Methods;
public string[] Types;
public string[] Fields;
public class _ImageDexHeader
{
public byte[] magic;
public UInt32 checksum;
public byte[] sha;
public UInt32 file_length;
public UInt32 header_lenght;
public UInt32 endiantag;
public UInt32 link_size;
public UInt32 link_off;
public UInt32 map_off;
public UInt32 string_ids_size;
public UInt32 string_ids_off;
public UInt32 type_ids_size;
public UInt32 type_ids_off;
public UInt32 proto_ids_size;
public UInt32 proto_ids_off;
public UInt32 field_ids_size;
public UInt32 field_ids_off;
public UInt32 method_ids_size;
public UInt32 method_ids_off;
public UInt32 class_defs_size;
public UInt32 class_defs_off;
public UInt32 data_size;
public UInt32 data_off;
public bool Read(BinaryReader BR)
{
if (BR.BaseStream.Length < GetSize())
{
return false;
}
try
{
BR.BaseStream.Seek(0, SeekOrigin.Begin);
magic = BR.ReadBytes((int)MAGIC_SIZE);
checksum = BR.ReadUInt32();
sha = BR.ReadBytes((int)SHA_SIZE);
file_length = BR.ReadUInt32();
header_lenght = BR.ReadUInt32();
endiantag = BR.ReadUInt32();
link_size = BR.ReadUInt32();
link_off = BR.ReadUInt32();
map_off = BR.ReadUInt32();
string_ids_size = BR.ReadUInt32();
string_ids_off = BR.ReadUInt32();
type_ids_size = BR.ReadUInt32();
type_ids_off = BR.ReadUInt32();
proto_ids_size = BR.ReadUInt32();
proto_ids_off = BR.ReadUInt32();
field_ids_size = BR.ReadUInt32();
field_ids_off = BR.ReadUInt32();
method_ids_size = BR.ReadUInt32();
method_ids_off = BR.ReadUInt32();
class_defs_size = BR.ReadUInt32();
class_defs_off = BR.ReadUInt32();
data_size = BR.ReadUInt32();
data_off = BR.ReadUInt32();
}
catch
{
return false;
}
for (int i = 0; i < MAGIC_SIZE; i++)
if (magic[i] != DEXMAGIC[i]) return false;
//if (!magic.Equals(DEXMAGIC)) return false;
if (endiantag != ENDIAN_TAG) return false;
if (file_length != BR.BaseStream.Length) return false;
if (header_lenght != HEADER_SIZE) return false;
return true;
}
public UInt32 GetSize()
{
return HEADER_SIZE;
}
}
private bool ReadStrings(BinaryReader BR, uint string_ids_offset, uint string_ids_size)
{
Strings_all = new string[string_ids_size];
if (BR.BaseStream.Length <= string_ids_size * 4 + string_ids_offset) return false;
BR.BaseStream.Position = string_ids_offset;
for (int i = 0; i < string_ids_size; i++)
{
BR.BaseStream.Position = string_ids_offset + i * 4;
var str_ids_offset = BR.BaseStream.Position;
var str_offset = BR.ReadUInt32();
BR.BaseStream.Position = str_offset;
var str_size = ReadLEB128(BR);
var buff = BR.ReadBytes((int)str_size);
var name = "";
foreach (var b in buff)
{
name += (char)b;
}
Strings_all[i] = name;
}
return true;
}
private bool ReadMethods(BinaryReader BR, uint method_off, uint method_size)
{
Methods = new string[method_size];
if (BR.BaseStream.Length <= 8 * method_size + method_off) return false;
BR.BaseStream.Position = method_off;
for (int i = 0; i < method_size; i++)
{
var class_idx = BR.ReadUInt16();
var proto_idx = BR.ReadUInt16();
var name_idx = (int)BR.ReadUInt32();
string item = Strings_all[name_idx];
string cl_name = Types[(int)class_idx];
if (!cl_name.EndsWith(";")) cl_name += ";";
Methods[i] = (cl_name + item);
// Console.WriteLine(cl_name);
// Console.WriteLine(item);
// Console.WriteLine(Types[(int)class_idx] + item);
}
return true;
}
private bool ReadFields(BinaryReader BR, uint field_off, uint field_size)
{
Fields = new string[field_size];
if (BR.BaseStream.Length <= 8 * field_size + field_off) return false;
BR.BaseStream.Position = field_off;
for (int i = 0; i < field_size; i++)
{
var class_idx = BR.ReadUInt16();
var proto_idx = BR.ReadUInt16();
var name_idx = (int)BR.ReadUInt32();
string item = Strings_all[name_idx];
Fields[i] = (Types[(int)class_idx] + item);
// Console.WriteLine(Types[(int)class_idx] + item);
}
return true;
}
private bool ReadTypes(BinaryReader BR, uint types_off, uint types_size)
{
Types = new string[types_size];
if (BR.BaseStream.Length <= 4 * types_size + types_off) return false;
BR.BaseStream.Position = types_off;
for (int i = 0; i < types_size; i++)
{
var name_idx = (int)BR.ReadUInt32();
string item = Strings_all[name_idx];
//if (!Types.Contains(item))
Types[i] = item;
}
return true;
}
public static UInt64 ReadLEB128(BinaryReader BR)
{
UInt64 res = 0;
int shift = 0;
while (true)
{
byte value = BR.ReadByte();
res |= (UInt64)((value & 0x7f) << shift);
shift += 7;
if ((value & 0x80) == 0) break;
}
return res;
}
private bool GetBinareReader(out BinaryReader br)
{
if (string.IsNullOrEmpty(FileFullName))
{
MemoryStream ms = new MemoryStream(buff);
br = new BinaryReader(ms);
return true;
}
br = new BinaryReader(File.OpenRead(FileFullName));
if (br.BaseStream.Length < 20) return false;
var h = br.ReadBytes(4);
//64 65 78 0A
if ((h[0] == 0x64) && (h[1] == 0x65) && (h[2] == 0x78) && (h[3] == 0x0a)) return true;
//50 4B 03 04
if ((h[0] == 0x50) && (h[1] == 0x4b) && (h[2] == 0x03) && (h[3] == 0x04))
{
br.BaseStream.Position = 0;
var dex = tools.GetDex(br.ReadBytes((int)br.BaseStream.Length));
if (dex.Length < 20) return false;
MemoryStream ms = new MemoryStream(dex);
br = new BinaryReader(ms);
return true;
}
return false;
}
public bool Read()
{
BinaryReader br;
if (!GetBinareReader(out br)) return false;
_ImageDexHeader header = new _ImageDexHeader();
if (!header.Read(br)) return false;
if (!ReadStrings(br, header.string_ids_off, header.string_ids_size)) return false;
if (!ReadTypes(br, header.type_ids_off, header.type_ids_size)) return false;
if (!ReadMethods(br, header.method_ids_off, header.method_ids_size)) return false;
if (!ReadFields(br, header.field_ids_off, header.field_ids_size)) return false;
return true;
}
public bool Read_small()
{
BinaryReader br;
if (!GetBinareReader(out br)) return false;
_ImageDexHeader header = new _ImageDexHeader();
if (!header.Read(br)) return false;
if (!ReadStrings(br, header.string_ids_off, header.string_ids_size)) return false;
if (!ReadTypes(br, header.type_ids_off, header.type_ids_size)) return false;
if (!ReadMethods(br, header.method_ids_off,header.method_ids_size)) return false;
return true;
}
public List<string> Read_strings()
{
BinaryReader br;
if (!GetBinareReader(out br)) return new List<string>();
_ImageDexHeader header = new _ImageDexHeader();
if (!header.Read(br)) return new List<string>();
if (!ReadStrings(br, header.string_ids_off, header.string_ids_size)) return new List<string>();
return Strings_all.ToList();
}
}
}
Модуль обработки данных 2:
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace WindowsFormsApplication1
{
class Manifest
{
public static List<string> actions;
public static List<string> permissions;
public static string AppName;
public static void readManifest(byte[] apk)
{
actions = new List<string>();
permissions = new List<string>();
//List<string> res = new List<string>();
if ((apk[0] != 0x50) || (apk[1] != 0x4b) || (apk[2] != 0x03) || (apk[3] != 0x04))
//return "";
return;
try
{
MemoryStream ms = new MemoryStream(apk);
using (ZipInputStream zip = new ZipInputStream(ms))
{
ZipEntry theEntry;
while ((theEntry = zip.GetNextEntry()) != null)
{
if (theEntry.Name == String.Empty)
continue;
Console.WriteLine(theEntry.Name);
if (theEntry.Name.Contains("AndroidManifest.xml"))
{
MemoryStream rs = new MemoryStream();
int size = 2048;
int ll = 0;
byte[] data = new byte[2048];
while (true)
{
size = zip.Read(data, 0, data.Length);
if (size > 0)
{
ll += size;
rs.Write(data, 0, size);
}
else
{
break;
}
}
// Thread.Sleep()
if (rs.Length < 0x20) continue;
var unp_buff = new byte[rs.Length];
rs.Position = 0;
rs.Read(unp_buff, 0, unp_buff.Length);
rs.Flush();
decompressXML(unp_buff);
//return decompressXML(unp_buff);
}
}
}
//no manifest
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
// return "";
}
// decompressXML -- Parse the 'compressed' binary form of Android XML docs
// such as for AndroidManifest.xml in .apk files
private static int endDocTag = 0x00100101;
private static int startTag = 0x00100102;
private static int endTag = 0x00100103;
private static string decompressXML(byte[] xml)
{
int tabs = 0;
int numbStrings = LEW(xml, 4 * 4);
// StringIndexTable starts at offset 24x, an array of 32 bit LE offsets
// of the length/string data in the StringTable.
int sitOff = 0x24; // Offset of start of StringIndexTable
// StringTable, each string is represented with a 16 bit little endian
// character count, followed by that number of 16 bit (LE) (Unicode) chars.
int stOff = sitOff + numbStrings * 4; // StringTable follows StrIndexTable
Подобные документы
Первое устройство, работающее под управлением Android. Приложения под операционную систему Android. Формат установочных пакетов. Разработка приложений на языке Java. Шаблоны основных пакетов и компонентов Android. Сборка приложений, основанная на Gradle.
курсовая работа [492,0 K], добавлен 08.02.2016Архитектура и история создания операционной системы Android. Язык программирования Java. Выбор средства для реализации Android приложения. Программная реализация Android приложения. Проведение тестирования разработанного программного обеспечения.
курсовая работа [167,8 K], добавлен 18.01.2017Архитектура операционной системы Android. Инструменты Android-разработчика. Установка Java Development Kit, Eclipse IDE, Android SDK. Настройка Android Development Tools. Разработка программы для работы с документами и для осуществления оперативной связи.
курсовая работа [2,0 M], добавлен 19.10.2014Разработка открытой мобильной платформы Android. Первое устройство, работающее под управлением Android. Магазин приложений "Google Play". Полноценные программы навигации, редакторы офисных документов и синхронизационные утилиты. Рост вирусной активности.
презентация [58,8 K], добавлен 29.10.2014Архитектура операционной системы Android, набор библиотек для обеспечения базового функционала приложений и виртуальная машина Dalvik. Объектно-ориентированный язык программирования Java как инструмент разработки мобильных приложений для ОС Android.
дипломная работа [1,6 M], добавлен 08.07.2015Структура Android-приложений. Особенности игрового движка. Алгоритмизация и программирование. Список игровых состояний. Настройка, отладка и тестирование программы. Разработка руководства пользователя. Тестирование инсталляции и отображения элементов.
дипломная работа [4,5 M], добавлен 19.01.2017Место и роль различных изданий в современном обществе. Основные требования к подготовке электронных учебных изданий. Разработка приложений. Операционная система Android. Выбор программного обеспечения. Пакеты для обработки растровой и векторной графики.
отчет по практике [1,6 M], добавлен 26.05.2014Обзор существующих популярных программ для просмотра погоды на ОС Android. Операционные системы современных смартфонов. Ключевые особенности Android, технология Java. Разработка программной части, выбор языка, описание алгоритма, ее логической структуры.
курсовая работа [911,5 K], добавлен 16.04.2014Общие характеристики операционной системы Android. Разработка приложения на основе создания менеджера файлов. Получение с помощью приложения доступа к файлам, хранящимся в "облачном хранилище" в сети Интернет. Расчет стоимости программного обеспечения.
дипломная работа [2,7 M], добавлен 03.04.2015Общая характеристика системы Android, обзор его аналогов. Необходимые компоненты для начала работы в Android. Настройка конфигураций Ubuntu. Написание script-ов, упрощающих генерацию Linux. Отладка и тестирование программы на плате i.MX53 фирмы freescale.
курсовая работа [1,1 M], добавлен 12.10.2012