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

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

18.06.2026, 13:19. Показов 23456. Ответов 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
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
25.06.2026, 21:58
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Royal_X Посмотреть сообщение
IDA не способен восстанавливать имена функций, да и сами функции в таком виде, в котором они были, для статик приложений на wxWidgets.
Royal_X, это означает лишь то, что в стандартной базе сигнатур FLIRT той версии IDA, что ты используешь, нет сигнатур для той версии wxWidgets, с которой ты статически слинковал приложение. Нужно лишь натравить парсеру FLAIR lib-библиотеку, создав pat-файл. После передать pat-файл sigmake, чтобы создать файл сигнатур sig (разрешив возможные коллизии). После в IDA по Shift+F5 подгрузить созданную базу сигнатур.

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

конечно, если использовать wxWidgets динамик, то там имена будут в таблице импорта.

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

Если нужно написать приложение с более-менее норм. защитой, то либо нужно делать как Custos - писать аналоги WinAPI функций, либо брать такой фреймворк, который плохо анализируется.
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
25.06.2026, 22:48
Цитата Сообщение от Royal_X Посмотреть сообщение
wxWidgets существуют или что могут существовать, поскольку данная библиотека знаменита именно тем, что по сути является оберткой над нативными функциями WinAPI (речь идет о версии wxMSW)
По большому счету Qt тоже является оберткой над нативными функциями (всё, что касается стандартной функциональности ОС). Просто ты не видишь их вызовы, так как декомпилируешь сам бинарник, а не DLL и видишь только вызов через IAT. Если статику собрать с Qt, то там будет такая же фигня, что и wxWidgets.

Цитата Сообщение от Royal_X Посмотреть сообщение
что такие сигнатуры для wxWidgets существуют или что могут существовать
Я ж говорю - скармливаешь lib-файл той версии что нужно (собранной тем же компилятором, что и в приложении) утилитам создания сигнатур из комплекта IDA и применяешь. Сам, для себя.

Цитата Сообщение от Royal_X Посмотреть сообщение
Соответственно, этот FLIRT распознает как функции WinAPI, а не wxWidgets.
FLIRT тут вообще не работает, раз нет сигнатур. IDA просто видит функции WinAPI в импорте и по ним опознаёт имена вызовов внутри функций wxWidgets (sub_xxxx). Если статику Qt прилинковать - там то же самое будет. Но если создать сигнатуры, то все эти sub_xxxx превратятся в имена из библиотеки.

Цитата Сообщение от Royal_X Посмотреть сообщение
бесплатная версия разрешает только динамическую линковку, а там все функции как на ладони.
Ну почему же. Можно собрать из исходников статику и линковать. Вот только исходники своего приложения надо будет открыть, что как бы исключает необходимость защиты))
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,586
25.06.2026, 23:07  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
По большому счету Qt тоже является оберткой над нативными функциями.
В Qt, разумеется, тоже есть вызовы нативных функций, но там также очень много своего собственного кода.
К тому же, библа очень популярна и в центре внимания всяких программ, типа IDA. Так что, анализ Qt приложений все равно проще, чем приложений на менее популярных либах.

Цитата Сообщение от WhiteP Посмотреть сообщение
скармливаешь lib-файл той версии что нужно (собранной тем же компилятором, что и в приложении) утилитам создания сигнатур из комплекта IDA и применяешь
идея понятна, но у меня .a файлы, поскольку юзал gcc (хотя, это ничего не меняет - вместо plb.exe можно использовать pelf.exe)

Как оно будет на практике - неизвестно. Никогда не использовал эти инструменты, в том числе sigmake.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
25.06.2026, 23:45
Цитата Сообщение от WhiteP Посмотреть сообщение
Так просят сломать, а не найти пароль
Ну за 2 минуты если, то вот: 0x12F3: 74 58 -> 90 90
Формируется нечто похожее на CRC, но с таблицей псевдослучайных чисел.
Совершенно верно, все так и есть. Респект.

Добавлено через 13 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
верно, но если мои сомнения окажутся правдой - типа если в бинарнике нет пароля, а вычисляется хеш ввода пользователя, который потом сравнивается с 12ED15FEABB873897DA403D84207398 - вероятность, что угадаем пароль ничтожно мала)
И это верно. Пароля в бинарнике нет. Хеш я вычислил самый примитивный - "почти" crc32, только заменил числа в таблице случайными числами, что-бы по введённому хешу никто в инете не нашел пароль - crc все-таки нестандартный. А так как crc32 всего 32 бита, я взял его 4 раза с разными случайными таблицами. Я не математик, возможно из такого хеша средствами математики можно вытащить исходный пароль - не знаю. Но мне кажется, что нет. Ну вот вам исходник моей проги, может кому пригодится:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// кнопка 1
// пароль 1234_4231
void Widget::press_pbtn_01()
{
    QString str;
 
    QRandomGenerator gnr;
    gnr.seed(21);
 
    quint32 CRC35Table[256];
 
    str = ui->lineEdit->text();
    QByteArray btr = str.toUtf8();
 
    const quint32 sz = btr.size();
    quint32 crc35 = 0xffffffff;
 
    str = "";
 
    QString str1 = "12ED15FEABB873897DA403D84207398";
    QString str2 = "";
 
 
    for(quint32 j = 0; j < 4; j++)
    {
        CRC35Table[0] = 0;
 
        for(quint32 i = 1; i < 256; i++)
        {
            CRC35Table[i] = gnr.generate();
        }
 
        for(quint32 i = 0; i < sz; ++i)
        {
            crc35 = (crc35 >> 8) ^ CRC35Table[(crc35 ^ btr.at(i)) & 0xff];
        }
 
        crc35 ^= 0xffffffff;
        str2 += QString::number(crc35, 16).toUpper();
    }
 
 
    //ui->lineEdit->setText(str2);
 
    if(str1 == str2) str = "Password OK!";
    ui->label_01->setText(str);
}
Добавлено через 9 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
весь механизм защиты на одном бите держится
Наверное это справедливо для любых приложений. Сколько бы ни было ухищрений, все равно дело кончится выбором je - jne, программа либо начнет выполняться (пароль правильный), либо нет. Нужно только этот байт найти. Я его, кстати, никак не прятал - поскольку не умею.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,586
26.06.2026, 00:09  [ТС]
Цитата Сообщение от alexu_007 Посмотреть сообщение
И это верно. Пароля в бинарнике нет.
Когда ты выложил своё приложение, я думал, что нужно пароль найти, поскольку до этого в этой теме шло обсуждение касательно поиска пароля в различных крякми без обхода проверки. И когда ты написал "мою прогу взломаете", я подумал, что в твоем приложении тоже нужно пароль искать. Но собственно посмотрев дизассемблерный листинг твоего приложения, сразу начал подозревать, что там пароля нет, а только хеш, а стало быть найти пароль это невыполнимая задача (если не учесть брутфорс).
Ну а менять опкод, чтобы вывести текст - это настолько банальная задача, что мне даже в голову не пришло, что ты мог ради этого написать целое приложение и потом попросить, чтобы другие его "взломали" таким образом.

Добавлено через 4 минуты
Цитата Сообщение от alexu_007 Посмотреть сообщение
Хеш я вычислил самый примитивный - "почти" crc32, только заменил числа в таблице случайными числами, что-бы по введённому хешу никто в инете не нашел пароль - crc все-таки нестандартный.
Имхо, брать такую bloated либу как Qt, чтобы потом лисапедить, как-то сомнительно. Есть же там класс QCryptographicHash, который поддерживает более двух десятков алгоритмов вычисления хеш-суммы.
Ну или на крайний использовать std::hash<std::basic_string>
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
26.06.2026, 00:42
Цитата Сообщение от alexu_007 Посмотреть сообщение
Наверное это справедливо для любых приложений.
Не для любых. Сообщество давно пришло к сбалансированному компромисному варианту. Я приводил примеры в этом сообщении несколько дней назад. Единого устоявшегося названия для этого так и не появилось. Кратко это обычно называют "сесионными исполняемыми файлами".
Подход имеет свои ограничения и недостатки, которые в основном касаются цикла разработки и поддержки. Но результат того стоит.
Даже не самые лучшие реализации этого подхода доставляют крякерам достаточно много боли и страданий.
Для примера, система лицензирования 99% читов с большой аудиторией для популярных AAA игр построена именно на сесионных бинарниках.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,586
26.06.2026, 01:07  [ТС]
Цитата Сообщение от Custos Посмотреть сообщение
доставляют крякерам достаточно много боли и страданий
но все равно же взламываются. И если "крякеры" из того форума взламывали за несколько дней, то представь, как мало времени понадобится настоящим экспертам, которые работают в престижных организациях и гребут лямы лопатой.
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
26.06.2026, 01:16
Цитата Сообщение от Royal_X Посмотреть сообщение
но все равно же взламываются. И если "крякеры" из того форума взламывали за несколько дней
Автор одного из тех постов - один из опытнейших реверсеров того форума. Ломал он не самую лучшую реализацию этого метода лицензирования (насколько я помню, он даже в самом посте перечислял чего там не хватает, что могло бы быть).
Часть механизмов он так и не разобрал. Также особенность при кряке этой системы лицензирования - ты никогда не знаешь все ли ты пропатчил. Там в "уголку" мог затаится какой-то функционал, который вызывается, условно, раз в месяц. Проблема похоже на ту, которая возникала при кряке софта накрытого ныне почившим протектором Armadillo с наномитами.
Кряк может запускаться, но через пару минут/часов падать, соответственно нормально пользоваться таким софтом не получится (особенно если это игра или рабочий софт).
Также кряк не обязан падать. Если, к примеру, это какой-то сложный рабочий софт, он может не падать, а просто начать делать неправильные вычисления. И ты попробуй это проверить и отличить какие какие из констант завязаны на сесионные данные, а какие относятся к предметной области.
И там еще огромное полотно таких пунктиков.
С возрастанием сложности защищаемого приложения сложность отлома растет фактически в геометрической прогрессии, особенно если ты защищаешь любой софт, предметная область которого связана с огромным количеством критически важных вычислений.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,586
26.06.2026, 01:31  [ТС]
Цитата Сообщение от Custos
один из опытнейших реверсеров того форума.
Ну я его лично не знаю, поэтому промолчу. Но когда-то я словил некого "эксперта" на русскоязычном форуме, который просто воровал статьи из англоязычного форума. Причем, он немного упрощал и писал на каком-то гопническом языке, чтобы прикинуться матерым хакером.

