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

 eXeL@B —› Дневники и блоги —› ARCHANGEL's blog
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 . >>
Посл.ответ Сообщение


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 13 июля 2012 18:28
· Личное сообщение · #1

Добрый день, уважаемые форумчане. Ни для кого не секрет, что решил я с недавних пор пойти учиться программированию. Поэтому стали меня интересовать практические аспекты кодинга, иногда весьма далёкие от вопросов реверсинга. Поэтому чтоб не засорять форум, решил создать этот блог. Стоит сказать, что вопросы, которые планируется тут разбирать, не такие уж и бесполезные. Они часто могут возникать при написании тех же кейгенов или тулз для реверсинга, так что, надеюсь, каждый сможет найти здесь что-нибудь интересное. Как некоторые уже догадались, вопросы Common Controls, простым числам, и сегодняшний вопрос по OpenGL как раз из серии учебных. Теперь о самом вопросе.

На днях выполнял задание про отрисовку простых фигур: треугольника, квадрата и т.д. Решено было выполнять рисование средствами OpenGL. Литературы по этому делу много, поэтому я разобрался, что и как. Т.е. в литературе советовали использовать бибилиотеку glut.dll, которая сама не относится к стандартному OpenGL, но её применение, как я понял, упрощает использование OpenGL в своих проектах. Далее я решил создать базовый класс для отрисовки треугольника, а от него создать производные классы для отрисовки других геометрических фигур. Но на практике получилась вот такая сложность. Дело в том, что glut, по сути, инкапсулирует функции Windows и OpenGL, что упрощает операции с ними. Но от базовых вещей же никуда не деться. Т.е. если процедура обработки оконных сообщений (CALLBACK WindowProc) должна присутствовать, то в классе она должна быть статической. Так и здесь:
Code:
  1. glutDisplayFunc(Draw); //где Draw - колбэк, а значит не может быть простым методом класса


Но вот проблема - мне нужно передать внутрь Draw несколько параметров. Являясь статическим методом, Draw не имеет указателя this, а значит не видит обычных полей. Статические поля он видит, но при попытке в конструкторе присвоить значения этим полям появляется ошибка линковки. Понятное дело, что по-хорошему, можно обойтись совсем без классов, но это превратит код в кашу - большое количество глобальных переменных, почти одинаковые функции со схожим функционалом принесут путаницу раньше, чем будут отрисованы несколько фигур. Кто посоветует, как быть в такой ситуации и как решить проблему со статическими функциями-членами?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 04 декабря 2012 11:42
· Личное сообщение · #2

Двигаюсь потихоньку в освоении С++. Недавно возник вопрос следующего характера. Допустим, у меня есть шаблон некоего класса. Мне нужно разделить объявление этого шаблона с его опредлением и разнести это всё по разным файлам. Т.е. само объявление шаблона хочу поместить в файл *.h, а определение функций-членов класса поместить в отдельный *.cpp. В общем, это прекрасно работает с нешаблонными классами. Здесь же возникла проблема. Такая идея возникала не только у меня - в геглу нашлось --> Это <--. Там меня смущает такая фраза:

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

Как же, используя студию и предварительно скомпилированные заголовки, можно добиться желаемого результата?

-----
Stuck to the plan, always think that we would stand up, never ran.




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

Создано: 04 декабря 2012 23:37
· Личное сообщение · #3

ARCHANGEL
Если я правильно понял вопрос, то по ссылке ответ с примерами.
template Instantiation




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 05 декабря 2012 16:45
· Личное сообщение · #4

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

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 05 декабря 2012 21:07
· Личное сообщение · #5

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

-----
Следуй за белым кроликом





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 05 декабря 2012 22:01
· Личное сообщение · #6

ARCHANGEL
делай абстракцию, разделяй на не шаблонный класс, который будет обявлен в .h а тело в .cpp
и шаблонный, шаблонный будет навернут на обычный класс

в шаблоном используй минимум, всякие касты, степ сайзы и прочее




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 06 декабря 2012 11:41
· Личное сообщение · #7

Теорию я нашёл в книге Вандевурд, Джосаттис - Шаблоны C++, там, в общем, всё понятно и на русском, но смущает меня, что там, впрочем, как и у Страуструпа, упоминается некое ключевое слово export, которое, однако, как я понял, MS VC++ не думает поддерживать. Печаль. Но вот хоть убейте - не пойму, почему после главы про явное инстанцирование и export идёт глава про предварительно скомпилированные заголовки. По заголовкам нагуглил --> Это <--. Но причём там шаблоны - не могу въехать.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 07 декабря 2012 22:08
· Личное сообщение · #8

http://www.rsdn.ru/forum/cpp/1882041.flat

