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

 eXeL@B —› Вопросы новичков —› Визуализация на физическом плане
Посл.ответ Сообщение

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

Создано: 21 марта 2014 16:03 · Поправил: VBA
· Личное сообщение · #1

Добрый день!

Сейчас с интересом изучаю туториал Рикардо Нарвахи "Введение в крэкинг с помощью OllyDbg". Добрался до 14-ой главы. Там он разбирает крекми по имени "crackmeeasy". В предыдущих главах везде все было относительно легко и понятно, а здесь, можно сказать, "разум за разум заходит", когда пытаюсь проследить весь механизм работы защиты. Он там все очень подробно описывает, откуда что куда перекладывается (в регистрах и в памяти), но я постоянно "теряю нить".
Постоянно возникает мысль, что надо бы сделать (из бумаги или еще чего-нибудь) какую-нибудь физическую "ленту" с кармашками, на каждом кармашке скотчем наклеить адреса ячеек памяти, которые нас сейчас интересуют, и такую же "ленту" сделать для регистров, а потом трассировать пошагово в отладчике и одновременно перекладывать бумажки с текущими значениями из одного кармашка в другой.

Как думаете, будет ли полезна такая физическая визуализация или это тупиковый путь и надо все стараться просчитывать (представлять) в уме и смотреть только на экран дебаггера?

И вообще, хотелось бы узнать, как кто "выкручивается" в таких сложных случаях? Наверняка, у каждого есть какие-то приемы для облегчения такой работы.

И еще хотелось бы услышать совет вот такого свойства. У меня сейчас два пути.

Первый - читать все подряд в этом руководстве, но при этом пропускать такие сложные ("муторные") места. В конце концов, там впереди, судя по оглавлению, очень много интересного.
У этого подхода минус в том, что будет неприятный осадок, что без должной проработки пропущенного материала могу что-то не понять в дальнейшем. А кроме того, как я понимаю, серьезный реверсинг это и есть очень кропотливая работа, и если я не стремлюсь к ней, не получаю от нее удовольствия (как бы ни парадоксально это ни звучало), то это просто "не моё" и тогда лучше заниматься чем-нибудь другим.

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



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

Создано: 21 марта 2014 16:14
· Личное сообщение · #2

-Зачем вся эта возня.. в крайнем случае выписываешь себе на бумажку адреса каких-то важных переменных/функций.

VBA пишет:
И вообще, хотелось бы узнать, как кто "выкручивается" в таких сложных случаях? Наверняка, у каждого есть какие-то приемы для облегчения такой работы.

Ага.. с недельку поковыряешь код, он тебе сниться начинает, и тебя начинает неожиданно осенять гениальные идеи.

Если нет интереса к каким-то вещам, то и смысл их смотреть. Можно будет потом по мере надобности.
Я, честно говоря, вообще не видел этого цикла, ни одной главы.

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

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

Создано: 21 марта 2014 16:15
· Личное сообщение · #3

пиши псевдокод (или на си) и не нужно никаких бумажек или грузи в иду, там есть примерная визуализация

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

Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 21 марта 2014 16:53
· Личное сообщение · #4

VBA

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



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 21 марта 2014 19:07
· Личное сообщение · #5

От последнего вменяемого тутора нарвахи прошло лет 5, так что не советую это брать за эталон....

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

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

Создано: 21 марта 2014 19:58 · Поправил: VBA
· Личное сообщение · #6

drone пишет:
пиши псевдокод (или на си) и не нужно никаких бумажек...


Так в том-то и проблема. Чтобы написать псевдокод, надо сначала понять, что происходит. Там же в дебаггере всё на ассемблере. Честно говоря, я даже не представляю, как можно написать такой псевдокод. Приблизительно вот так что ли?

Code:
  1. С адреса 401D05 считываем двойное слово в регистр eax
  2. Значение регистра eax помещаем в память по адресу 222B41...


Но это же получится тот же самый ассемблер, только пересказанный своими словами, и это по-моему еще сильнее все запутает.


drone пишет:
...или грузи в иду, там есть примерная визуализация


В иду я его не могу загрузить, потому что он упакованный, ида ругается и его выплевывает, я пробовал. А в Олле Нарваха его ловит в том момент, когда он уже распаковался в памяти, и начинает анализировать. Чтобы его засунуть в иду его сначала надо распаковать, а я пока в этом деле не мастак. А вообще-то я в иде блок-схемы видел, но только на других файлах. Согласен, удобно, наглядно. Но если файл большой, то все равно ничего не понятно, замучаешься эти схемы прокручивать. А этот файл относительно маленький (все-таки не полновесная программа, а крекми), наверно, в иде он, и правда, был бы понятнее, если бы его распаковать и туда засунуть.

Vovan666 пишет:
От последнего вменяемого тутора нарвахи прошло лет 5, так что не советую это брать за эталон....


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




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

Создано: 21 марта 2014 20:23
· Личное сообщение · #7

VBA пишет:
Там же в дебаггере всё на ассемблере. Честно говоря, я даже не представляю, как можно написать такой псевдокод.


Для этого нужно адекватно владеть по крайней мере двумя языками: Assembly & "C".
Тогда можно выражать мысли "высказаные" на одном языке средствами другого языка.
Как, например, вы будете переводить с китайского на французский, не зная ни того, ни другого?

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




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

Создано: 21 марта 2014 21:14 · Поправил: VBA
· Личное сообщение · #8

plutos пишет:
Для этого нужно адекватно владеть по крайней мере двумя языками: Assembly & "C". Тогда можно выражать мысли "высказаные" на одном языке средствами другого языка.


Не, ну предлагали же на выбор: псевдокод или си. Ассемблер я более или менее знаю. А для того чтобы "перевести" с ассемблера на псевдокод знание си не обязательно, как мне кажется. Только сам этот перевод будет достаточно трудоемким и не таким наглядным, как перекладывание бумажек по "кармашкам памяти".


plutos пишет:
Как, например, вы будете переводить с китайского на французский, не зная ни того, ни другого?


В такой ситуации приходит на ум только использование Промта


P.S. И вообще, Bad_Guy в своем видеокурсе говорит, что для крэкинга вполне достаточно знать ассемблер и плюс какой-нибудь (любой!) язык высокого уровня. Сам же он в качестве этого второго языка рекомендует вовсе не си, а PHP.
Ну вот у меня сейчас так и есть - Ассемблер плюс разные диалекты Бэйсика.



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

Создано: 22 марта 2014 00:30
· Личное сообщение · #9

VBA пишет: Ассемблер я более или менее знаю

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

VBA пишет: Только сам этот перевод будет достаточно трудоемким

Когда вы понимаете, как это работает, то сложность перевода упирается в набор текста.
Хотя тут могут быть проблемы с библиотеками, если программа на 90% состоит из вызовов VCL то иногда сложно перевести на чистый си или с++.

VBA пишет: И вообще, Bad_Guy в своем видеокурсе говорит

Bad_Guy не бог, но отчасти он говорит верно, если бы вы понимали asm, то опять же, не возникали бы такие вопросы.

VBA пишет: рекомендует вовсе не си, а PHP.

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

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


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

Создано: 22 марта 2014 00:46
· Личное сообщение · #10

Мне просто любопытно, как именно вы себе представляете псевдокод?
Вот пример псевдокода:
Code:
  1. __except_handler3 Pseudocode 
  2.  
  3.  int __except_handler3(
  4.      struct _EXCEPTION_RECORD * pExceptionRecord,
  5.      struct EXCEPTION_REGISTRATION * pRegistrationFrame,
  6.      struct _CONTEXT *pContextRecord,
  7.      void * pDispatcherContext )
  8.  {
  9.      LONG filterFuncRet
  10.      LONG trylevel
  11.      EXCEPTION_POINTERS exceptPtrs
  12.      PSCOPETABLE pScopeTable
  13.  
  14.      CLD     // Clear the direction flag (make no assumptions!)
  15.  
  16.      // if neither the EXCEPTION_UNWINDING nor EXCEPTION_EXIT_UNWIND bit
  17.      // is set...  This is true the first time through the handler (the
  18.      // non-unwinding case)
  19.  
  20.      if ( ! (pExceptionRecord->ExceptionFlags
  21.              & (EXCEPTION_UNWINDING | EXCEPTION_EXIT_UNWIND)) )
  22.      {
  23.          // Build the EXCEPTION_POINTERS structure on the stack
  24.          exceptPtrs.ExceptionRecord = pExceptionRecord;
  25.          exceptPtrs.ContextRecord = pContextRecord;
  26.  
  27.          // Put the pointer to the EXCEPTION_POINTERS 4 bytes below the
  28.          // establisher frame.  See ASM code for GetExceptionInformation
  29.          *(PDWORD)((PBYTE)pRegistrationFrame - 4) = &exceptPtrs;
  30.  
  31.          // Get initial "trylevel" value
  32.          trylevel = pRegistrationFrame->trylevel 
  33.  
  34.          // Get a pointer to the scopetable array
  35.          scopeTable = pRegistrationFrame->scopetable;
  36.  
  37.  search_for_handler: 
  38.  
  39.          if ( pRegistrationFrame->trylevel != TRYLEVEL_NONE )
  40.          {
  41.              if ( pRegistrationFrame->scopetable[trylevel].lpfnFilter )
  42.              {
  43.                  PUSH EBP                        // Save this frame EBP
  44.  
  45.                  // !!!Very Important!!!  Switch to original EBP.  This is
  46.                  // what allows all locals in the frame to have the same
  47.                  // value as before the exception occurred.
  48.                  EBP = &pRegistrationFrame->_ebp 
  49.  
  50.                  // Call the filter function
  51.                  filterFuncRet = scopetable[trylevel].lpfnFilter();
  52.  
  53.                  POP EBP                         // Restore handler frame EBP
  54.  
  55.                  if ( filterFuncRet != EXCEPTION_CONTINUE_SEARCH )
  56.                  {
  57.                      if ( filterFuncRet < 0 ) // EXCEPTION_CONTINUE_EXECUTION
  58.                          return ExceptionContinueExecution;
  59.  
  60.                      // If we get here, EXCEPTION_EXECUTE_HANDLER was specified
  61.                      scopetable == pRegistrationFrame->scopetable
  62.  
  63.                      // Does the actual OS cleanup of registration frames
  64.                      // Causes this function to recurse
  65.                      __global_unwind2( pRegistrationFrame );
  66.  
  67.                      // Once we get here, everything is all cleaned up, except
  68.                      // for the last frame, where we'll continue execution
  69.                      EBP = &pRegistrationFrame->_ebp
  70.                      
  71.                      __local_unwind2( pRegistrationFrame, trylevel );
  72.  
  73.                      // NLG == "non-local-goto" (setjmp/longjmp stuff)
  74.                      __NLG_Notify( 1 ); // EAX == scopetable->lpfnHandler
  75.  
  76.                      // Set the current trylevel to whatever SCOPETABLE entry
  77.                      // was being used when a handler was found
  78.                      pRegistrationFrame->trylevel = scopetable->previousTryLevel;
  79.  
  80.                      // Call the _except {} block.  Never returns.
  81.                      pRegistrationFrame->scopetable[trylevel].lpfnHandler();
  82.                  }
  83.              }
  84.  
  85.              scopeTable = pRegistrationFrame->scopetable;
  86.              trylevel = scopeTable->previousTryLevel
  87.  
  88.              goto search_for_handler;
  89.          }
  90.          else    // trylevel == TRYLEVEL_NONE
  91.          {
  92.              retvalue == DISPOSITION_CONTINUE_SEARCH;
  93.          }
  94.      }
  95.      else    // EXCEPTION_UNWINDING or EXCEPTION_EXIT_UNWIND flags are set
  96.      {
  97.          PUSH EBP    // Save EBP
  98.          EBP = pRegistrationFrame->_ebp  // Set EBP for __local_unwind2
  99.  
  100.          __local_unwind2( pRegistrationFrame, TRYLEVEL_NONE )
  101.  
  102.          POP EBP     // Restore EBP
  103.  
  104.          retvalue == DISPOSITION_CONTINUE_SEARCH;
  105.      }
  106.  }
  107.  
  108.  


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





Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 22 марта 2014 06:47
· Личное сообщение · #11

VBA пишет:
Честно говоря, я даже не представляю, как можно написать такой псевдокод.


ну, вероятно, стоит определиться с самим понятием.
Этот цикл (введение в крекинг) можно смотреть после освоения ассемблера. Иначе, после пары тройки глав, начинается вот такая каша.

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

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

Создано: 22 марта 2014 14:20 · Поправил: VBA
· Личное сообщение · #12

VBA пишет:
P.S. И вообще, Bad_Guy в своем видеокурсе говорит, что для крэкинга вполне достаточно знать ассемблер и плюс какой-нибудь (любой!) язык высокого уровня. Сам же он в качестве этого второго языка рекомендует вовсе не си, а PHP.


Сейчас специально заново пересмотрел те 3 урока видеокурса, которые посвящены изучению языка PHP и понял, что допустил ошибку в своем высказывании. Так что на всякий случай приношу свои извинения.
На самом деле, точная цитата из урока №4 "delphi_si_ili_php_slozhnyi_vybor" звучит вот так: "Я предпочитаю выбрать для начального изучения программирования такой язык как PHP".

F_a_u_s_t пишет:
Bad_Guy не бог, но отчасти он говорит верно, если бы вы понимали asm, то опять же, не возникали бы такие вопросы.


Ну бог может и не бог, но огромный АКТУАЛЬНЫЙ туториал для новичков (Курс видеоуроков программирования и крэкерства 3.0_выпущен в августе 2013) создан именно им.

Про понимание ассемблера это очень всё растяжимо. Разумеется, я не могу сказать про себя, что я ассемблерный гуру, но основные команды я знаю, принцип работы стека (LIFO) понимаю, особенности хранения данных в памяти (в перевернутом виде) тоже понимаю. Ну а что ещё-то требуется для крэкинга? Опыт? Ну да, его пока что маловато, я согласен.

Gideon Vi пишет:
Этот цикл (введение в крекинг) можно смотреть после освоения ассемблера. Иначе, после пары тройки глав, начинается вот такая каша.


Опять же всё упирается в оценку степени освоения ассемблера. Чтобы знать язык на нем надо программировать. А на ассемблере сейчас НИКТО не программирует, поэтому, по большому счету, его сейчас НИКТО не знает. А простенькую программу под 16-битный DOS я тоже могу написать. Под Windows пока еще не могу. Но ведь для этого уже не столько сам ассемблер требуется знать, сколько принципы работы операционной системы и тонкости вызова API функций, и сами эти функции. Ну да, здесь у меня пока ещё слабое место, с этим я не спорю.


plutos пишет:
Мне просто любопытно, как именно вы себе представляете псевдокод?Вот пример псевдокода:


Gideon Vi пишет:
ну, вероятно, стоит определиться с самим понятием.


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

Вот оттуда цитаты на эту тему:

Псевдокод
У программистов есть еще один вид языка программирования, называемый псевдокодом. Псевдокод – это естественный язык, по структуре похожий на язык высокого уровня. Его не понимают компиляторы, ассемблеры и какие-либо компьютеры, но он помогает программистам организовать инструкции. Псевдокод не имеет четкого определения. Разные люди пишут на псевдокоде немного по-разному. В некотором роде, это туманное отсутствующее звено между естественными языками, например английским, и языками программирования высокого уровня вроде C. Псевдокод помогает понять общие стандартные принципы программирования.

..................


В этой книге используется псевдокод, похожий на C, поэтому каждая инструкция оканчивается точкой с запятой, а наборы инструкций определяются с помощью фигурных скобок и отступов. Если приведенную выше схему проезда преобразовать в псевдокод, получится примерно следующее:


Code:
  1. Двигаться по Главной улице;
  2. If (движение перекрыто)
  3. {
  4. Повернуть направо на 15-ю улицу;
  5. Повернуть налево на Сосновую улицу;
  6. Повернуть направо на 16-ю улицу;
  7. }
  8. Else
  9. {
  10. Повернуть направо на 16-ю улицу;
  11. }


Ну вот приблизительно так я представляю себе псевдокод


Основные понятия программирования
В следующих разделах мы познакомимся с другими общими понятиями программирования. Эти понятия используются во многих языках программирования с некоторыми синтаксическими различиями.
По ходу представления этих понятий я буду иллюстрировать их примерами псевдокода с C-образным синтаксисом. К концу псевдокод станет очень похож на C.


Ну вот, а поскольку я до этого самого конца еще не дочитал, то пока еще представляю себе псевдокод именно так, как процитировано выше


P.S. Ну ладно, в принципе ответ на главный вопрос этой ветки я уже услышал. И он состоит в том, что для визуализации никто не использует никаких физических приспособлений. Ну значит и я тоже не буду.



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

Создано: 22 марта 2014 14:43
· Личное сообщение · #13

VBA пишет: но основные команды я знаю

Мало знать команды, нужно еще знать алгоритмы и понимать общий принцип работы оси.

VBA пишет: Чтобы знать язык на нем надо программировать.

Что бы знать язык на нем не обязательно писать, его нужно просто знать, тогда появится понимание этого самого языка.
Я например на VB не пишу, но спокойно перевожу код с VB на другие языки.

VBA пишет: У программистов есть еще один вид языка программирования, называемый псевдокодом.

Псевдокод просто удобная запись алгоритма, причем удобная как правило лично для себя самого.
В некоторых книгах "псевдокод" вполне себе компилится, просто псевдокодом оказался паскаль.
Записывайте так, как вам удобно, не оглядывайтесь на других.
В частных случаях псевдокод должен быть оторван от специфики платформы, но это практикуется в обучении языкам.
Например:
флаг = создать файл( "тест.текст" )
если флаг == истина то
записываем_в_файл( буффер )
....
описываем логику работы с файлами без специфических флагов и языковых конструкций.

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


Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 22 марта 2014 16:03
· Личное сообщение · #14

VBA пишет:
А на ассемблере сейчас НИКТО не программирует


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

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

Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 22 марта 2014 19:05
· Личное сообщение · #15

VBA пишет:
А для того чтобы "перевести" с ассемблера на псевдокод знание си не обязательно, как мне кажется.

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

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

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

Создано: 22 марта 2014 23:29 · Поправил: VBA
· Личное сообщение · #16

SReg пишет:
Так же имхо обязательно самому написать тысячи(сотни тыщь) строк кода, и самое главное, отладить его!, и тогда открыв любую прогу в оле и пройдя в любую функцию, у тебя перед глазами будет исходник


Пожалуй, да. После такого "тренинга" любой код в отладчике будет знакомым и родным



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

Создано: 23 марта 2014 00:16 · Поправил: F_a_u_s_t
· Личное сообщение · #17

VBA пишет: После такого "тренинга" любой код в отладчике будет знакомым и родным

Это действительно так.
Помимо этого могу добавить, старайтесь сами решать задачи, то что непонятно гуглить, здешние "пенсионеры" начинали ломать, когда еще и туторов то было целых полторы штуки.
Если что то не получается, то отложите на потом, возьмите что проще и через время вернитесь к той задаче и скорее всего вы сможете ее решить.
Без трудностей не бывает личностного роста.
Нет никакой серебряной пули, все, кто более менее чего то достиг таки напрягали мозг, собственно после чего он и развивается.
Не бойтесь трудностей и не ищите легких путей, тогда все у вас получится, лишь бы был интерес.

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

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

Создано: 23 марта 2014 02:02 · Поправил: VBA
· Личное сообщение · #18

F_a_u_s_t пишет:
Это действительно так.


И наверно, лучше начать с 32-битной консольной си под Windows, правильно я понимаю? Я как раз недавно скачал видеокурс вот отсюда:
http://www.youtube.com/playlist?list=PLgPPmowqnDALAbF64bgr39RFoRwqQc89O

Сегодня посмотрел первый урок. Вроде бы вполне толково мужик всё объясняет, доходчиво.




Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 23 марта 2014 07:37
· Личное сообщение · #19

Используйте учебники. Видеокурсы - сурогат, без плюсов физически доступного лектора (очное образование) или источника фундаментальных знаний (учебники).

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

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

Создано: 23 марта 2014 08:00
· Личное сообщение · #20

VBA пишет: И наверно, лучше начать с 32-битной консольной си под Windows

Именно так, 16 бит это уже история, 64 по сути своей тоже самое, только каши в голове еще больше добавит чем 32 бита.
По поводу уроков, тут разделяю мнение Gideon Vi, читайте книги, в голове больше задержится.
При сборке сишного кода можно генерировать асм листинг с сишными комментариями и таки посмотреть что получается и из чего оно получилось.

| Сообщение посчитали полезным: VBA
 eXeL@B —› Вопросы новичков —› Визуализация на физическом плане
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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