Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587

Crackme: реверс-инжиниринг

18.06.2026, 13:19. Показов 23468. Ответов 278
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В архиве 10 exe-файлов - консольных приложений, каждое из которых запрашивает пароль. Цель в том, чтобы найти и ввести правильный пароль, после чего получить сообщение Password OK!
Приложения созданы не мной, а неким IOLI. Приложения 32-битные, что тоже упрощают работу.
Приложения закрываются после выполнения, поэтому запускайте из cmd.

Собственно, вы можете использовать любой удобный вам инструмент: IDA Pro, Ghidra, Cutter, x32dbg и т.д. Т.е. можно как статически анализировать, а можно запустить отладчик и анализировать динамически.
Поскольку не будет вывода секретного сообщения при правильном вводе пароля и заранее известно, что выведется лишь Password OK!, то не вижу смысла в использовании всяких трюков, чтобы обойти проверку пароля всякими jmp и прочими инструкциями. Лучше тренироваться именно в поиске пароля, а не в его обходе.


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

Что я имею в виду? Например, если открыть crackme0x03.exe в IDA Pro, то после декомпиляции мы сразу увидим пароль:



Декомпилятор Ghidra тоже сразу показывает пароль (в hex):



Чтобы было интересно, в таких простых случаях можно перейти в дизассемблерный вид и попытаться найти пароль самостоятельно:

Например, вот как выглядит это окно в IDA Pro. Я там специально добавил комментарии к некоторым строкам и разъяснил, как вычисляется этот пароль (но есть одна опечатка в одном комменте 528 вместо 582).



Для новичков в IDA Pro есть фича Auto Comments, которая включается в настройках. Но честно говоря, она мне не очень нравится.

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



Еще Cutter хорош тем, что на выбор там два декомпилятора, один из которых это декомпилятор от Ghidra (вполне неплохая альтернатива платного от Hex-Rays в IDA Pro). Собственно, этот же декомпилятор можно использовать и в самой Ghidra, но там нет автокомментирования.

***

В crackme0x04.exe пароль сразу не виден после декомпиляции.



Но и там нет ничего сложного, просто переходим в функцию check и сразу становится ясно, что на самом деле данное приложение принимает не один правильный пароль, а их может быть несколько. Т.е. любое число, где сумма цифр введенного числа равна 15.



crackme0x05.exe очень похож на предыдущее задание, только нужно еще вспомнить, как определяют четность чисел с помощью побитового AND.

