Сейчас на форуме: vsv1, NIKOLA, r0lka, johnniewalker (+4 невидимых)

 [email protected] —› Крэки, обсуждения —› Взлом Alawar игр (отучим от триала)
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 .
Посл.ответ Сообщение

Ранг: 330.4 (мудрец), 334thx
Активность: 0.160.17
Статус: Участник
ILSpector Team

Создано: 28 сентября 2006 04:20
· Личное сообщение · #1

Уж извините за форму написания ведь он почти первый (че-то я в последнее время расщедрился)

Мини тутор по снятию триал-защиты с игр от Alawar`a

Инструмент: Shadow with bpmx да голова
Кролик : Игра "Разгадай код Да Винчи"

Как обычно приобрел очередной ComputerBild и на диске прилагаемом к нему нашлась игруха от алавара
"Разгадай Код Да Винчи". На все про все наиграться мне отвели 30 минут а игруха класная новый вариант
Lines.Поскольку я никогда не смотрю что мне нужно оттдать за то чтобы вдоволь насладится очередным
программным продуктом пришлось на время отложить работу и взятся за сей продукт.
При первом рассмотрении PEid нашел Aspr.Периодически лазить в реестр и что нибудь там чистить это не по мне.
Не долго думая обработал поделку stripper`ом.Получилось.Причем stripper сказал что триал инфы
не используются. Уже интересно ДА.
Однако продукт после распаковки запускаться не захотел и улетал в несуществующие адреса.
Как же так несправедливо получается уже потрачено 5 минут драгоценного времени впустую 8-( не отступать
рано продолжим. Загрузил дамп в shadow и своим трейсером дошел до места где вызываются не существующие адреса.
Выглядело это место примерно так call dword [4383a8] где по этому адресу лежало 00401440 естественно указывающее
вникуда. Беда но зачем же отступать. Я рассудил так раз такой call есть значит что-то не до конца обработало
дамп не доведя до ума т.е. при распаковке процедуры приведения проги до нормального вида не включались
а сидели в апи аспра т.е. где то же они есть.Поиском всех референсов на адрес 004383а8 нашлась интересное
место:

1 PUSH da_vinci.0040E36D ; /Arg5 = 0040E36D
2 PUSH DWORD PTR DS:[428F44] ; |Arg4 = 00000000
3 PUSH da_vinci.0042839C ; |Arg3 = 0042839C
4 PUSH da_vinci.004210DC ; |Arg2 = 004210DC ASCII "GetLocaleInfoW"
5 PUSH da_vinci.00420F50 ; |Arg1 = 00420F50 ASCII "kernel32.dll"
6 CALL da_vinci.0040E02F ; \da_vinci.0040E02F
7 JMP DWORD PTR DS:[42839C] ; da_vinci.0040D9F0
8 PUSH da_vinci.0040E24E ; /Arg5 = 0040E24E
9 PUSH DWORD PTR DS:[428F40] ; |Arg4 = 00000000
10 PUSH da_vinci.004283A8<---вот он адресок ; |Arg3 = 004283A8
11 PUSH da_vinci.004210EC а это то что должно быть --> ; |Arg2 = 004210EC ASCII "GetProcAddress"
12 PUSH da_vinci.00420F50 ; |Arg1 = 00420F50 ASCII "kernel32.dll"
13 CALL da_vinci.0040E02F ; \da_vinci.0040E02F
14 JMP DWORD PTR DS:[4283A8]
15 PUSH da_vinci.0040E2AA ; /Arg5 = 0040E2AA
16 PUSH DWORD PTR DS:[428F3C] ; |Arg4 = 00000000
17 PUSH da_vinci.004283B8 ; |Arg3 = 004283B8
18 PUSH da_vinci.004210FC ; |Arg2 = 004210FC ASCII "LoadLibraryW"
19 PUSH da_vinci.00420F50 ; |Arg1 = 00420F50 ASCII "kernel32.dll"
20 CALL da_vinci.0040E02F ; \da_vinci.0040E02F
21 JMP DWORD PTR DS:[4283B8] ; da_vinci.0040DA3A

Осмыслив данный кусок кода начинаю понимать что это то что надо однако ни одного референса на 1 строку
решаю рискнуть выставляю оер на строку 8 и жму F8 до 14 строки и о радость по адресу 4383a8 цифирки
меняются на почти (внимательно) валидные адреса.


1 PUSH da_vinci.0040E36D ; /Arg5 = 0040E36D
2 PUSH DWORD PTR DS:[428F44] ; |Arg4 = 00000000
3 PUSH da_vinci.0042839C ; |Arg3 = 0042839C
4 PUSH da_vinci.004210DC ; |Arg2 = 004210DC ASCII "GetLocaleInfoW"
5 PUSH da_vinci.00420F50 ; |Arg1 = 00420F50 ASCII "kernel32.dll"
6 CALL da_vinci.0040E02F ; \da_vinci.0040E02F
7 JMP DWORD PTR DS:[42839C] ; unicows.GetLocaleInfoW
8 PUSH da_vinci.0040E24E ; /Arg5 = 0040E24E
9 PUSH DWORD PTR DS:[428F40] ; |Arg4 = 00000000
10 PUSH da_vinci.004283A8 ; |Arg3 = 004283A8
11 PUSH da_vinci.004210EC ; |Arg2 = 004210EC ASCII "GetProcAddress"
12 PUSH da_vinci.00420F50 ; |Arg1 = 00420F50 ASCII "kernel32.dll"
13 CALL da_vinci.0040E02F ; \da_vinci.0040E02F
14 JMP DWORD PTR DS:[4283A8] <-видите куда теперь он указывает ; unicows.GetProcAddress

И так если использовать данную процедуру (их кстати 2 не небольшом расстоянии друг от друга
и дальше (естественно пропуская jmp`ы) можно полностью раскодировать импорт, он там небольшой
около 20 имен функций.Но вот зараза если внимательно приглядеться то можно заметить что GetProcAddress
находится не во всеми любимом kernel32.dll а в какои то херне под названием unicows.dll (Кстати
это микрософтовская библиотека я так не хера и не понял зачем она нужна.Плюс с ней программа не пожелала
запускаться. Чтож отступать поздно потрачено уже около 25 минут.Думаю дальше. Далее найдется
до фига желающих меня обласкать за то что я пошел обходным путем однако ничего не попишешь в тот
момент ко мне пришла такая идея. Я взял да подставил в эту микротаблицу импорта правильные адреса
всех фунции т.е. теперь по адресу 4283a8 лежал указатель не на unicows.GetProcAddress а на
kernel32.GetProcAddress.
Все прекрасно прога запустилась но функции триала остались. Думаю дальше ведь времени уже потрачено
около 40 минут.
Анализ данного импорта показал что wrapper юзает функции в том числе CreateFile и CreateProcess,
WriteProcessMemory т.е. по сути wrapper создает отдельный файл и потом его контролирует.
Что ж ставим бряки на эти функции и отпускаем прогу нажимаем в ней продолжать играть и вываливаемся
на создании файла game32.img.(нужно только поменять атрибуты для файла на Normal) Все вроде бы готово.
Уф.Глушим прогу Переименовываем его в game32.exe и пытаемся запустить и...... ОБЛОМ. Прога не
запускается. Думаю дальше. Посмотрим на oep (game32.exe) и видим что не все так просто просто там ничего
нет. Загружаем в олю родителя оставляем бряки на старом месте.СТАРТ. Проходим как описано выше до создания
дочки (game32....) жмем еще раз f9 и вываливаемся на бряке WriteProcessMemory первый пропускаем он просто
записывает дочку а вот когда прогавалится еще раз смотрим что же она пишет и о боги видим что в наш
game32... на место оер записывается 6 байт посмотрев в буфер запоминаем их а затем подправляем наш
game32.exe. все игра заработала..Облегчение.....

P.S. Я не знаю сколько продержится эта защита после опубликования данного минитутора пользуйтесь пока.



Ранг: 7.1 (гость), 6thx
Активность: 0.040.01
Статус: Участник

Создано: 23 мая 2019 19:22
· Личное сообщение · #2

ID21l5X пишет:
lx60 пишет:
http://sendfile.su/1442005

а можно еще раз ссылочку на кейген или может кто делал кейген для зашифрованных ключей?


перезалил



Ранг: 1.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 23 мая 2019 20:38
· Личное сообщение · #3

lx60 пишет:
перезали

а ссылочку не скинешь?




Ранг: 55.9 (постоянный), 29thx
Активность: 0.120.22
Статус: Участник

Создано: 23 мая 2019 22:14 · Поправил: Adler
· Личное сообщение · #4

ID21l5X, дык, там же ссылка
lx60 пишет:
http://sendfile.su/1495976




Ранг: 1.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 24 мая 2019 00:12 · Поправил: ID21l5X
· Личное сообщение · #5

Adler пишет:
дык, там же ссылка

да все вижу создает wrapper_config.txt(ключ) и 2322_key.reg(нужный файл)

Добавлено спустя 25 минут
lx60 пишет:
либо расшифровать .exe


работает но с одним но. Возьмем для примера игру Cat on diet
Известный работающий ключ:

Code:
  1. T2f76Ksi+uEtSAgx=
- взял только низ ключа

И вот тот ключ что выдается у нас в результате манипуляций с твоим wrapper.dll

Code:
  1. T2f76Ksi+uEtSAgw=
- тоже взял только низ ключа

отличие в последнем символе "x=" и "w="

Окей возьмем для примера игру Next Stop 3
она самая новая ключа на нее пока нет.

вот что мне выдало в результате махинаций wrapper.dll
Code:
  1. p8sD8h4sXD52Ram6IUCLYM=


данный ключик не есть верный. Но исходя из варианта выше.
проанализировав буквы Hex-кодах.

x= и w= - это 78 и 77 в Hex, где символ x= есть правильный
следовательно M= (4D) сдвигаем на один байт получаем N= (4E) верный ключ.

т.е. нужно добавить для символа перед =, сдвиг на 1 байт в плюс.
Если несложно доработай там.

add eax,1 // это вроде надо добавить к символу перед равно



Ранг: 7.1 (гость), 6thx
Активность: 0.040.01
Статус: Участник

Создано: 24 мая 2019 10:06
· Личное сообщение · #6

Я не слежу за новыми играми
Возможно, разработчики что-то изменили в защите



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 24 мая 2019 12:19
· Личное сообщение · #7

Зачем эти ключегенераторы, которые работают через раз, когда проще анврапнуть оригинальный exe? Ради интереса скачал последнюю игру Farm Life. Если раньше враппер под АСпром сам выполнял WriteProcessMemory, то сейчас они вывели эту логику в отдельную wrapper.dll, которая ничем не накрыта. В итоге восстановил 64 байта в Farm Life.wrp.exe и радуешься жизни

| Сообщение посчитали полезным: BlackCode, -=AkaBOSS=-


Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 24 мая 2019 12:34
· Личное сообщение · #8

ID21l5X пишет:
проанализировав буквы Hex-кодах

Это кодировка base64 если что, очень узнаваемая. Сравнивать лучше то, что под ней.
TryAga1n пишет:
Зачем эти ключегенераторы

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

-----
2 оттенка серого


| Сообщение посчитали полезным: TryAga1n

Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 24 мая 2019 13:20
· Личное сообщение · #9

f13nd пишет:
Вряд ли где-то выкладывают кряк прямо под каждую игру, выпущенную алаваром

Поверьте, выкладывают)



Ранг: 7.1 (гость), 6thx
Активность: 0.040.01
Статус: Участник

Создано: 24 мая 2019 18:55 · Поправил: lx60
· Личное сообщение · #10

ID21l5X пишет:
Окей возьмем для примера игру Next Stop 3

не поленился, скачал с alawar.ru, игра называется "Следующая остановка 3"
получился следующий ключ:
https://pastebin.com/RcQgTkPE

откуда у тебя взялось p8sD8h4sXD52Ram6IUCLYM= в конце ключа, не знаю

у меня всё работает

.. то же самое с игрой "Кот на диете"

вероятно, качаешь англ. версии?
********

Есть ещё одно решение))
http://sendfile.su/1496166

Делает зарегистрированной любую игру алавара. Надо просто кинуть в папку с игрой, и больше нет нужды в ключах)



Ранг: 1.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 25 мая 2019 01:03 · Поправил: ID21l5X
· Личное сообщение · #11

lx60 пишет:
вероятно, качаешь англ. версии?

именно англ. версия скачана была

качну русскоязычную для теста.

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

lx60 пишет:
Есть ещё одно решение))
http://sendfile.su/1496166

Делает зарегистрированной любую игру алавара. Надо просто кинуть в папку с игрой, и больше нет нужды в ключах)


это типа wrapper.dll закинь и все игры зарегены?

А вот с игрой Farm Life ключ как обычно скопировать не получилось.
пришлось сначала заменить последний символ перед равно и потом добавить данные в реестр.



Ранг: 7.1 (гость), 6thx
Активность: 0.040.01
Статус: Участник

Создано: 25 мая 2019 16:01 · Поправил: lx60
· Личное сообщение · #12

ID21l5X ключи от рус. версий не подходят к англ. версиям, а наоборот - подходят. вроде бы.

ID21l5X пишет:
это типа wrapper.dll закинь и все игры зарегены?

там файлик в архиве, его кидаешь в папку с игрой (где .exe и wrapper.dll находятся) и запускаешь, всё зарегано. не проверял на англ. версиях




Ранг: 55.9 (постоянный), 29thx
Активность: 0.120.22
Статус: Участник

Создано: 27 мая 2019 01:35 · Поправил: Adler
· Личное сообщение · #13

ID21l5X, f13nd пишет:
Это кодировка base64 если что, очень узнаваемая. Сравнивать лучше то, что под ней.

Не разбирался в алгоритме base64, но в случае с uEtSAgw= и uEtSAgх= в итоге возвращается одинаковая последовательность байт - B8 4B 52 02 0C
Так же и в случае 6IUCLYM= и 6IUCLYN= возвращается E8 85 02 2D 83.
При том в последнем случае если вместо M или N подставить O или P, то итоговый результат не изменится. При K и L последний байт будет 82, а при R, S соответственно 84.
В предыдущем варианте такая же ситуация с "соседними" буквами.




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 27 мая 2019 02:34
· Личное сообщение · #14

Adler пишет:
Так же и в случае 6IUCLYM= и 6IUCLYN= возвращается E8 85 02 2D 83

base64 это когда двоичные данные на входе разбиваются на поля по 6 бит и вместо них по таблице подставляется один из 64 печатных символов (задумка неплохая, но со слешем в таблице изобретатели промахнулись, для get-запросов http его приходится менять на другой). Таким образом из 3 байт на входе получается 4 байта на выходе.

M и N это смещения 0C и 0D в таблице, то есть 001100 и 001101:
aaaaaa bbbbbb cccccc dddddd
aaaaaabb bbbbcccc ccdddddd
'M', взятый из ключа может быть 3м символом cccccccc, а выдуманный 'N' не может (в нем есть младшая единица, она не может относиться к выравниванию). По идее количество символов должно быть кратно 4, но на деле раскодируется до первого не находящегося в таблице символа или до конца строки (допиши произвольное количество '=' в конец и убедись). Так что не надо брать 4/8/12... символов с конца строки включая '=' и считать их реальными позициями 1,2,3 и 4 в кодировании, отсчет всегда от начала строки.

-----
2 оттенка серого





Ранг: 55.9 (постоянный), 29thx
Активность: 0.120.22
Статус: Участник

Создано: 27 мая 2019 10:16 · Поправил: Adler
· Личное сообщение · #15

f13nd пишет:
Так что не надо брать 4/8/12... символов с конца строки включая '=' и считать их реальными позициями 1,2,3 и 4 в кодировании, отсчет всегда от начала строки.
Тогда понятно. В случае с полным ключом https://pastebin.com/RcQgTkPE замена предпоследнего знака (6->7) приводит к замене последнего байта - 7A -> 7B - тыц



Ранг: 7.1 (гость), 6thx
Активность: 0.040.01
Статус: Участник

Создано: 28 мая 2019 14:35 · Поправил: lx60
· Личное сообщение · #16

С чего вы вообще решили, что это base-64 ?

Ключ получается такой, какой и должен быть. Не нужно мутить с последними символами. Этот ключ предназначен для записи в реестр.

ID21l5X пишет:
по итогу выдало мне тот же ключ что у тебя. но мне написали ключик неверный.

не нужно ключ никуда вводить, см. выше

В аспровом (который в виде base-64) ключе зашито имя покупателя, при попытке зарегать ключом игру имя сравнивается с "SMS", если совпадает (в данном случае), то напишет, что неверный ключ.
Данный ключ пишется в реестр, когда вводите короткий смс-ключ. Надеюсь, понятно объяснил




Ранг: 55.9 (постоянный), 29thx
Активность: 0.120.22
Статус: Участник

Создано: 28 мая 2019 14:38 · Поправил: Adler
· Личное сообщение · #17

lx60 пишет:
С чего вы вообще решили, что это base-64 ?

Потому что это он скорее всего и есть. Это видно не вооруженным взглядом. А как и для чего он применяется уже другой вопрос.

Добавлено спустя 13 минут
lx60 пишет:
Данный ключ пишется в реестр, когда вводите короткий смс-ключ. Надеюсь, понятно объяснил
Ну все логично. Не знаю как там на самом деле (вообще не разбирался как и что в этих игрушках), но первое что в голову приходит, что этот ключ - результат какого то шифрования, например Blowfish, где конечный результат часто заворачивается в base64 для удобной передачи (например, сохранить в реестре)..
А при чтении его из реестра он скорее всего дешифруется и как то проверяется.




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 28 мая 2019 16:45 · Поправил: -=AkaBOSS=-
· Личное сообщение · #18

TryAga1n пишет:
Зачем эти ключегенераторы, которые работают через раз, когда проще анврапнуть оригинальный exe?

В целом согласен - так проще. Поначалу, помнится, они всего 1-2 байта на 0хС3 заменяли, вообще детская защита была. Но в некоторых случаях встречается западло в виде встроенных в саму игру проверок на наличие враппера. Проходишь два-три уровня и го дальше реверсить)



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 29 мая 2019 06:47
· Личное сообщение · #19

-=AkaBOSS=- пишет:
Но в некоторых случаях встречается западло в виде встроенных в саму игру проверок на наличие враппера.

Никогда такие не встречал. Может вспомнишь название? Хотелось бы посмотреть, ради интереса



Ранг: 7.1 (гость), 6thx
Активность: 0.040.01
Статус: Участник

Создано: 29 мая 2019 09:31 · Поправил: lx60
· Личное сообщение · #20

TryAga1n одну такую помню, Папины дочки, кажется
там какие-то проверки в скриптах были, то ли ключа, то ли ещё чего намучено
вроде алавар там был



Ранг: 0.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 мая 2019 13:11 · Поправил: artyavmu
· Личное сообщение · #21

lx60
Сейчас скачал Папины дочки.Отцепится от враппера заняло пять минут при помощи petools 2006 и odbg110 и так с любыми играми.Проблем не находил вообще.



Ранг: 7.1 (гость), 6thx
Активность: 0.040.01
Статус: Участник

Создано: 30 мая 2019 09:32 · Поправил: lx60
· Личное сообщение · #22

artyavmuзначит точно проблема в проверке смс-ключа была, без отвязки от враппера
кто делал кейген, тот знает, в чём прикол




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 31 мая 2019 07:58
· Личное сообщение · #23

TryAga1n пишет:
Может вспомнишь название? Хотелось бы посмотреть, ради интереса

Название "Правитель. Колосс", например.
Но я специально проверил - та версия, что сейчас на офсайте - уже фришная.
Оказалось неожиданно сложно найти оригинальный некрякнутый триальный дистрибутив, но мне это удалось - --> Link <--

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


sub_40AA00 показывает матерный мессаджбокс
референсы с адресов 40AB65 и 40ABF5
условия вызова - false из функций 401190 и 402070
функция 401190 просто проверяет дворд 591064 на ненулёвость. Это результат работы отдельного потока с таймером на рандомной задержке. Создаётся в 4021A0, обработчик 4020A0. Внутри опять-таки проверка через функцию 402070

Итак, основная проверка в функции 402070. Последовательно вызываются:
401BC0 !!CreateFile (ssfCOMMONAPPDATA + "\AlawarWrapper\temp\wrapper.log")
401E30 имяТекущегоПроцесса == имяРодительскогоПроцесса [:-4] + ".wrp.exe"
401FC0 !!FindResource (LoadLibrary (GetModuleFileName [:-8] + ".exe"), "ZZZ_X9__________________________", RT_HTML)
401970 проверяет наличие в родительском процессе wrapper.dll и htmlayout.dll

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

| Сообщение посчитали полезным: TryAga1n, artyavmu

Ранг: 1.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 16 июня 2019 12:10
· Личное сообщение · #24

-=AkaBOSS=- пишет:
Вот такая вот дополнительная защита.


они обновили недавно защиту. Ключик уже не делается как там выше вытаскивали.
Ну конечно как обычно взломать можно и сейчас.



Ранг: 0.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 июня 2019 09:27 · Поправил: artyavmu
· Личное сообщение · #25

ID21l5X пишет=Ключик уже не делается как там выше вытаскивали
С какого перепугу не делается? Последняя английская The Myth Seekers: The Legacy Of Vulcan. Collector's Edition, а это ключ:

0ujj5B6ZLlskCMM/NORei6tPzO
KyVf48W77doX5EojT6FsAK2L+n
GKcU8gsLKzXBjHkIZvUjYhM2y/
fTgYvBGl1P/AJyjPpwKZ6MSm1V
ppTfKLyFMVuvjPqNHWMGqjAovq
f7T9BmZW1NIXKRS177KJyAjn1z
bkKaPFrSg1hqCHqB=



Ранг: 0.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 июля 2019 00:11
· Личное сообщение · #26

Это хорошая идея, начинать учить реверс с защиты алавара?




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 12 июля 2019 01:54 · Поправил: plutos
· Личное сообщение · #27

andreykacat пишет:
Это хорошая идея, начинать учить реверс с защиты алавара?


Если начинаешь совсем с "нуля", то лучше взять туториал Нарвахи по --> OllyDbg<--, либо что-нибудь подобноe в разделе Карта сайта [email protected] для --> новичка<--

но все зависит, конечно, от конечных целей и уровня знаний в данный момент.

-----
Give me a HANDLE and I will move the Earth.



<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 .
 [email protected] —› Крэки, обсуждения —› Взлом Alawar игр (отучим от триала)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати