Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Протекторы —› Анализ ASProtect
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 . 17 . 18 . 19 ... 38 . 39 . >>
Посл.ответ Сообщение

Ранг: 329.6 (мудрец), 192thx
Активность: 0.140.01
Статус: Участник

Создано: 28 марта 2008 15:30 · Поправил: vnekrilov
· Личное сообщение · #1

Я выложил свой первый туториал по анализу ASProtect v2.4 build 12.20 (Анализ подпрограммы эмуляции инструкций.rar http://dump.ru/files/o/o489862518/ ). В этом туториале я подробно описал процесс восстановления эмулированных инструкций типа:
Code:
  1. PUSH 0
  2. PUSH 0CC5850
  3. PUSH 0DB180C
  4. CALL 00CEB814


Полный цикл статей по распаковке ASProtect (Актуальная версия 25 декабря 2009):
ASProtect_Unpacking_Tutorial_2009-12-25.rar http://rapidshare.com/files/325720799/ASProtect_Unpacking_Tutorial_2009-12-25.rar 7,9 МБ
Программы, рассматриваемые в статьях:
ASProtect_Unpacking_Apps_2009-12-25.rar http://rapidshare.com/files/325718084/ASProtect_Unpacking_Apps_2009-12-25.rar 22,2 МБ

Буду благодарен за критику, замечания, пожелания и отзывы.

Скрипты:
Текущая рекомендуемая версия ODBGScript [1.78.3]:
ecf1_03.06.2010_CRACKLAB.rU.tgz - ODbgScript.dll

Последний текущий комплект скриптов [от 19 февраля 2011]:
69ca_18.02.2011_CRACKLAB.rU.tgz - Скрипты для распаковки Asprotect от 19 февраля 2011.rar

Статьи по частям:
Актуальная версия статей [Последняя - 25.11.2010]:
Выпуск 2
0754_29.11.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 1
2844_29.11.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 2
8e06_30.11.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 3
50a0_03.12.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 4
1b51_05.12.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 5
0ff8_05.12.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 5 (продолжение)
a182_06.12.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 6
82b8_15.12.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 7
74e4_16.12.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 8
b2e1_17.12.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 9
532c_18.12.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 10
76af_20.12.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 11
fe67_22.12.2009_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 12
079c_20.01.2010_CRACKLAB.rU.tgz - Распаковка ASProtect - Часть 13
8415_03.06.2010_CRACKLAB.rU.tgz - Распаковка Asprotect - Часть 14
0a66_18.02.2011_CRACKLAB.rU.tgz - Распаковка Asprotect - Части 15 и 16

DriEm конвертировал мой цикл статей в формате PDF, который можно скачать по ссылке --> Link <--



Ранг: 153.9 (ветеран)
Активность: 0.120
Статус: Участник
reborn

Создано: 07 марта 2009 12:38
· Личное сообщение · #2

d0wn пишет:
может опять версия не 1.48 у ODbgScript ?
Автор её настоятельно рекомендует для своих скриптов.


http://img6.imageshack.us/my.php?image=24742745.jpg

-----
~ the Power Of Reversing team ~




Ранг: 123.0 (ветеран), 10thx
Активность: 0.060
Статус: Участник

Создано: 07 марта 2009 12:48 · Поправил: Ultras
· Личное сообщение · #3

У меня небольшое замечание по скрипту с эмуляцией API. Исходя из логики скрипта если попадаем на строчку msg "Эта API Asprotect не эмулируется", то следом осуществляется переход на эмуляцию GetRegistrationInformation. Таким образом бывает что GetRegistrationInformation эмулируется более одного раза, что не есть правильно. Мне кажется что нужно поправить скрипт, чтобы осуществлялся вывод сообщения о том что эмуляция данной апи (а это может быть SetUserKey или InstallActivationKey) не поддерживается и данная апи бы пропускалась от эмуляции.
Код приблизительно должен выглядеть так:
Code:
  1. msg "Эта API Asprotect не эмулируется"
  2. jmp D_SkipAPIEmulation
  3. .....
  4. D_SkipAPIEmulation:
  5. call SkipAPIEmulation
  6. jmp emulate_0Dh
  7. .....
  8. SkipAPIEmulation:
  9. log temp_7,"Адрес вызова API Asprotect из таблицы IAT - "
  10. log Emulate_APIs_Asprotect,"Unknown API - "
  11. add Loc_APIs_Asprotect_IAT,4
  12. ret

Жду комментарий автора.
Пытался оставить только эмуляцию HardwareID в скрипте, но почему-то в программе все-равно прежний HardwareID (запускаю со скриптом, а потом отпускаю по Run)

P.S. Что касается последних скриптов, то один работает на 1.48(который сбрасывает IAT в файл), второй на 1.66.3(который использует IAT из файла). По крайней мере у меня отрабатывают так.

-----
.[ rE! p0w4 ].




Ранг: 329.6 (мудрец), 192thx
Активность: 0.140.01
Статус: Участник

Создано: 07 марта 2009 14:06
· Личное сообщение · #4

d0wn пишет:
может опять версия не 1.48 у ODbgScript ?


Получается странная вещь! У меня, и судя по отзывам других читателей данного топика, ODbgScript v1.48 нормально работает. Почему этот плагин неработает у newborn, для меня остается загадкой.

Ultras пишет:
Жду комментарий автора.


Ты абсолютно прав. Когда я писал скрипт, то думал, что разработчики придумают еще какую-то API Asprotect, которая не будет вкладываться в уже имеющуюся раскладку. Поэтому и вбил эту строку в скрипт. Ее или нужно убрать из скрипта, или добавить в трех местах, после строки msg "Эта API Asprotect не эмулируется" следующие записи:

jmp emulate_0Bh
jmp emulate_0Ch
jmp emulate_0Ch

Спасибо за уточнение.

Ultras пишет:
Пытался оставить только эмуляцию HardwareID в скрипте, но почему-то в программе все-равно прежний HardwareID


Если ты запускаешь упакованную программу по F9, то имеется еще одно место, где читаются данные HWiD из Asprotect.dll, и они показываются в окне протектора. Если же использовать дамп распакованной программы, то в этом дампе нет Asprotect.dll, и будет показан эмулированный HWiD.



Ранг: 123.0 (ветеран), 10thx
Активность: 0.060
Статус: Участник

Создано: 07 марта 2009 14:31 · Поправил: Ultras
· Личное сообщение · #5

vnekrilov пишет:
Если ты запускаешь упакованную программу по F9, то имеется еще одно место, где читаются данные HWiD из Asprotect.dll, и они показываются в окне протектора. Если же использовать дамп распакованной программы, то в этом дампе нет Asprotect.dll, и будет показан эмулированный HWiD.


Получается что вызов АПИ из приложения идет так: CALL_ASPR_GetHardwareID(обфусцированная) -> GetHardwareID, в то же время сам аспротект в своей DLL вызывает GetHardwareID напрямую. И получается что инъекция, сделанная в CALL_ASPR_GetHardwareID не срабатывает в тех случаях, когда вызовы GetHardwareID идут напрямую, так?

-----
.[ rE! p0w4 ].




Ранг: 153.9 (ветеран)
Активность: 0.120
Статус: Участник
reborn

Создано: 07 марта 2009 16:33
· Личное сообщение · #6

vnekrilov пишет:
Получается странная вещь! У меня, и судя по отзывам других читателей данного топика, ODbgScript v1.48 нормально работает. Почему этот плагин неработает у newborn, для меня остается загадкой.

Прикрепи пожалуйста свой ODbgScript к посту или выложи куданить, проверить...

-----
~ the Power Of Reversing team ~




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 07 марта 2009 16:42
· Личное сообщение · #7

newborn
уже выкладывали в этой теме - http://exelab.ru/f/action=vthread&topic=11596&forum=1&page =8#28




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 07 марта 2009 16:43
· Личное сообщение · #8

newborn, посмотри сюда, он уже вылаживал

-----
Лучше быть одиноким, но свободным © $me




Ранг: 153.9 (ветеран)
Активность: 0.120
Статус: Участник
reborn

Создано: 07 марта 2009 17:40
· Личное сообщение · #9

Спасибо, скачал от туда, файлы идентичные, байт в байт, и снова ошибка, пробовал на разных версиях аспра, в том же месте ошибка...

-----
~ the Power Of Reversing team ~




Ранг: 329.6 (мудрец), 192thx
Активность: 0.140.01
Статус: Участник

Создано: 07 марта 2009 17:52
· Личное сообщение · #10

Ultras пишет:
Получается что вызов АПИ из приложения идет так: CALL_ASPR_GetHardwareID(обфусцированная) -> GetHardwareID, в то же время сам аспротект в своей DLL вызывает GetHardwareID напрямую.


Что-то я совсем запутался, и не понял вопроса. Давай вернемся к предыдущему вопросу. Загружаем программу в отладчик, запускаем скрипт "Эмуляция API Asprotect.osc", и после завершения его работы, запускаем программу по F9. Появляется окно программы. Проходим в меню Help --> Activation, и появляется окно Asprotect Registration, в котором записан HWiD, заложенный в моем скрипте (F1DE7D93-767A). Однако, при регистрации программы, когда вводится регистрационный код, проверка кода и его обработка производится в Asprotect.dll, которая вызывает API DeviceIoControl, считывает серийный номер жесткого диска, и по специальной программе обрабатывает его, и получается HWiD конкретной машины. Поэтому, инъекция, сделанная в CALL_ASPR_GetHardwareID из главного кода программы, не влияет на обработку серийного номера в Asprotect.dll. Я правильно понял вопрос?



Ранг: 329.6 (мудрец), 192thx
Активность: 0.140.01
Статус: Участник

Создано: 07 марта 2009 17:58
· Личное сообщение · #11

newborn пишет:
Спасибо, скачал от туда, файлы идентичные, байт в байт, и снова ошибка, пробовал на разных версиях аспра, в том же месте ошибка...


Я на своей машине не могу получить эту ошибку, поскольку у меня плагин нормально отрабатываем все команды. Попробуй запустить плагин под отладчиком, и протрассировать отработку всех команд. Ведь где-то зарыта собака? Или может быть кто-то поможет из тех читателей, которые, как я где-то встречал, искали причину ошибки в работе плагина версии 1.66.3.



Ранг: 123.0 (ветеран), 10thx
Активность: 0.060
Статус: Участник

Создано: 07 марта 2009 18:31
· Личное сообщение · #12

Валентин, да, вопрос понят верно. Ведь бывают ситуации когда есть HWID удаленной машины и ключ, а надо снять протектор с EXE, в котором есть пошифрованные фрагменты у себя на компьютере. Какие будут рекомендации таком случае?

-----
.[ rE! p0w4 ].




Ранг: 153.9 (ветеран)
Активность: 0.120
Статус: Участник
reborn

Создано: 07 марта 2009 19:32
· Личное сообщение · #13

vnekrilov пишет:
Я на своей машине не могу получить эту ошибку, поскольку у меня плагин нормально отрабатываем все команды. Попробуй запустить плагин под отладчиком, и протрассировать отработку всех команд. Ведь где-то зарыта собака? Или может быть кто-то поможет из тех читателей, которые, как я где-то встречал, искали причину ошибки в работе плагина версии 1.66.3.

Спасибо, разобрался, была проблема в стороннем плагине

-----
~ the Power Of Reversing team ~




Ранг: 329.6 (мудрец), 192thx
Активность: 0.140.01
Статус: Участник

Создано: 08 марта 2009 09:33
· Личное сообщение · #14

newborn пишет:
Спасибо, разобрался, была проблема в стороннем плагине


Подскажи, пожалуйста, в каком плагине? У меня на ассемблировании команд не пашет плагин ODbgScript v1.66.3. Может быть, тоже одна и таже причина?

Ultras пишет:
Ведь бывают ситуации когда есть HWID удаленной машины и ключ, а надо снять протектор с EXE, в котором есть пошифрованные фрагменты у себя на компьютере. Какие будут рекомендации таком случае?


Когда закончу последнюю часть туториала по снятию анти-дампинга второго типа, видимо, напишу статью и по твоему вопросу. Мне приходилось, имея валидный ключ для другой машины, подменять HWiD, зашитый в ключе, HWiD'ом моей машины, и раскриптовывать закриптованные участки кода. Однако, подпрограмма проверки валидности регистрационного ключа, имеет эмулированные инструкции, о которых я и пишу в последней части туториала. Однако у меня здесь имеются сложности. Подбор нужных адресов в массиве данных для эмулированных подпрограмм пока является своего рода искусством, а я хочу подобрать механизм, который позволит, без этих заморочек, корректировать код подпрограммы извлечения информации из массива данных, применительно к конкретной версии Asprotect.dll. Кое-что я нашел, но надо все тщательно проверить.



Ранг: 123.0 (ветеран), 10thx
Активность: 0.060
Статус: Участник

Создано: 08 марта 2009 10:12
· Личное сообщение · #15

Отлично! Буду ждать.

-----
.[ rE! p0w4 ].





Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 08 марта 2009 11:30
· Личное сообщение · #16

Бывает когда есть пошифрованные куски и блэк ключ
Тоже интересно узнать что-нить по этому вопросу...



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

Создано: 08 марта 2009 11:45 · Поправил: hypeartist
· Личное сообщение · #17

newborn пишет:
vnekrilov пишет:
Я на своей машине не могу получить эту ошибку, поскольку у меня плагин нормально отрабатываем все команды. Попробуй запустить плагин под отладчиком, и протрассировать отработку всех команд. Ведь где-то зарыта собака? Или может быть кто-то поможет из тех читателей, которые, как я где-то встречал, искали причину ошибки в работе плагина версии 1.66.3.
Спасибо, разобрался, была проблема в стороннем плагине


А вот у меня все по прежнему:

Error on line 484
Text: asm temp_1, $RESULT
Label expected







Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 08 марта 2009 13:23
· Личное сообщение · #18

Ну вообще ошибка раньше идёт (483)
Я со своего скрипта приведу пример для asm
gci eip,DESTINATION
eval "CALL {$RESULT}"
asm temp,$RESULT

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




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

Создано: 09 марта 2009 14:47
· Личное сообщение · #19

Что касается вот этого:

Error on line 484
Text: asm temp_1, $RESULT
Label expected


Ларчик открывался просто:

OllyDbg: Options -> Debugging options -> Disasm -> Show local module name -> uncheck!

PS: блин, ктобы мог подумать




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 09 марта 2009 19:33
· Личное сообщение · #20

Пробовал распаковать Advanced Office Password Recovery последний
Скрипт Эмуляция API Asprotect не работает
там нет сигнатуры BA01000000B9????????8B
хотя апи протектора используются

Aspr info:
[AOPR], [4.12],
[1.4 build 11.20 OЊПIM‰Ш›Д

скрипт от Volx работает на ура
кстати этот скрипт так же неплохо вычищает мусор в импорте
неплохо бы доработать скрипт по восстановлению импорта



Ранг: 329.6 (мудрец), 192thx
Активность: 0.140.01
Статус: Участник

Создано: 10 марта 2009 02:17
· Личное сообщение · #21

Nightshade пишет:
там нет сигнатуры BA01000000B9????????8B


У меня нет, к сожалению, дистрибутива 1.4 build 11.20, но есть дистрибутив 2.4 build 11.20, у которых используется одна и таже Asprotect.dll. Так вот в этом протекторе имеется сигнатура #BA01000000B9????????8B#. Но интересно, что произошло. Сбрось мне ссылку на Advanced Office Password Recovery, посмотрю. Просто самому интересно.



Ранг: 329.6 (мудрец), 192thx
Активность: 0.140.01
Статус: Участник

Создано: 10 марта 2009 02:19
· Личное сообщение · #22

hypeartist пишет:
Ларчик открывался просто:

OllyDbg: Options -> Debugging options -> Disasm -> Show local module name -> uncheck!


Спасибо за информацию! У меня всегда на этой опции сброшен флажок, поэтому скрипт работает нормально.



Ранг: 329.6 (мудрец), 192thx
Активность: 0.140.01
Статус: Участник

Создано: 10 марта 2009 05:04
· Личное сообщение · #23

Nightshade пишет:
Скрипт Эмуляция API Asprotect не работает


Только что распаковывал программу, которая имеет API Asprotect, а скрипт не сработал. Причина оказалась довольно простой. В работе моего скрипта заложен поиск вызовов API Asprotect из таблицы IAT. Как правило, вызов API Asprotect находится где-то в середине или ближе к концу таблицы IAT. Но в программе, которую я распаковывал, оказалось, что вызов API Asprotect находится за концом таблицы IAT, и, поэтому скрипт не нашел этих вызовов. Решил я эту задачу очень просто. Поскольку у меня скрипт Восстановление таблицы IAT и вызовов APIs.osc создает дамп таблицы IAT, то я в конец этого дампа добавил вызов 5-ти API Asprotect, и запустил скрипт Эмуляция API Asprotect.osc, который сделал эмуляцию API Asprotect. Может быть и в твоей программе получилось такое?



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

Создано: 10 марта 2009 07:34 · Поправил: hypeartist
· Личное сообщение · #24

а то, что ни один скрипт не находит эмуляции GetProcAddress (и соответственно не добавляет его в таблицу IAT) это нормально? или я просто чего-то не понимаю?




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 10 марта 2009 08:34
· Личное сообщение · #25

Advanced Office Password Recovery
www.elcomsoft.com/download/aopr.zip
Апи аспра там тоже ниже таблице импорта
но указателя на них нет



Ранг: 329.6 (мудрец), 192thx
Активность: 0.140.01
Статус: Участник

Создано: 10 марта 2009 09:15
· Личное сообщение · #26

hypeartist пишет:
а то, что ни один скрипт не находит эмуляции GetProcAddress (и соответственно не добавляет его в таблицу IAT) это нормально?


Я не стал перегружать скрипт для восстановления таблицы IAT поиском API GetProcAddress, поскольку это можно сделать вручную, о чем я писал в туториале. Ведь это - не автоматический распаковщик (хотя, может быть, я позже рассмотрю этот вопрос).

Nightshade пишет:
Апи аспра там тоже ниже таблице импорта
но указателя на них нет


Спасибо за ссылку, скачаю и посмотрю. Видимо, придется немного изменить скрипт, и расширить поиск API Asprotect.



Ранг: 196.0 (ветеран), 72thx
Активность: 0.140.02
Статус: Участник

Создано: 10 марта 2009 12:30
· Личное сообщение · #27

hypeartist
Убери свою картинку, страница съехала, читать не возможно
vnekrilov
У тебя скоро топику ровно год Ты наверное планируешь для нас какой-нибудь подарок? Всё таки юбилей



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

Создано: 10 марта 2009 14:34 · Поправил: hypeartist
· Личное сообщение · #28

vnekrilov пишет:
Я не стал перегружать скрипт для восстановления таблицы IAT поиском API GetProcAddress, поскольку это можно сделать вручную, о чем я писал в туториале. Ведь это - не автоматический распаковщик (хотя, может быть, я позже рассмотрю этот вопрос).


все понял - прошу прощения

у меня еще вот вопрос:

в той dll, что я здесь на форуме выкладывал, обнаружил еще один непонятный мне момент: распоковал я ее (спасибо Konstantin за помощь), она нормально загружается в хостовую программу (dll является плагином), но при попытке выполнить из плагина загрузку файла я получаю Access Violation! Найдя точку непосредственно перед той, что вызывает exception, и "брякнувшись" на ней я обнаружил что далее идет CALL в какую-то "левую" область памяти. Посмотрел что происходит при работе упакованной dll и установил, что адрес перехода этого CALL'а при первом(!) срабатывании ведет (через-тернии-к-звездам) в то место где при распаковке Asprotect заморачивается с IAT (ну, там где адрес API функции отлавливается в EAX). В последствии адрес перехода этого CALL'а уже не меняется! Как бороться с этой runtime подстановкой?

PS: извините за путанность



Ранг: 329.6 (мудрец), 192thx
Активность: 0.140.01
Статус: Участник

Создано: 10 марта 2009 14:57
· Личное сообщение · #29

Djeck пишет:
Ты наверное планируешь для нас какой-нибудь подарок? Всё таки юбилей


А объединенный туториал по распаковке Аспра не является подарком?



Ранг: 196.0 (ветеран), 72thx
Активность: 0.140.02
Статус: Участник

Создано: 10 марта 2009 15:05
· Личное сообщение · #30

vnekrilov пишет:
А объединенный туториал по распаковке Аспра не является подарком?

Несомненно любой твой тутор подарок (плюс ещё выложил фичу по ключам), но тогда надо на юбилей выкладывать Всё равно 28 числа должно что-то случиться
Молодец, класные туторы пишешь, лично я читаю с удовольствием, а не просто чтобы прочитать.



Ранг: 329.6 (мудрец), 192thx
Активность: 0.140.01
Статус: Участник

Создано: 13 марта 2009 15:09
· Личное сообщение · #31

Приступил к написанию очередной части туториала по распаковке Asprotect, в котором будет рассмотрена практика доработки скрипта для восстановления эмулированных подпрограмм, выполняемых в виртуальной машине. Сначала я думал, что можно создать для каждой версии Аспра отдельный скрипт, который и будет распаковывать все программы, защищенные этим протектором. Однако, как говорится, обломался. Меня попросили распаковать программу, которая защищена Аспром v2.41 build 02.26. И в ней оказались подпрограммы, защищенные виртуальной машиной. Я думал, что быстро распакую эту программу, и обломился на восстановлении эмулированных инструкций. До этой программы, я видел защиту только в дистрибутивах Аспра, поскольку другие разработчики программ не применяют такую защиту (я думаю, просто не умеют этого делать), и у меня имеется такой скрипт для восстановления эмулированных подпрограмм в самом Аспре v2.41 build 02.26. И тут я обломался. Скрипт не взял эту программу. Когда я начал разбираться, в чем же причина, то оказалось, что протектор изменяет размещение данных в массивах данных, константы, и, самое страшное, он меняет закриптовку первого байта опкода инструкций для каждой защищаемой программы. Очень сильный ход разработчиков этого пакера, и им можно только поаплодировать. Придется писать туториал по доработке скрипта применительно к каждой конкретной программе, и для этого Пользователям придется не вслепую тыкать кнопки, а сознательно подходить к корректировке скрипта. Так что скоро я выложу очередную часть туториала, в котором и будут освещены все эти методы.


<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 . 17 . 18 . 19 ... 38 . 39 . >>
 eXeL@B —› Протекторы —› Анализ ASProtect
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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