***
Короче, если вам скучно и не знаете, чем заняться, то можете поиграться с этими файлами и ознакомиться с основами реверс-инжиниринга.
Вложения
Тип файла: zip crackme.zip (82.1 Кб, 12 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.06.2026, 13:19
Ответы с готовыми решениями:

Как написать keygen для crackme?
Здравствуйте форумчане.Решил написать keygen сразу предупреждаю добросовестного Модератора ,что...

Ошибка приложения в простом коде, реверс строки
Здравствуйте. Подскажите почему виндновс выдает сообшение об ошибке ? Тоесть компилятор...

Функция и реверс строки
1. Составить программу, которая реверсирует каждое слово строки str. 2. Написать и протестировать...

278
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
24.06.2026, 17:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Royal_X Посмотреть сообщение
Если пароля в программе нет, а там только его хеш, то разумеется я не смогу найти пароль (брутфорсить глупо).
Там нет никаких хешей
В чатике дискорд-сервера по реверсу это решили минут за 15-20
Миниатюры
Crackme: реверс-инжиниринг  
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
24.06.2026, 17:50
Цитата Сообщение от Royal_X Посмотреть сообщение
особенно если ты использовал готовые наработки
Никаких сторонних/готовых решений, просто полотно из __asm _emit в main функции на несколько экранов
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
24.06.2026, 18:11  [ТС]
Цитата Сообщение от Custos Посмотреть сообщение
Там нет никаких хешей
а как назвать то, что я привел? я же привел цепочку хеш-преобразований. Ты сам хоть смотрел в дизассемблерный листинг?
другой вопрос, если они добавлены лишь, чтобы запутать людей и они не имеют никакого отношения к настоящему решению - такой вариант я не исключаю

Добавлено через 2 минуты
Цитата Сообщение от Custos Посмотреть сообщение
Никаких сторонних/готовых решений, просто полотно из __asm _emit в main функции на несколько экранов
я писал слово "наработки", а не "сторонние/готовые решения", тем самым я не имел в виду, что ты использовал готовую библиотеку, а лишь намекал на то, что начитался всяких статей по реверсу и начал их реализовать в своем коде. Переписал из статьи или взял готовую библиотеку - имхо, разница невелика.
Цитата Сообщение от Custos Посмотреть сообщение
В чатике дискорд-сервера по реверсу это решили минут за 15-20
статей по реверсу, доступных в инете не так уж много. Так что, если крякми написан на основе какой статьи, то очевидно, что любой чел из этой области наверняка тоже ее читал и за свою жизнь десяток похожих крякми взломал

Цитата Сообщение от Custos Посмотреть сообщение
В чатике дискорд-сервера по реверсу это решили минут за 15-20
кинь тогда мой крякми Crackme: реверс-инжиниринг и пусть решают
если не смогут за 10-15 мин, значит они не те, кем прикидываются
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,119
Записей в блоге: 2
24.06.2026, 19:58
Цитата Сообщение от WhiteP Посмотреть сообщение
Да кучу всего можно впихнуть.
Когда советов много (пусть хороших) - они совершенно не ценятся, ну так уж устроен человек Пожуем только одну упомянутую Вами "фишку" - думаю ее вполне достаточно чтобы закрыть баловство с отладчиком. Как НЕ НАДО делать
C++
1
2
if (strcmp(txt, "Parol"))
 MessageBox("Invalid code");
Глупость подобного кода объяснить сложно. Видимо человек думать не хотел (не умел) и успокаивал себя тем самым "все равно сломают". Что не надо "светить" пароль уже разговор был. Упоминалось и strcmp. Но главная ошибка - очень легко зацепиться/выйти на код проверки. Дождался пока выскочит окно "Invalid code" и переключился в отладчик. Поднялся на пару вызовов по стеку - вот и проверка. Стартовый пост об этом ничего не говорит. Мол, запустили отладчик - ну он нам все и покажет. Во-первых, не гарантируется что все будет успешно дизассемблировано, а во-вторых, (и это главное) - будет показано столько что нереально понять где проверка. Сотни, скорее всего тысячи ф-ций, какая(ие) нужная? Осложнить жизнь начинающему пакостнику можно напр так
C++
1
emit do_check(txt);
При этом соединение с QueuedConnection, т.е. попадает сначала в очередь событий, потом извлекается и.т.д. Дальше в том же духе
C++
1
2
3
4
5
void do_check( QString txt )
{
  if (!check_main(txt))
   emit show_invalid();
}
C++
1
2
3
4
void show_invalid( void )
{
 MessageBox("Invalid code");
}
Да, остановиться в show_invalid он сможет. Но на стеке вызовов увидит что событие пришло из очереди. Но вот кто и когда его туда положил - поезд давно ушел. Заметим что выполнить строку "emit do_check" можно, ну что с того, какое-то событие попало в очередь, и все, проверка даже не началась

Можно ли это сломать? Конечно да, подменить одну из либ Qt, навесить фильтр и отследить все события (может даже сигналы) и.т.д. Но.. это совсем не то что слегка полазить в отладчике, заниматься этим любитель не будет. А будет - усилим ("у нас ножичков на всех хватит" )
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
24.06.2026, 20:53
Ну, мою прогу взломаете?
Миниатюры
Crackme: реверс-инжиниринг  
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
24.06.2026, 21:12
Ексешник:
Вложения
Тип файла: zip parol.zip (12.23 Мб, 7 просмотров)
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
24.06.2026, 22:44  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
Можно ли это сломать?
имхо, поиск пароля это лишь занятие ради фана. В реальной жизни хакеры обычно просто обходят защиту, а не ищут пароль, поскольку это намного проще.
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
24.06.2026, 23:30
Цитата Сообщение от Igor3D Посмотреть сообщение
Когда советов много (пусть хороших) - они совершенно не ценятся
Ну, много советов не просто так. Любой из них по отдельности обходится довольно просто. Нужно комбинировать.

Цитата Сообщение от Igor3D Посмотреть сообщение
emit do_check(txt);
Усложнит, но проверка текста как он есть без модификаций и запутывания control flow - плохая идея. Взломщик ищет введёный текст и ставит точку останова на чтение буфера в памяти, куда он прочитан. Далее трейсит и по стеку вызовов понимает примерно как и что работает с текстом. После ставит точечные брейкпоинты и в итоге выходит на то самое сравнение. Меняет jnz на jz или jmp - программа сломана битхаком. Я потому и писал про SPoC - это лучший подарок взломщику. Нужно протаскивать строку от буфера к буферу, от функции к функции асинхронно, менять при этом его части. Чтобы отслеживание потока выполнения, модифицирующего введенный текст, вызывала боль и желание бросить.

Цитата Сообщение от Royal_X Посмотреть сообщение
В реальной жизни хакеры обычно просто обходят защиту, а не ищут пароль
В целом, если защита действительно сложная, то скорее да. А вообще, во внутренней тусовке патчинг считается плохим тоном. Лучший взлом тот, что не модифицирует защитный механизм, по многим причинам (возможная применимость к обновленным версиям продукта, отсутствие внесения возможных деструктивных для функциональности изменений, юридический вопрос и т.д. и т.п.).
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
24.06.2026, 23:59  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
возможная применимость к обновленным версиям продукта
я в Cheat Engine когда-то делал AOB injection. Она по сигнатуре и очень часто устойчива к обновлениям
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
25.06.2026, 13:18  [ТС]
Цитата Сообщение от alexu_007 Посмотреть сообщение
мою прогу взломаете?
зависит от того, она адекватная или это прикол

сразу видно, что пароль сравнивается с хешем 12ED15FEABB873897DA403D84207398. В связи с этим у меня вопрос: действительно ли пароль находится в бинарнике или там только его хеш? В последнем случае - создай отдельную тему "Найдите исходное значение по его хешу", но уверен, что никто не станет тратить время на такое идиотское задание.

И объясни, что за крестики в качестве пароля на скриншоте? Не похожи на цифры...
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
25.06.2026, 16:21
Цитата Сообщение от Royal_X Посмотреть сообщение
зависит от того, она адекватная или это прикол
Так просят сломать, а не найти пароль
Ну за 2 минуты если, то вот: 0x12F3: 74 58 -> 90 90
Формируется нечто похожее на CRC, но с таблицей псевдослучайных чисел.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
25.06.2026, 17:44  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
Так просят сломать, а не найти пароль
Ну за 2 минуты если, то вот: 0x12F3: 74 58 -> 90 90
тогда можно сказать, что я взломал еще вчера за минуту)) менял только один опкод