http://stackoverflow.com/questions/5416872/using-export-keyword-with-templates
First of all: most compilers (including gcc, Clang and Visual Studio) do not support the export keyword.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 14 декабря 2012 00:24 · Поправил: ARCHANGEL
· Личное сообщение · #9

Так, ну с шаблонами разобрались, спасибо всем за помощь. Следующее задание заключалось в составлении шаблона бинарного дерева, которое состоит из узлов. Каждый узел имеет ключ и три ссылки: на родителя, на левое поддерево и на правое поддерево. Ключ содержит некоторые сущности, для которых определены операторы <, >, ==. Если добавляется узел, то его сущность сравнивается с сущностью корня, если больше, то идёт направо, меньше - налево, там значение сравнивается со значением следующего узла и т.д. С этим проблем нет, но не могу придумать ни одной задачи, где эта хрень могла бы быть применимой на практике. Есть у кого какие идеи?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 14 декабря 2012 00:45
· Личное сообщение · #10

Телефонный справочник. Сущности - фамилии абонентов или номера, в зависимости по чему потом будем осуществлять поиск.

-----
Следуй за белым кроликом


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


Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 декабря 2012 01:03
· Личное сообщение · #11

практическая задача для этой теории это мемори аллокартор

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


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 14 декабря 2012 01:52
· Личное сообщение · #12

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

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 декабря 2012 01:57
· Личное сообщение · #13

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

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




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 14 декабря 2012 11:29
· Личное сообщение · #14

reversecode
Не спорю, поэтому я и написал, что посмотрю.

-----
Stuck to the plan, always think that we would stand up, never ran.




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

Создано: 15 декабря 2012 11:48 · Поправил: F_a_u_s_t
· Личное сообщение · #15

ARCHANGEL
Как вариант могу предложить матчинг, разбиение большой сигнатуры на меньшие и сравнения процента вхождения.
Тот же Ахо-Корасик только в шаблонах.
Add:
Попался исходник на винте, легко запилить твое дерево под эту задачу.
Aho-Corasick
Практически мегопревадный пайд или дие.

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


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 15 декабря 2012 23:00 · Поправил: ARCHANGEL
· Личное сообщение · #16

F_a_u_s_t
Если я правильно понял Википедию и --> Сиё рисование <--, то деревцо-то в общем случае не бинарное. А за алгоритм спасибо, первый раз слышу о нём, может, пригодится когда.

Мне б надо блог переименовать в блог: "Блог постановщика задач. Вам не хватает задач, подходите - я озадачу."

Да, кстати, завтрашнее Д.З. реализовал со справочником. Уж что успел.

Ну, и вот она, новая задача, которая будоражит мне мозг, но не могу правильно сформулировать вопрос, поэтому прошу прощения за возможные корявости в изложении. В общем, есть у меня на работе в офисе маленькая локальная сеть. В ней одновременно может быть активно 16 компов (плюс - минус 5 - на будущее зарезервированы). Компьютеры в ней входят в одну рабочую группу. Домен и актив дайректори - не вариант, ибо лупоглазые админы будут шариться там, где им не надо. Задача - сделать клиент-серверное приложение для обмена файлами по сети. Сложность состоит в том, что на роутере стоит DHCP, настройки роутера админы менять не дадут. Имеем то, что IP каждый раз динамический, плюс нет такого компа, который бы выполнял роль сервера (или мог бы её выполнять для софтины обмена файлами). Как я вижу решение. В общем, на каждый комп ставиться софтина. Каждому компу присваивается уникальный идентификатор в рамках сети (пусть для краткости будет А, B, C). Когда на каком-то из компов запускается эта софтина, она должна каким-то образом узнать, какие- компы из локалки включены (физически), и на каких запущена софтина для приёма файлов. Т.е. софтина шлёт какой-то пакет в сеть, и получает ответ. На основе ответа определяет физическое включение, потом пытается установить соединение с каждым включённым компом (коннектится на какой-то порт компа), если удалось, то идёт процесс авторизации, если и это удалось - то идёт передача/приём файлов. Но непонятно, как именно программно определить, какие компы локалки включены, т.е. как узнать, что в сети есть комп с IP 192.168.0.100, но нет 192.168.0.20? Ведь не сканировать же весь диапазон? Или сканировать?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 15 декабря 2012 23:41
· Личное сообщение · #17

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




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 17 декабря 2012 14:01
· Личное сообщение · #18

ИМХО задача под UDP broadcast.

Посмотри:
--> Link1 <--
--> Link2 <--
--> Link3 <--

-----
127.0.0.1, sweet 127.0.0.1


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


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 24 декабря 2012 11:39 · Поправил: ARCHANGEL
· Личное сообщение · #19

Возникла тут достаточно тривиалная задача. Есть строка вида THEPARAM=12abc34dcs, т.е. её можно описать регэкспом вида ^THEPARAM=[a-zA-Z0-9]+$. Мне нужно проверить строку на соответствие этому регэкспу, и если строка проходит (boost::reg_match), то извлечь подстроку [a-zA-Z0-9]+. Как бы это с бустом по-нормальному сделать, чтоб не ёрзать по строке reg_match и reg_search?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 24 декабря 2012 13:25 · Поправил: reversecode
· Личное сообщение · #20

использовать регекспы для тривиальных задач как то уж слишком
если разделитель '=' всегда присутствует
делай его поиск, разбивай строку и банальный strncmp первой строки
и цикл isnumeric+isalpha по другой




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 24 декабря 2012 15:11
· Личное сообщение · #21

reversecode
Ну так в лоб - то понятно. Я имею ввиду, вот, например, мы помещаем некоторый регэксп в скобки ([0-9]*), и потом при совпадении можем использовать полученный результат как \1, можно ли как-то после одного лишь вызова reg_match выцепить строку, которой бы соответствовал кусок регэкспа [a-zA-Z0-9]+, или это - фантастика?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 24 декабря 2012 15:28
· Личное сообщение · #22

ну екранируй, я хз как там в бусте, но обычно екран это ()
если екрано много, () () () () ()
результаты получают через \1 \2 \3 \4 \5 итд
нужный екран это номер позиции результата




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 24 декабря 2012 15:47
· Личное сообщение · #23

reversecode
Это всё понятно, я про другое спрашивал. Ну, пойду ещё помощь к бусту полистаю, уже листаю-листаю, что-то всё никак не проясняется.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 24 декабря 2012 15:54 · Поправил: reversecode
· Личное сообщение · #24

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

1 шаг, задается шаблон ^THEPARAM=[a-zA-Z0-9]+$ который настраивает AST дерево
2 шаг подается входящая строка которая скармиливается в функцию которая бегает по AST дереву и парсит строку (и опционально может возращать false/true на корректность обработки)
3 шаг получаем в заданых екрана результаты выражений



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

Создано: 24 декабря 2012 16:39
· Личное сообщение · #25

ARCHANGEL
Со временем не очень, по ссылке есть ответы на ваши вопросы о boost::regex.
статья




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 24 декабря 2012 17:24
· Личное сообщение · #26

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

F_a_u_s_t
Основы там, конечно, есть, но ответа на свой вопрос я не нашёл.

Меня смущает эта фраза из помощи к бусту:
Regular expressions are different from many simple pattern-matching algorithms in that as well as finding an overall match they can also produce sub-expression matches: each sub-expression being delimited in the pattern by a pair of parenthesis (...). There has to be some method for reporting sub-expression matches back to the user: this is achieved this by defining a class match_results that acts as an indexed collection of sub-expression matches, each sub-expression match being contained in an object of type sub_match.

Это, походу, оно. Буду разбираться.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 24 декабря 2012 17:30
· Личное сообщение · #27

они доступны как результат матчинга

Code:
  1. std::string xStr("AAAA-12222-BBBBB-44455");
  2.  boost::regex xRegEx("(\w+)-(\d+)-(\w+)-(\d+)");
  3.  boost::smatch xResults;
  4.  std::cout << "==========================Results============================== \n";
  5.  std::cout << "Does this line match our needs? " << std::boolalpha << boost::regex_match(xStr,  xResults, xRegEx) << "\n";
  6. std::cout << "Print entire match:\n " << xResults[0] << std::endl;
  7.  std::cout << "Print the former string into another format:\n" << xResults[1] << "+"
  8.                                  << xResults[2] << "+"
  9.                                  << xResults[3] << "+"
  10.                                  << xResults[4] << std::endl;

xResults[1] 2 3 4 как результат матчинга

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


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 26 декабря 2012 00:20
· Личное сообщение · #28

Нехороший Свиновод взял и закрыл тему, в которой я задал вопрос, поэтому если кому интересно будет на него ответить, то продублирую его здесь. Установил я на варю Daemon Tools, потом установил Syser, вручную включил службу sptd (в реестре параметр запуска на 0 поменял), потом через RKU снимаю ядерные колбэк-обработчики этой прекрасной sptd, и дебаггер у меня запускается, работает. Даемон тулз тож диски эмулит, и всё в шоколаде, но Syser работает только с установленными на виртуалке VMware tools, а для этого строку isolation.tools.getVersion.disable = "TRUE" из конфига виртуалки мне приходится стирать, что приводит к тому, что хитрожопый старфорс детектит виртуалку через i/o backdoor механизм, т.е как-то так:
Code:
  1. mov eax, 0x564D5868 
  2. mov ecx, 10
  3. xor ebx, ebx
  4. mov dx, 0x5658 
  5. in eax, dx

bpio в Syser ничего не дают, т.е. где-то эта грёбаная инструкция есть, а где - непонятно. Трассировал с условием ехе, защищённый старфорсом, трассировал в лог и делал поиск по логу - болт. В Syser вписал tss, и в ответ увидел, что I/O Map size = 0, а по инфе --> Отсюда <-- я понял, что если размер нулевой, то все биты битовой карты считаются взведенными, а значит вызов иснтрукции типа in xxx,xx будет делать исключение. Внимание, вопрос - как бы так оставить VMware tools, но убрать этот грёбаный бэкдор?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 26 декабря 2012 00:25
· Личное сообщение · #29

я ничего не понял,
вставь в гугл mov dx, 0x5658
и прочитай ответ




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 26 декабря 2012 10:05
· Личное сообщение · #30

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




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 26 декабря 2012 11:41
· Личное сообщение · #31

Со Свиноводом, конечно, всё понятно. Предлагаю продолжить обсуждение темы старфорса здесь. Я-то ночью взял и пошёл спать, а утром захожу - тема закрыта, в ней куча постов, где Свин наезжает на Nightshade. В общем, инфа, которая будет написана ниже, предназначена тем, кому самим не охота разбирать старфорс, но интересно узнать, что там всё это значит, кто виноват, а кто прав.

Про то, что Свин (будем так сокращать, думаю, владелец ника не обидится) пишет, типа, дескриптор один и тот же, ну, это, конечно, бред. Смотрите, что на самом деле происходит.

Внутри вм до перехода на ЕР упакованного ехешника делается вызов CreateFileA. Как известно --> Отсюда <--, эта Win API возвращает HANDLE. HANDLE - это индекс в таблице, таблица эта располагается в ядре, т.к. именно там расположены внутренние струкутуры, описывающие такие объекты как процессы, файлы, события и т.д. А индекс - это просто какое-то значение, которое само по себе, выдернутое из контекста - просто число (беззнаковое целое, если хотите). Оно имеет смысл только, если этот индекс указывает на объект, который реально существует в контексте данного процесса.

Что же происходит дальше. Дальше полученное значение сохраняется в выделенной памяти. Память эта, естественно, принадлежит виртуальной машине. Свин делает полный дамп всей вм, и прикручивает её к дампу. Это приводит к тому, что значение дескриптора сохраняется как константа в памяти вм. Но для дампа это значение имеет совершенно иной смысл (скорее всего, не имеет никакого). Т.е. а хрен его знает, на какой объект в дампе указывает этот индекс, и указывает ли вообще на что-то. DeviceIoControl, как известно опять-таки из --> Вполне доступных источников <-- возвращает 0, если вызов завершился неудачно.
If the operation fails or is pending, the return value is zero.

Чтоб убедиться, что это не pending, достаточно посмотреть код ошибки.

Теперь по поводу иных методов обнаружения Вари, кроме вышеупомянутого бэкдора, я думаю, что они не применяются, во-первых, по предыдущему опыту анпака блокнота, во-вторых, стоит мне добавить в конфигурационный файл Вари строчку isolation.tools.getVersion.disable = "TRUE" и всё, дебажь старфорс хоть обдебажься, но сайсер не запускается, т.е. запускается, но на экране не отображается. Т.е. обход бэкдора решает проблему.

Теперь в плане битовой карты ввода/вывода. Поставив в сайсере брейкпоинт через bpio и просто выполняя инструкцию in eax,dx в своих приложения, всё равно не получаю останова, а получаю только переход на KiUserExceptionDispatcher, т.е. все биты, похоже, считаются взведенными, и дело не в том, что старфорс как-то трёт отладочные регистры. Что ж, посмотрим в сторону отладки через IDA, поищем тутор, про который Archer упомянул, и попробуем разбирать виртуальную машину хотя б в самом первом приближении, не будем говорить про декомпиль, потому что до него топать, как Свиноводу до релиза, но блог этот --> Весёлый блог <--. Обращение Свина к народу 31 декабря... что тут сказать... я плакал. Есть ещё и предновогоднее интервью.

Спасибо Nightshade за готовность помочь. Я, правда, не знаю, почему вы не хотите, чтоб Свин узнал инфу про старфорс. Я так понимаю - он что знает, что нет, почти ничего не меняется (в плане понимания работы сатрфорса у Свина). Но пока у меня нет нормальных конкретных вопросов к вам по работе старфорса как такового, а просто так беспокоить, типа, сделайте за меня, мне бы не хотелось. Как что-то накопаю, тогда попрошу у вас совета.

-----
Stuck to the plan, always think that we would stand up, never ran.



<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 . >>
 eXeL@B —› Дневники и блоги —› ARCHANGEL's blog
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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