Но то, что испортили все мультиплеерные игры, это факт. Одни создают читы, другие взламывают читы, третьи используют читы.
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
26.06.2026, 01:42
Цитата Сообщение от Royal_X Посмотреть сообщение
другие взламывают читы
Для "живых" популярных AAA игр это практически бесполезное занятие, только если ради фана и прокачки своего скила.
Проблема в том, что такие игры постоянно обновляются и читы обновляются вслед за ними. Пока ты за пару недель доломаешь даже самый криво защищенный чит, игра успеет получить пару обновлений и твой кряк чита станет неактуальным. В лучшем случае он просто не будет работать. В худшем - кроме того, что чит не работает, дак ты еще и успеешь отлететь в бан в игре, так как старый чит уже начал обнаруживаться античитом игры.
Поэтому коммерческий смысл в этом околонулевой.

Добавлено через 5 минут
Цитата Сообщение от Custos Посмотреть сообщение
И там еще огромное полотно таких пунктиков.
Забыл еще упомянуть, что кряк такой системы лицензирования может оказаться финансово очень затратным еще на этапе попыток исследования лоадера.
Любой детект попыток дебажить лоадер - ты лишаешься лицензии на софт и на этом твои попытки кряка заканчиваются. Если, конечно, у крякера не бездонный кошелек, чтобы покупать новую лицензию при каждой своей ошибке.
Это, кстати, один из важных пунктов, почему стал возможен кряк читов из тех постов, что я кидал. Там не банили лицензию за попытки дебага.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,586
26.06.2026, 01:54  [ТС]
Custos, а что думаешь о читах, которые не вмешиваются в саму игру? Имею в виду программы, которые берут управление курсором, кнопками мыши и пр. на себя. Их же античит не сможет выявить.

Например, программа, которая анализирует картинку в игре, находит там врагов и направляет прицел на них и стреляет.
Мне кажется, современные ПК способны быстро анализировать игровые кадры, чтобы распознавать врагов
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
26.06.2026, 02:04
Цитата Сообщение от Royal_X Посмотреть сообщение
Custos, а что думаешь о читах, которые не вмешиваются в саму игру? Имею в виду программы, которые берут управление курсором, кнопками мыши и пр. на себя. Их же античит не сможет выявить.
Тема "аппаратных" читов ушла вперед. Это сейчас называется условно DMA (Direct Memory Access) читы. Чит, запущенный на стороннем оборудовании, через DMA карту непосредственно манипулирует данными в оперативке ПК, на котором запущена игра. Для этого надо покупать дополнительное оборудование, в целом не самое дешевое решение.
Но даже с таким борются, хоть и с переменным успехом.
Как пример из недавнего - https://x.com/riotgames/status/2057604027941302564
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
26.06.2026, 06:18
Цитата Сообщение от Royal_X Посмотреть сообщение
Имхо, брать такую bloated либу как Qt, чтобы потом лисапедить, как-то сомнительно. Есть же там класс QCryptographicHash, который поддерживает более двух десятков алгоритмов вычисления хеш-суммы.
В этом и смысл - придумать что-то своё, нестандартное. Откуда мне знать, может результаты работы обеих десятков алгоритмов QCryptographicHash на популярные пароли давно лежат в сети. Мои - точно нет. И если пароль будет достаточно длинный - подобрать его перебором будет практически никак.

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

Что касается "bloated либы Qt" - я все программы пишу на ней. Не люблю консоли.
0
-610 / 37 / 0
Регистрация: 10.03.2025
Сообщений: 517
26.06.2026, 06:29
Написали бы скрипт на ассемблере лучше для работы с памятью, например на моем слабом ноуте на кедах , периодически
виснет рабочий стол, даже при отсутствии запущенных приложений, мне нравятся кеды за функционал, но
этот артефакт бесит просто...хотелось бы фундаментально разобраться в чем дело, вот на LXQt не виснет
значит ядро Linux не причем, но винде 10 такого явления нет, значит дело все таки в принципах управления
памятью на линуксе, а взламывать пароли конечно прикольно, но эта проблема более интересна
найти корень зла в управлении памяти.

Щас модер спустит на меня Полкана...стопудофф!

Помнится я WinBoard (это шахматная оболочка для запуска шахматных движков) запихивал в RAM для скорости и эта идея мне нравится,
активное приложение уходит в RAM максимально, вытесняя все другие, кроме системных, обычно тормоза начинаются когда из 1,9 Гига ОЗУ занято 1,3
но это же моветон, а где еще 0,6, что то здесь не так, но мне не хватает теоретических знаний
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,586
26.06.2026, 09:37  [ТС]
Цитата Сообщение от alexu_007 Посмотреть сообщение
Откуда мне знать, может результаты работы обеих десятков алгоритмов QCryptographicHash на популярные пароли давно лежат в сети.
Вообще, для такого рода приложений, как у тебя, лучше использовать PBKDF2 (HMAC_SHA512 или HMAC-SHA256). HMAC-SHA512 чуть медленнее атакуется брутфорсом.
Добавлять еще сверху какой-то, например, SHA-256 не нужно!
PBKDF2 внутри уже использует SHA-256 / SHA512 как псевдослучайную функцию и возвращает хеш. PBKDF2 из пароля может сгенерировать ключ, например, на 32 байта (256 бит), в виде hex-строки это 64 символа. Длина выходного ключа не зависит от выбора HMAC-функции. Т.е. даже если выберешь PBKDF2 HMAC-SHA512, то без проблем можешь сгенерировать свой 32-байтный ключ.

На вход PBKDF2 получает следующие аргументы:
- твой пароль, который может быть какой угодно длины. Допустим, "1234_4231"
- рандомная соль, например, на 16 байт
- целое число, определяющее количество итераций. Как минимум, 100 тыс. Но в 2026 году, имхо, нужно 300 - 500 тыс. итераций, что соответствует 300-500 мс на современных устройствах.
- длина выходного ключа - можно указать любую длину, но обычно используют 16, 24 или 32 байта, что соответствует AES-128, AES-192, AES-256. Упоминаю разновидности AES, поскольку чаще всего PBKDF2 используют для последующей работы с AES.

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

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

***
А чтобы крякеры не обошли проверку пароля, то вместо "Password OK!", сделал бы иначе.

Сгенерированный результат PBKDF2 служил бы в качестве ключа для AES. Например, если был использован PBKDF2 для получения 32-байтного ключа из пароля, то потом этот же ключ отправил бы в AES-256, который должен расшифровать сообщение при успешном сценарии.

В таком случае,

- даже самый банальный пароль типа "1234_4231" сложно было бы взломать. По моим меркам, даже на RTX 5090 будет где-то 30к проверок в секунду при использовании PBKDF2 с 500к итерациями. Даже если бы ты прямо сказал, что пароль состоит только из цифр и нижнего подчеркивания, то это 6 суток. Но вот если брутфорсили бы по ASCII-символам, то 950 000 лет.

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