0x00401ef3 74 -> 75 (т.е. je/jz поменял на jne/jnz)

Но по тому же способу можно и все остальные крякми решить из этой темы
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
25.06.2026, 17:51
Цитата Сообщение от Royal_X Посмотреть сообщение
0x00401ef3 74 -> 75 (т.е. je/jz поменял на jne/jnz)
Тогда правильный не примет)) Но зато 1 бит.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
25.06.2026, 17:56  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
Тогда правильный не примет))
верно, но если мои сомнения окажутся правдой - типа если в бинарнике нет пароля, а вычисляется хеш ввода пользователя, который потом сравнивается с 12ED15FEABB873897DA403D84207398 - вероятность, что угадаем пароль ничтожно мала)

Добавлено через 2 минуты
Цитата Сообщение от WhiteP Посмотреть сообщение
Но зато 1 бит
да, красиво получается

0111 0100 (74)
0111 0101 (75)

весь механизм защиты на одном бите держится

хотя, правильнее говорить, что изменили 1 байт (каждая из вышеперечисленных инструкций занимает именно байт).
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
25.06.2026, 18:19
Цитата Сообщение от Royal_X Посмотреть сообщение
весь механизм защиты на одном бите держится
Именно поэтому такой метод взлома и называется bithack, и является он следствием проблемы Single point of check (spoc), о которой я выше писал.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,119
Записей в блоге: 2
25.06.2026, 19:35
Цитата Сообщение от WhiteP Посмотреть сообщение
Взломщик ищет введёный текст и ставит точку останова на чтение буфера в памяти, куда он прочитан. Далее трейсит и по стеку вызовов понимает примерно как и что работает с текстом. После ставит точечные брейкпоинты и в итоге выходит на то самое сравнение. Меняет jnz на jz или jmp - программа сломана битхаком.
Не так резво, при QueuedConnection строка скопируется, и не раз (невзирая на имплисит шару). Но в целом замечание верное - нужно лишить гада возможности ловить чтение строки введенной юзером (ну или сделать это нестерпимым). Как это лучше реализовать? Просьба конкретнее, ясно что "можно по-всякому", но как? Спасибо

К тому же не раз видел такую штучку: на входе что-то типа strcmp выше, ну точно лох делал. Приложение запускается (вроде сломано), начинает что-то делать, и тут хирак - еще проверка, но уже без всяких месяг, калечит данные.
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
25.06.2026, 19:58
Цитата Сообщение от Igor3D Посмотреть сообщение
Как это лучше реализовать?
Копировать вручную, частями, преобразуя во что-то (ксором, иным шифрованием etc). Не работать с plain text введенным вообще. Сразу преобразовывать. Чтобы оригинальный текст как можно меньше времени лежал там, куда он был прочитан и как можно меньше времени в изначальном виде.
Чтение строки из буфера контрола в буфер приложения отловить всё равно можно. Можно, конечно, написать свою реализацию метода контрола, где после API ОС сразу модифицировать введенное и отдавать уже его, вплоть до использования системных вызовов напрямую. Но это не шибко усложнит задачу исследователю, но разработчику вполне.
Бывает, что вообще хукают нажатия клавиш, когда курсор в поле. И сразу же ксорят во внутренний буфер или сразу несколько. Тогда буфер контрола вообще не трогают, или используют как ханипотный путь.
Я не сильно вникал в кишки Qt, чтобы дать конкретный рецепт.

Цитата Сообщение от Igor3D Посмотреть сообщение
Приложение запускается (вроде сломано), начинает что-то делать, и тут хирак - еще проверка, но уже без всяких месяг, калечит данные.
Honeypot. Да, так и делают. Я про это писал, что проверки нужно делать неоднократно и лучше частями. По таймеру (в частности отрисовки анимации, чтобы не брякались на SetTimer), при вызове важных функций через раз. Если сделать 100 проверок, причем разных частей кода авторизации, разными нешаблонными способами (чтобы исследователь просто не написал матчинг регэкспом и не деактивировал их одним скриптом) - это утомит исследователя.
Опять же - НЕ ХРАНИТЬ флаг "всё ок" нигде. Так как просто этот флаг тогда и заменят (снова spoc). Лучшим вариантом, как я уже неоднократно писал - дешифровывать высчитанным из ключа ключом данные - лучше. Там просто непонятно на месте, всё ли ок.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
25.06.2026, 20:51  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
Я не сильно вникал в кишки Qt, чтобы дать конкретный рецепт.
Qt с динамической линковкой не самый лучший вариант. Не знаю, почему Igor3D заговорил о данной библиотеки.
Вообще динамическую линковку для Qt, wxWidgets и похожих библиотек не советую, поскольку исполняемый файл будет содержать таблицу импорта с именами необходимых функций. Учитывая это, всякие статические анализаторы очень качественно всё декомпилируют, в том числе, используя FLIRT и пр.

Лучше всего использовать статическую линковку со strip и с полным вырезанием всей отладочный инфы. Например, в программе на wxWidgets со статической линковкой анализатор в таблице импорта лишь покажет имена функций WinAPI, но не самой библиотеки wxWidgets.

Бесплатная опенсорсная лицензия не позволяет статическую линковку. К тому же, насчет Qt я вообще не уверен. Возможно, FLIRT способен даже в случае статической линковки Qt восстановить имена функций. Но вот wxWidgets точно не может.
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
25.06.2026, 21:33
Цитата Сообщение от Royal_X Посмотреть сообщение
исполняемый файл будет содержать таблицу импорта с именами необходимых функций. Учитывая это, всякие статические анализаторы очень качественно всё декомпилируют, в том числе, используя FLIRT и пр.
FLIRT не используется как таковой, если есть таблица импорта с именами. FLIRT как раз нужен для распознавания функций внутри кода, когда нет символьной информации вообще. Он по сути просто мэтчит паттерны библиотечных функций в коде и таким образом связывает их с именами. Он делает работу, обратную той, что делает линкер - тот видит имя, подставляет байты. FLIRT видит байты - подставляет имя.

Цитата Сообщение от Royal_X Посмотреть сообщение
Возможно, FLIRT способен даже в случае статической линковки Qt восстановить имена функций. Но вот wxWidgets точно не может.
Если даже нет сигнатур в базе FLIRT для некоторой версии, то реверсер сможет их создать на основании lib файла библиотеки через FLAIR SDK.

Но в целом, да - стрип-статика заставит исследователя потратить больше времени на анализ.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
25.06.2026, 21:50  [ТС]
WhiteP, ну, например, IDA не способна восстанавливать имена функций, да и сами функции в таком виде, в котором они были, для статик приложений на wxWidgets. IDA показывает всё в виде WinAPI функций - тех самых, которые под капотом используются в wxWidgets на винде (wxMSW). Это усложняет анализ кода. Результат декомпиляции выглядит запутаннее, чем даже когда изначально приложение пишется на чистом WinAPI. Например, IDA может показать, будто используется сотни функций из WinAPI, хотя ты разумеется использовал всего десяток функций из wxWidgets. В импортах вообще ни одного упоминания про wxWidgets, только нативные виндовые функции.

А вот я открыл приложение на Qt динамик - результат декомпиляции прям очень похож на исходный код, все имена на месте, сами функции тоже выглядят так, как в исходном сорце. Имхо, логику такого приложения очень легко можно понять.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.06.2026, 21:50

Реверс слов в строке
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int...

Реверс строки
Не могу написать программу которая перестанавливает символы в строке(abc->cba)

Реверс элементов массива
Надо поменять значения элементов массива в обратном порядке.Первый->последний,второй->предпоследний...

реверс строки
короче, у меня есть строка.. ее надо перевести наоборот. типа было ЛОХ стало ХОЛ вот как я...

Реверс масива по строках.
Задание: Поменять первую строку с последней, вторую с предпоследней и так далее. Я делаю вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
180
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru