Купить
 
 
Жанр: Учеба

Компьютерная вирусология ч. 1

страница №46

н, управление
передается на прерывание INT 18h . На винчестере, этот код в "корневом
секторе" в действительности определяет MBR, который исходя из данных в
Partiton Table затем загружает и выполняет бутсектор соответствующего
раздела. Это передает управление активной операционной системе диска.
Это прерывание используется вирусами "переживающими" теплую
перезагрузку.

-==T===T==T==========T==============T==================================¬
¦1A¦fun¦--¦ сервис ¦ REAL TIME ¦ Ввод-вывод для времени ¦
¦ ¦ ¦ ¦ BIOS ¦CLOCK SERVICES¦ ¦
L--+---+--+----------+--------------+-----------------------------------

Эта сервис предоставляет доступ к системным часам. PC BIOS
работает со "счетчиком тиков" - числом 55-мс интервалов, прошедших с
момента включения или сброса PC. BIOS PC/AT предоставляет также доступ к
значениям часов реального времени, которые постоянно обновляются
независимо от работы процессора и хранятся в CMOS-памяти компьютера AT.

-==T===T==T==========T==============T==================================¬
¦1B¦ - ¦--¦Указатель ¦ KEYBOARD ¦ Прерывание от нажатия клавиши ¦
¦ ¦ ¦ ¦ ¦ BREAK ¦ Control-Break ¦
L--+---+--+----------+--------------+-----------------------------------

Этот вектор (0:006c) берется, когда BIOS распознает нажатие
клавиши Ctrl-Break. INT 1bh первоначально указывает на IRET, но DOS
устанавливает его на локальную программу, которая взводит внутренний
флаг DOS. DOS время от времени проверяет этот флаг и действует в
соответствии с действующим режимом обработки прерываний. (см прил.5
функции 33h и INT 23h, используемые для обработки Ctrl-Break в
программе).

-==T===T==T==========T==============T==================================¬
¦1C¦ - ¦--¦Программно¦CLOCK TICK ¦Пользовательское прерывание ¦
¦ ¦ ¦ ¦аппаратное¦TIMER TICKS - ¦по таймеру ¦
¦ ¦ ¦ ¦прерывание¦ ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

Этот вектор (0:0070) BIOS берет по каждому тику аппаратных часов
(каждые 55 миллисекунд; приблизительно 18.2 раз в секунду).
Первоначально он указывает на IRET, но может быть изменен
пользовательской программой, чтобы адресовать фоновую программу
пользователя, базирующуюся на таймере.

-==T===T==T==========T==============T==================================¬
¦1D¦ - ¦--¦ указатель¦6845 VIDEO ¦ Указатель видеопараметров ¦
¦ ¦ ¦ ¦ BIOS ¦INIT TABLES ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

Этот вектор (0:0074) указывает на совокупность видео параметров,
используемых прерыванием INT 10h для установки регистров
видеоконтроллера и некоторых констант BIOS при инициализации режима
видео. Можно создать RAM-резидентную версию этой таблицы и
модифицировать параметры, чтобы изменить работу некоторых экранных
режимов. Например, таким способом команда DOS "Mode" сдвигает экран
влево или вправо.
-==T===T==T==========T==============T==================================¬
¦1E¦ - ¦--¦ Указатель¦DISKETTE PARAM¦Указатель параметров дискеты ¦
¦ ¦ ¦ ¦ BIOS ¦(BASE TABLE) ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

Этот вектор (0:0078) указывает на таблицу параметров дискеты,
которую прерывание 13h использует для различных операций с дискетами.

-==T===T==T==========T==============T==================================¬
¦20¦ - ¦--¦ сервис ¦PROGRAM ¦ Завершить программу ¦
¦ ¦ ¦ ¦ MS DOS ¦TERMINATION ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

Это прерывание используется для выхода из программы и возврата
управления родительскому процессу (обычно COMMAND.COM). Оно
восстанавливает значения управляющих векторов INT 22h INT 23h INT 24h
и сбрасывает все файловые буфера. Регистр CS должен содержать значение
PSP завершающегося процесса. Программы COM-формата обычно выполняются
при CS=PSP, И, следовательно, могут выдавать INT 20h в любой момент.


-==T===T==T==========T==============T==================================¬
¦21¦fun¦ ¦ сервис ¦ DOS ¦ Функции MS DOS ¦
¦ ¦ ¦ ¦ MS DOS ¦ SERVICE ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

Это прерывание служит главным входом большинства функций DOS.
Подробнее см. прил.5.

-==T===T==T==========T==============T==================================¬
¦22¦ - ¦--¦ Указатель¦ TERMINATE ¦Адрес завершения ¦
¦ ¦ ¦ ¦ MS DOS ¦ ADDRESS ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

Адрес в этом векторе (0000:0088) представляет собой место, куда
будет передано управление, когда текущая программа завершится
выполнением функции 20h (традиционный выход в DOS), 21-00h,
21-4Ch(EXIT), 27h (TSR: Завершиться, но остаться резидентным) или 21-31h
(KEEP). Адрес в этом векторе копируется в поле PSP Terminate Address
функциями 26h (создать PSP) и 4bh (EXEC). Подробнее см. прил.5.

-==T===T==T==========T==============T==================================¬
¦23¦ - ¦--¦Указатель ¦ CONTROL "C" ¦ Адрес выхода по Ctrl-Break ¦
¦ ¦ ¦ ¦ MS DOS ¦ EXIT ADDRESS ¦ ¦
L--+---+--+----------+--------------+-----------------------------------
Адрес в этом векторе (0000:008c) - это адрес, по которому
передается управление, когда DOS распознает, что пользователь нажал
Ctrl-Break. Адрес по вектору INT 23h копируется в поле PSP Ctrl-Break
Address функциями DOS 26h (создать PSP) и 4ch (EXEC). Исходное значение
адреса обработчика Ctrl-Break восстанавливается из PSP при завершении
программы. Таким образом, по завершении порожденного процесса будет
восстановлен адрес обработчика Ctrl-Break из родительского процесса.
DOS вызывает INT 23h, когда распознает, что нажата комбинация
Ctrl-Break. Реакция на нажатие Ctrl-Break может быть проверена или
установлен посредством функции 33h (см. прил.5).

-==T===T==T==========T==============T==================================¬
¦24¦ - ¦--¦Указатель ¦ FATAL ERROR ¦Обработчик критических ошибок ¦
¦ ¦ ¦ ¦ MS DOS ¦HANDLER ADDRES¦ ¦
L--+---+--+----------+--------------+-----------------------------------
Этот вектор (0000:0090) хранит адрес, по которому передается
управление, когда драйвер устройства DOS обнаруживает критическую
ошибку. Адрес по этому вектору копируется в PSP функицями 26h (Создать
PSP) и 4bh (EXEC). При выходе родитель- ские значения восстанавливаются
в векторе INT 24h из родительского PSP. Нормальный обработчик INT 24h -
это код, который выдает сообщение:

Abort, Retry, Ignore?

при неготовности дискеты или принтера. Многие вирусы используют для
блокирования этого сообщения собственный обработчик критических ошибок.

-==T===T==T==========T==============T==================================¬
¦25¦ - ¦--¦ сервис ¦ ABSOLUTE ¦ Прямая дисковая операция чтения ¦
¦ ¦ ¦ ¦ MS DOS ¦ DISK READ ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

Этот сервис DOS предоставляет прямой доступ к любому сектору диска,
доступному через DOS-BIOS или устанавливаемые драйверы устройств.
Логические секторы DOS начинаются с корневого сектора . Первый сектор в
разделе DOS - это логический сектор 0.

-==T===T==T==========T==============T==================================¬
¦26¦ - ¦--¦ сервис ¦ ABSOLUTE ¦ Прямая дисковая операция записи ¦
¦ ¦ ¦ ¦ MS DOS ¦ DISK WRITE ¦ ¦
L--+---+--+----------+--------------+-----------------------------------
См. пояснение к прерыванию 25h.
-==T===T==T==========T==============T==================================¬
¦27¦ - ¦--¦ сервис ¦TERMINATE BUT ¦ Завершиться, ¦
¦ ¦ ¦ ¦ MS DOS ¦STAY RESIDENT ¦ но остаться резидентным ¦
L--+---+--+----------+--------------+-----------------------------------

Возвращает управление DOS, оставляя часть памяти распределенной,
так что последующие программы не будут перекрывать программный код или
данные в этой памяти. INT 27h - это традиционный метод создания
резидентных программ который используется рядом простых вирусов. Наряду
с ней используется функция 31h (KEEP) см. прил.5.


-==T===T==T==========T==============T==================================¬
¦28¦ - ¦3+¦ сервис ¦ KEYBOARD ¦ Квант времени DOS ¦
¦ ¦ ¦ ¦ MS DOS ¦ BUSY LOOP ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

Это недокументированное прерывание DOS использует, когда ждет
нажатия клавиши, а также перед вызовом некоторых функций DOS с номерами
до 0ch включительно. PRINT (спулер печати MS DOS) перехватывает этот
вектор, чтобы найти квант времени для чтения файлов и вывода на принтер.
Это прерывание используется также различными резидентными программами.

-==T===T==T==========T==============T==================================¬
¦2A¦fun¦3+¦Microsoft ¦ NETWORK ¦ ¦
¦ ¦ ¦ ¦Networks ¦ ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

-==T===T==T==========T==============T==================================¬
¦2E¦ - ¦3+¦ сервис ¦ EXECUTE ¦Выполнить команду DOS ¦
¦ ¦ ¦ ¦ MS DOS ¦ COMMAND ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

Это недокументированное прерывание выполняет команду DOS, как если
бы эта команда была введена в ответ на подсказку DOS.

-==T===T==T==========T==============T==================================¬
¦2F¦fun¦3+¦ сервис ¦ PRINT ¦Мультиплексное прерывание ¦
¦ ¦ ¦ ¦ MS DOS ¦ Multiplexor ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

Этот вектор (0000:00bc) предоставляет средства управления
процессами, доступные всей системе из любой программы. Часто
используется для проверки наличия в памяти той или иной резидентной
программы. используется спулером печати (команда PRINT).

-==T===T==T==========T==============T==================================¬
¦41¦ - ¦--¦ Указатель¦ FIXED DISK ¦ Таблица параметров витнчестера ¦
¦ ¦ ¦ ¦ ¦ PARAMETERS ¦ ¦
L--+---+--+----------+--------------+-----------------------------------
Эта 16-байтовая структура находится по адресу вектора прерывания
INT 41h 4-байтовый адрес в 0:0104). Параметры для второго винчестера
(если он есть) находятся по адресу вектора INT 46h. Эти таблицы задают
некоторые важные переменные для операций с винчестера

-==T===T==T==========T==============T==================================¬
¦46¦ - ¦--¦ Указатель¦ Secondary ¦ Таблица параметров второго ¦
¦ ¦ ¦ ¦ ¦ FIXED DISK ¦ винчестера ¦
¦ ¦ ¦ ¦ ¦ PARAMETERS ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

-==T===T==T==========T==============T==================================¬
¦4A¦ - ¦--¦ ¦ User Alarm ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

-==T===T==T==========T==============T==================================¬
¦5C¦fun¦--¦ сервис ¦ NETBIOS ¦ ¦
¦ ¦ ¦ ¦ MS DOS ¦ INTERFACE ¦ ¦
L--+---+--+----------+--------------+-----------------------------------

-==T===T==T==========T==============T==================================¬
¦67¦fun¦--¦ сервис ¦ LIM EMS ¦ Функции управления расширенной ¦
¦ ¦ ¦ ¦ MS DOS ¦ INTERFACE ¦ (EMS) памятью ¦
L--+---+--+----------+--------------+-----------------------------------

-==T===T==T==========T==============T==================================¬
¦E0¦ - ¦--¦ ¦ ¦ CP/M-86 function calls ¦
L--+---+--+----------+--------------+-----------------------------------

ПРИЛОЖЕНИЕ 9

НАИБОЛЕЕ ЧАСТО ИСПОЛЬЗУЕМЫЕ ФУНКЦИИ MS DOS

В данном приложении приведены сведения о некоторых распространенных
прерываниях MS DOS. Приводимая информация полезна при трассировке
"подозрительных" программ и их дизассемблировании. Более подробные
сведения можно получить в электронном справочнике TECHHELP Д. Роллинга
(D.Rolling). При написании данного приложения использовано руководство
Microsoft MS DOS. Operating System 3.3. Programmer Reference Manual.


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

0-12 - Обмен с символьными устройствами;
12-24 - Работа с файлами с использованием FCB;
25 - Установить вектор прерываний
26 - Создать программный сегмент
27-29 - Работа с файлами с использованием FCB;
2A-2E - Обработка даты и времени:
2A - Выдать дату
2B - Установить дату
2C - Выдать время

2F-38 - Разные операции, в том числе:
30 - Выдать номер версии DOS
31 - Закончить и остаться резидентом (KEEP)
35 - Выдать значения вектора прерывания для заданной функции

39-3B - Работа с каталогами;
3C-46 - Работа с файлами с использованием логических номеров;
47 - Работа с каталогами;
48-...- Дополнительные операции.

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

Операции 2F-38 используют вместо блока FCB так называемый
"номер файла" (file handle). При создании или открытии файла или
устройства в регистре AX возвращается 16-разрядный номер файла.
Значения некоторых номеров файлов определены по умолчанию:

0000 Стандартый ввод. Может переназначаться.
0001 Стандартый вывод. Может переназначаться.
0002 Стандартый вывод сообщений.
Не может переназначаться.
0003 Стандартый коммуникационный канал.
0004 Стандартое устройство печати.

Обычно функция MS DOS вызывается путем занесения номера функции в
регистр AX (точнее в его старший байт - AH) с последующим вызовом
прерывания 21. Однако существуют и другие способы обращения к этим
операциям, например с помощью длинного вызова подпрограммы (FAR CALL).
Вирусы могут пользоваться нестандартными способами обращения к функциям
MS DOS для маскировки и затруднения дизассемблирования кода.

---------------------------------------------------------- AH=F -------
Открыть файл, используя FCB

При входе DS:DX указывает на неоткрытый блок управления файлом
(FCB). Указанное в нем имя ищется в каталоге; если оно не найдено, то в
AL возвращается FF. Если же файл найден, то в AL возвращается 00, а FCB
заполняется следующим образом: Если указан код устройства 0 (текущий
диск), он заменяется фактическим кодом диска, являеющегося в данный
момент текущим (1=A, 2=B и т.д.); поэтому переназначение текущего
диска не влияет на открытые файлы. Поле текущего блока (байты C-D)
обнуляется. Длина записи (байты E-F) устанавливается равной 80H. Длина
файл и дата заполняются на основании информации в каталоге. Если
программа работает с файлом, используя размер записи, отличный от 80H
байт, установленных по умолчанию, она должна изменить ее в FCB; она
также должна заполнить поля номера записи. Это должно быть сделано до
первого обращения к файлу.

---------------------------------------------------------- AH=10 -------
Закрыть файл, используя FCB

Эта операция заносит в каталог информацию об изменениях файла.
При входе DS:DX указывает на открытый блок управления файлом (FCB).

Указанный файл ищется в каталоге; если он не найден, то DOS
предполагает, что была сменена дискета, и в AL возвращается FF. Если
же файл найден, то в AL возвращается 00, и производится модификация
каталога.

---------------------------------------------------------- AH=11 -------
Искать первое имя по образцу, используя FCB

При входе DS:DX указывает на неоткрытый блок управления файлом
(FCB). В каталоге ищется первое имя, удовлетворяющее заданному в FCB
образцу (имя-образец может содержать символы "?" в позициях, где может
стоять любая литера). Если такое имя не найдено, то в AL возвращется FF;
иначе в AL возвращется 00, а текущий буфер DTA заполняется следующим
образом: Если заданный FCB является расширенным, то в первый байт DTA
заносится код FF, за ним следует 5 нулевых байтов, затем байт
атрибутов из заданного FCB, код устройства (1=A, 2=B и т.д.), и затем
32 байта, содержащие копию найденного элемента каталога. Таким образом,
в DTA строится неоткрытый расширенный блок управления файлом с теми же
атрибутами, что и у заданного FCB. Если же задан обычный (не
расширенный FCB), то в первый байт DTA заносится код устройства
(1=A, 2=B и т.д.), и затем 32 байта, содержащие копию найденного
элемента каталога. Таким образом, в DTA строится неоткрытый блок
управления файлом. При использовании расширенного FCB поиск производится
следующим образом:
1. Если байт атрибутов равен 0, то ищутся только имена обычных
файлов. Элементы каталога, соответствующие метке тома, подкаталогам,
скрытым и системным файлам не анализируются.
2. Если установлены атрибуты скрытого или системного файла, или
подкаталога, то они включаются в поиск. При этом выдаются как обычние
файлы так и файлы с соответствующими атрибутами. Чтобы просмотреть все
элементы каталога, кроме метки тома, следует указать в байте атрибутов
"скрытый" + "системный" + "подкаталог".
3. Если указан атрибут метки тома, то ищется только единственный
соответствующий элемент каталога. Структура байта атрибутов
приведена в Приложении 2.

---------------------------------------------------------- AH=12 -------
Искать следующее имя по образцу, используя FCB

После обращения к операции 11, обращение к операции 12 ищет
следующее удовлетворяющее заданному в FCB образцу имя. Входные и
выходные параметры те же, что и в операции 11. При этом промежуточная
информация храниться в зарезервированных полях заданного FCB; поэтому
между обращениями к операциям 12 или 11 этот FCB не должен
использоваться для других операций.

---------------------------------------------------------- AH=13 -------
Удалить файл, используя FCB

При входе DS:DX указывает на неоткрытый блок FCB. Все
соответствующие элементы каталога и именумые ими файлы уничтожаются.
(Имя в FCB может содержать символы "?" в позициях, где может стоять
любая литера). Если таких элементов нет, в регистре AL возвращается FF,
иначе 00.

---------------------------------------------------------- AH=14 -------
Последовательное чтение, используя FCB

При входе DS:DX указывает на открытый блок FCB. Запись,
указываемая номером текущего блока (байты C-D) и номером текущей записи
(байт 1F) пересылается в буфер DTA; номер записи увеличивается на 1.
Длина записи определяется из поля длины записи. Если обнаружен конец
файла, в регистре AL возвращается 01 или 03. Код 01 указывает, что в
буфер не переслано данных, код 03 соответствует ситуации, когда в файле
остались данные, но меньше, чем длина записи; в последнем случае запись
в буфере DTA дополняется нулевыми байтами. Код 02 означает, что
системный буфер слишком мал для обработки записи и запись переслана не
полностью. Код 00 свидетельствует о нормальном завершении операции.

---------------------------------------------------------- AH=15 -------
Последовательная запись, используя FCB

При входе DS:DX указывает на открытый блок FCB. Запись из буфера
DTA длиной, указанной в поле длины записи, записывается в файл в
позицию, указываемую номером текущего блока и номером текущей записи;
(при длине записи, меньшей длины сектора, происходит буферизация). Номер
записи увеличивается на 1. В регистре AL возвращается код завершения: 01
диск полон; 02 - системный буфер слишком мал для обработки записи и
запись переслана не полностью. Код 00 свидетельствует о нормальном
завершении операции.


---------------------------------------------------------- AH=16 -------
Создать файл, используя FCB

При входе DS:DX указывает на неоткрытый блок FCB. Указанное в нем
имя ищется в каталоге; если оно найдено, то соответствующий элемент
каталога используется для нового файла, иначе ищется пустой элемент;
если такового нет, в регистре AL возвращается FF. Иначе элемент каталога
инициализируется, устанавливается нулевая длина файла, файл открывается
и в регистре AL возвращается 00. Используя расширенный FCB с
соответствующими атрибутами, можно пометить создаваемый файл как
скрытый.

---------------------------------------------------------- AH=17 -------
Переименовать файл, используя FCB

При входе DS:DX указывает на блок управления файлом (FCB),
содержащий второе имя непосредственно после первого, т.е. по адресу
DS:DX + 11H (обычно эта часть FCB зарезервирована). Все имена,
соответствующие имени-образцу, изменеются в соответствии со вторым
именем. При этом литеры имени файла в тех позициях, где в имени-образце
стоит "?" не изменяются. При переименовании проверяется, чтобы в
каталоге не появилось два одинаковых имени. Если операция завершается
успешно, AL содержит 00, иначе (если имя не найдено или переименование
привело бы к дублированию имени) в AL возвращается 00.

---------------------------------------------------------- AH=19 -------
Текущий диск

В регистре AL возвращается код устройства, являющегося текущим
диском (0=A, 1=B и т.д.).

---------------------------------------------------------- AH=1A -------
Задать адрес DTA

Область памяти, на которую указывает DS:DX, становится текущим
буфером DTA. При операциях обмена DOS не допускает перехода через
границу сегмента.

---------------------------------------------------------- AH=21 -------
Чтение с прямым доступом, используя FCB

При входе DS:DX указывает на открытый блок FCB. Значения полей
номера блока и номера записи устанавливаются в соответствии со значением
поля номера записи для прямого доступа; соответствующая запись
пересылается в буфер DTA. Если обнаружен конец файла, в регистре AL
возвращается 01 или 03. Код 01 указывает, что в буфер не переслано
данных, код 03 соответствует ситуации, когда в файле остались данные, но
меньше, чем длина записи; в последнем случае запись в буфере DTA
дополняется нулевыми байтами. Код 02 означает, что системный буфер
слишком мал для обработки записи и запись переслана не полностью. Код 00
свидетельствует о нормальном завершении операции.

---------------------------------------------------------- AH=22 -------
Запись с прямым доступом, используя FCB

При входе DS:DX указывает на открытый блок FCB. Значения полей
номера блока и номера записи устанавливаются в соответствии со значением
поля номера записи для прямого доступа. Запись из буфера DTA длиной,
указанной в поле длины записи, записывается в файл в соответствующию
этим полям позицию. (при длине записи, меньшей длины сектора, происходит
буферизация). Номер записи увеличивается на 1. В регистре AL
возвращается код завершения: 01 диск полон; 02 - системный буфер слишком
мал для обработки записи и запись переслана не полностью. Код 00
свидетельствует о нормальном завершении операции.

---------------------------------------------------------- AH=23 -------
Определить длину файла, используя FCB

При входе DS:DX указывает на неоткрытый блок FCB. Указанное в нем
имя ищется в каталоге; если оно не найдено, то в AL возвращается FF.
Если же файл найден, то в AL возвращается 00, а в FCB в поле номера
записи для прямого доступа заносится число записей в файле. Перед
обращением к этой операции, в FCB следует занести необходимую длину
записи; иначе будет получен неверный результат.


---------------------------------------------------------- AH=24 -------
Задать поле номера записи для прямого доступа, используя FCB

При входе DS:DX указывает на открытый блок FCB. Эта операция
заносит в поле номера записи для прямого доступа значение,
соответстующее номеру текущего блока и номеру текущей записи.

---------------------------------------------------------- AH=25 -------
Установить вектор прерываний

В таблицу векторов прерываний для прерывания с номером, указанным
в AL, заносится 4-х байтный адрес, содержащийся в DS:DX. Содержимое
вектора прерываний может быть получено операцией 35.

---------------------------------------------------------- AH=26 -------
Создать программный сегмент

При входе DX содержит сегментый адрес, где создается новый
программный сегмент. При этом текущий PSP (100H байт, начиная с нулевого
байта текущего программного сегмента), копируется в новый программный
сегмент. В новом PSP изменяется поле размера памяти,

Список страниц

Закладка в соц.сетях

Купить

☏ Заказ рекламы: +380504468872

© Ассоциация электронных библиотек Украины

☝ Все материалы сайта (включая статьи, изображения, рекламные объявления и пр.) предназначены только для предварительного ознакомления. Все права на публикации, представленные на сайте принадлежат их законным владельцам. Просим Вас не сохранять копии информации.