- обойти проверку пароля невозможно. Вернее, проверку убрать можно, но все равно крякер не получит сообщение, ибо не сможет его расшифровать.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,118
Записей в блоге: 2
27.06.2026, 00:50
Цитата Сообщение от Royal_X Посмотреть сообщение
Вообще динамическую линковку для Qt, wxWidgets и похожих библиотек не советую, поскольку исполняемый файл будет содержать таблицу импорта с именами необходимых функций.
Цитата Сообщение от Royal_X Посмотреть сообщение
Лучше всего использовать статическую линковку
Данная защита - довольно скромная задача на которую обычно дается пару дней. Ликовать статически (в угоду защите) никто не будет, не говоря уже о замене другим фреймворком/либой (вместо Qt). И про кроссплатформенность не забываем
Цитата Сообщение от WhiteP Посмотреть сообщение
Копировать вручную, частями, преобразуя во что-то..
Я не сильно вникал в кишки Qt, чтобы дать конкретный рецепт.
Ну хорошо, используем тот же метод
C++
1
2
3
4
5
QString password = edit->text();
for (auto ch : password)
 emit pass_char((UInt32) ch); 
 
emit do_password();
Цитата Сообщение от Royal_X Посмотреть сообщение
А вот я открыл приложение на Qt динамик - результат декомпиляции прям очень похож на исходный код, все имена на месте, сами функции тоже выглядят так, как в исходном сорце. Имхо, логику такого приложения очень легко можно понять.
Предлагается прогонять код через событийный цикл, это можно делать с Qt или без, любое UI сейчас "event-driven". Напр на голом WinAPI использовать PostMessage. Скрыть его вызов затруднительно, вероятно идея будет быстро понята (и это плохо). Ну ладно, мне интересно как же добраться до кода проверки

Не по теме:

Интересная задачка: "закодировать" строку так чтобы не сработал останов отладчика по чтению памяти :) Должны быть наработанные решения, подскажите

0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
27.06.2026, 05:58
Цитата Сообщение от Royal_X Посмотреть сообщение
Вообще, для такого рода приложений, как у тебя, лучше использовать PBKDF2 (HMAC_SHA512 или HMAC-SHA256).
Нафига мне все это, если я за час написал свой код, который делает практически то же самое?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,586
27.06.2026, 08:41  [ТС]
Igor3D, wxWidgets имеет хорошую лицензию и разрешает статическую линковку. Данная библиотека тоже кроссплатформенная. В wxWidgets есть аналог сигналов/слотов - события и обработчики событий.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,586
27.06.2026, 10:31  [ТС]
Igor3D, ты вот так хотел (приложение во вложении)?



Делал точно по твоему псевдокоду. Использовал события как аналог системы сигналов/слотов.
Вывод символов и текста "Password submitted" сделано лишь для показа работы, но в реальном приложении это делать не нужно.

wxWidgets / статическая линковка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifdef WX_PRECOMP
#include "wx_pch.h"
#endif
 
#include "CrackMeMain.h"
 
wxDEFINE_EVENT(EVT_PASS_CHAR, wxCommandEvent);
wxDEFINE_EVENT(EVT_DO_PASSWORD, wxCommandEvent);
 
CrackMeFrame::CrackMeFrame(wxFrame *frame)
    : GUIFrame(frame)
{
    Bind(EVT_PASS_CHAR,    &CrackMeFrame::OnPassChar,    this);
    Bind(EVT_DO_PASSWORD,  &CrackMeFrame::OnDoPassword,  this);
}
 
CrackMeFrame::~CrackMeFrame()
{
}
 
void CrackMeFrame::OnClose(wxCloseEvent &event)
{
    Destroy();
}
 
void CrackMeFrame::m_buttonOnButtonClick(wxCommandEvent &event)
{
    m_textCtrl2->Clear();
    wxString password = m_textCtrl->GetValue();
    for (wxUniChar ch : password)
    {
        wxCommandEvent evt(EVT_PASS_CHAR);
        evt.SetInt(static_cast<int>(ch.GetValue()));  // передаём Unicode code point
        wxPostEvent(this, evt);   // асинхронно (как Qt::QueuedConnection)
        // или: ProcessEvent(evt) — синхронно (как Qt::DirectConnection)
    }
    wxCommandEvent doneEvt(EVT_DO_PASSWORD);
    wxPostEvent(this, doneEvt);
}
 
void CrackMeFrame::OnPassChar(wxCommandEvent &event)
{
    wxUint32 code = static_cast<wxUint32>(event.GetInt());
    wxUniChar ch(code);
    // обработка символа...
    m_textCtrl2->AppendText(wxString::Format("%c (U+%04X)\n", (wchar_t)ch, code));
}
 
void CrackMeFrame::OnDoPassword(wxCommandEvent &event)
{
    // проверка пароля...
    m_textCtrl2->AppendText("\nPassword submitted");
}
Вложения
Тип файла: zip CrackMe.zip (2.74 Мб, 0 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.06.2026, 10:31

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
200
Ответ Создать тему
Новые блоги и статьи
сукцессия 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`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru