Количество ошибок
|
Продолжительность отладки 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 часа).
Таким
образом, коэффициент готовности разрабатываемой системы равен:
Выводы
. Разработанная в рамках данной дипломной работы Система
удовлетворяет всем требованиям, описанным настоящей пояснительно записки.
. Разработанная в рамках данной дипломной работы Система успешно
прошла тестирование по всем пунктам методики испытаний приведенной в разделе
3.2 пояснительно записки.
. Использование специальных подготовленных баз данных оправдало
себя и дало хорошие показатели производительности.
. Для повышения надежности и минимизации времени на восстановления
работоспособности после сбоев рекомендуется делать резервные копии базы данных
на внешний носитель.
Заключение
В данном дипломном проекте ставилась задача разработки Системы
автоматического ранжирования уровня опасности Android приложений.
Необходимость в такой системе на моём предприятии была вызвана тем, что
нам на обработку присылают большие объемы разного рода приложений, и мы не в
силах их обработать вручную. Для того чтобы справиться с потоком был необходим
инструмент, позволяющий пре-анализировать приложения. Отличить потенциально
опасное приложение от чистого. Для этого не было подходящих готовых решений на
рынке. Исходя из вышесказанного можно утверждать, что разработка такой системы
является чрезвычайно актуальной для предприятия.
В ходе дипломного проектирования были решены следующие задачи.
На этапе исследований предметной области была разобрана структура
операционной системы Android
в части её безопасности. Так же была разобрана структура приложений для данной
операционной системы. Были получены навыки обратной инженерии. Оценены
возможности автоматической обработки приложений - их автоанализ. Для сокращения
временных затрат на повторную обработку было принято решение ввести в систему
СУБД - для хранения данных.
На этапе разработки Системы, были выбраны средства разработки, а именно
язык программирования C#,
было принято решение, что интерфейс Системы должен быть в виде WEB страницы. Таким образом достигнута
независимость системы от типа клиента, его операционной системы, браузера. Была
выбрана СУБД MS SQL Server в качестве хранения данных.
На этапах разработки и тестирования был разработан интерфейс
взаимодействия с пользователем, который и является ядром системы. Так же была
создана методика тестирования всей системы. Была разработана соответствующая
документация. Документация включила в себя наглядное пособие по развёртыванию
системы и её эксплуатации с иллюстрациями. На ряду с программной частью была
проделана работа по оценке принятый в проекте решений а так же проведен расчет
надёжности системы.
В экономическом разделе проекте было приведено технико-экономическое
обоснование разработки Системы, а так же была проиллюстрирована экономическая
эффективность создаваемой Системы.
В разделе по охране труда было проведено исследование опасных и вредных
факторов при работе с ПЭВМ, методы защиты от них, а также приведены
эргономические требования к рабочим местам.
Результатом работы над дипломным проектом является разработанная Система
ранжирования уровня опасности Android
приложений, которая позволила начать автоматическую обработку более 2000 файлов
в сутки, поступающих на анализ в Лабораторию Касперского. Таким образом
аналитики Лаборатории смогли оперативно реагировать на поступающие запросы и
выявлять новые неизвестные опасные объекты.
Список литературы
5. "C# 4.0. Полное руководство ", Герберт
Шилдт, Вильямс, 2013 г.
. "Язык программирования C# 5.0 и платформа .NET
4.5", Эндрю Троелсен, Вильямс, 2013 г.
. "Инфраструктура программных проектов.
Соглашения, идиомы и шаблоны для многократно используемых библиотек .NET",
Кржиштоф Цвалина, Брэд Абрамс, Вильямс, 2011 г.
. "PHP. Объекты, шаблоны и методики
программирования", Мэтт Зандстра, Вильямс, 2011 г.
. "Microsoft SQL Server 2008. Реализация и
обслуживание" ,Майк Хотек, Русская Редакция, 2011 г.
. "SQL и реляционная теория. Как грамотно писать
код на SQL", К. Дж. Дейт, Символ-Плюс, 2010 г.
. "Базы данных", И. А. Кумскова, КноРус,
2011 г.
. "Безопасность глобальных сетевых
технологий", Владимир Зима, Александр Молдовян, Николай Молдовян,
BHV-Санкт-Петербург, 2003 г.
. "Анонимность и безопасность в Интернете",
Денис Колисниченко, 2012 г
. "Основы информационной безопасности. Краткий
курс", Феникс, 2008 г.
. "Надёжность программного обеспечения”
Майерс" Г. /Мир. - М., 1980. - 360 с.
. "Надёжность программных средств" Липаев
В.В. /СИНТЕГ. - М., 1998. - 232 с.
. Интернет ресурсы:
. #"865140.files/image052.jpg">
Рисунок 1. Успешно работающий интерфейс системы.
Работа в системе
Работу в системе можно строить двумя путями
) Если у пользователя нет исследуемого файла а есть лишь его
хеш-сумма, то необходимо ввести её в верхнее поле ввода как показано на рисунке
2. После нажатия на кнопку «Отправить» система сделать запрос к базе данных, и
выдаст результат о том известно ли ей информация по указанной хеш-сумме.
Рисунок 2. Ввод данных в систему.
2) Если у пользователя есть исследуемый
Для того чтобы обработать файл необходимо нажать на кнопку «ОБЗОР» и
выбрать интересующий файл как показано на рисунке 3
Рисунок 3. Загрузка файла в систему.
После того как выбор сделан необходимо нажать на кнопку отправить -
система после непродолжительного ожидания выдаст результаты, пример которых
показан на рисунке 3
Рисунок 3. Результаты работы системы
Приложение 2. Распечатка текстов программных модулей
Модуль взаимодействия с пользователем:
using
System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;System.IO;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;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;System.Xml;System.IO;System.Data.SqlClient;System.Data;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);
{
//пробуем подключится
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;System.Collections.Generic;System.Linq;System.Text;System.IO;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 (!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:ICSharpCode.SharpZipLib.Zip;System;System.Collections.Generic;System.IO;System.Linq;System.Text;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
// XMLTags, The XML tag tree starts after some unknown
content after the
// StringTable. There is some unknown data after the
StringTable, scan
// forward from this point to the flag for the start of
an XML start tag.
int xmlTagOff = LEW(xml, 3 * 4); // Start from the offset
in the 3rd word.
// Scan forward until we find the bytes:
0x02011000(x00100102 in normal int)
for (int ii = xmlTagOff; ii < xml.Length - 4; ii +=
4)
{
if (LEW(xml, ii) == startTag)
{
xmlTagOff = ii; break;
}
}
int off = xmlTagOff;
int indent = 0;
int startTagLineNo = -2;
while (off < xml.Length)
{
int tag0 = LEW(xml, off);
//int tag1 = LEW(xml, off+1*4);
int lineNo = LEW(xml, off + 2 * 4);
//int tag3 = LEW(xml, off+3*4);
int nameNsSi = LEW(xml, off + 4 * 4);
int nameSi = LEW(xml, off + 5 * 4);
if (tag0 == startTag)
{ // XML START TAG
int tag6 = LEW(xml, off + 6 * 4); // Expected to be
14001400
int numbAttrs = LEW(xml, off + 7 * 4); // Number of
Attributes to follow
//int tag8 = LEW(xml, off+8*4); // Expected to be
00000000
off += 9 * 4; // Skip over 6+3 words of startTag
data
String name = compXmlString(xml, sitOff, stOff,
nameSi);
//tr.addSelect(name, null);
startTagLineNo = lineNo;
//Console.WriteLine(tag6.ToString() + "\t"
+ name);
// Look for the Attributes
tabs++;
StringBuilder sb = new StringBuilder();
for (int ii = 0; ii < numbAttrs; ii++)
{
int attrNameNsSi = LEW(xml, off); // AttrName
Namespace Str Ind, or FFFFFFFF
int attrNameSi = LEW(xml, off + 1 * 4); //
AttrName String Index
int attrValueSi = LEW(xml, off + 2 * 4); //
AttrValue Str Ind, or FFFFFFFF
int attrFlags = LEW(xml, off + 3 * 4);
int attrResId = LEW(xml, off + 4 * 4); //
AttrValue ResourceId or dup AttrValue StrInd
off += 5 * 4; // Skip over the 5 words of an
attribute
String attrName = compXmlString(xml, sitOff,
stOff, attrNameSi);
String attrValue = attrValueSi != -1
? compXmlString(xml, sitOff, stOff, attrValueSi)
//: "resourceID 0x" +
Integer.toHexString(attrResId);
: "resourceID 0x" +
attrResId.ToString("X");
sb.Append(" " + attrName +
"=\"" + attrValue + "\"");
//tr.add(attrName, attrValue);
}
if (name.ToLower() == "uses-permission")
{
string rr = sb.Replace("\"",
"").ToString();
rr = rr.Substring(rr.IndexOf("name=") +
"name=".Length);
//prtIndent(indent, rr);
permissions.Add( rr);
}
else if (name.ToLower() == "permission")
{
string rr = sb.Replace("\"",
"").ToString();
rr = rr.Substring(rr.IndexOf("name=") +
"name=".Length);
//prtIndent(indent, rr);
permissions.Add(rr);
}
else if (name.ToLower() == "action")
{
string rr = sb.Replace("\"",
"").ToString();
rr = "action = " +
rr.Substring(rr.IndexOf("name=") + "name=".Length);
actions.Add(rr);
// res.Add(rr);
}
indent++;
}
else if (tag0 == endTag)
{ // XML END TAG
indent--;
off += 6 * 4; // Skip over 6 words of endTag data
String name = compXmlString(xml, sitOff, stOff,
nameSi);
}
else if (tag0 == endDocTag)
{
break;
}
else
{
break;
}
}
);
string result = "";
return result;
} // end of decompressXML
private static String compXmlString(byte[] xml, int
sitOff, int stOff, int strInd)
{
if (strInd < 0) return null;
int strOff = stOff + LEW(xml, sitOff + strInd * 4);
return compXmlStringAt(xml, strOff);
}
private static String spaces =
" ";
private static string prtIndent(int indent, String str)
{
Console.WriteLine(spaces.Substring(0,
(int)Math.Min(indent * 2, spaces.Length)) + str);
return spaces.Substring(0, (int)Math.Min(indent * 2,
spaces.Length)) + str;
}
// compXmlStringAt -- Return the string stored in
StringTable format at
// offset strOff. This offset points to the 16 bit string
length, which
// is followed by that number of 16 bit (Unicode) chars.
private static String compXmlStringAt(byte[] arr, int
strOff)
{
int strLen = arr[strOff + 1] << 8 & 0xff00 |
arr[strOff] & 0xff;
char[] chars = new char[strLen];
for (int ii = 0; ii < strLen; ii++)
{
chars[ii] = (char)arr[strOff + 2 + ii * 2];
}
return new string(chars); // Hack, just use 8 byte chars
} // end of compXmlStringAt
// LEW -- Return value of a Little Endian 32 bit word from
the byte array
// at offset off.
private static int LEW(byte[] arr, int off)
{
return (int)(arr[off + 3] << 24 & 0xff000000 |
arr[off + 2] << 16 & 0xff0000
| arr[off + 1] << 8 & 0xff00 | arr[off] &
0xFF);
} // end of LEW
}
}
Модуль распаковки:System;System.Collections.Generic;System.Linq;System.Text;System.IO;System.Security.Cryptography;System.Security.Cryptography.X509Certificates;ICSharpCode.SharpZipLib.BZip2;ICSharpCode.SharpZipLib.Zip;ICSharpCode.SharpZipLib.Zip.Compression;ICSharpCode.SharpZipLib.Zip.Compression.Streams;ICSharpCode.SharpZipLib.GZip;WindowsFormsApplication1
{
class tools
{
public static void unpack(string file)
{
FastZip fz = new FastZip();
string unpdir = file + "_unp";
if (!Directory.Exists(unpdir))
Directory.CreateDirectory(unpdir);
fz.ExtractZip(file, unpdir, null);
}
public static string GetMD5(string filename)
{
try
{
FileStream file = new FileStream(filename,
FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("X2"));
}
return sb.ToString();
}
catch
{
return "000000T000000000000000000000000";
}
}
public static byte[] GetMD5(byte[] buff)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(buff);
return retVal;
}
public static string ConvertMD5(byte[] md5)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < md5.Length; i++)
{
sb.Append(md5[i].ToString("X2"));
}
return sb.ToString();
}
public static byte[] ConvertMD5(string line)
{
line = line.Trim();
var bytes = new byte[16];
line = line.Replace("0x", "");
if (line.Length != 32) return bytes;
for (int i = 0; i < 16; i++)
{
string s = "" + line[i * 2] + line[i * 2 +
1];
int b = Convert.ToInt32(s, (int)16);
bytes[i] = (byte)b;
}
return bytes;
}
public static byte[] GetMD5b(string filename)
{
// FileStream file = new FileStream(filename,
FileMode.Open);
BinaryReader br = new BinaryReader(File.OpenRead(filename));
var buff = br.ReadBytes((int)br.BaseStream.Length);
br.Close();
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(buff);
return retVal;
}
public static byte[] GetDex(byte[] apk)
{
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;
if
(theEntry.Name!="classes.dex")continue;
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;
}
}
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();
if (unp_buff[0] != 0x64) continue;
if (unp_buff[1] != 0x65) continue;
if (unp_buff[2] != 0x78) continue;
if (unp_buff[3] != 0x0a) continue;
return unp_buff;
}
}
return new byte[1];
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
return new byte[1];
}
}
}
}
SQL
Сценарий для выполнения на Microsoft SQL Server
create database Android;Android;table App_Ranking (file_md5
binary(16) PRIMARY KEY, App_Name varchar(25), metadrank int, exerank int);table
App_Permissions (file_Md5 binary(16) FOREIGN KEY references
app_ranking(File_md5), permissions varchar(10));table Perm_Descr (id char(2),
descr text);table ExeMethods (file_Md5 binary(16) FOREIGN KEY references
app_ranking(File_md5), method1 int, method2 int, method3 int, method4 int,
method5 int);table Method_Descr (id int, descr text);
Похожие работы на - Операционная система Android