Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/43: Рейтинг темы: голосов - 43, средняя оценка - 4.56
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9

Проверка защиты приложения [CrackMe]

03.11.2013, 21:44. Показов 9646. Ответов 47

Студворк — интернет-сервис помощи студентам
Привет всем
Вот решил попробовать написать небольшой CrackMe и параллельно изучить некоторые внутренности .NET'а

Задачи:
  • Основная: найти верный пароль. Пароль зашифрован, простейший обратимый алгоритм;
  • Второстепенная (но очень желательная): Получить исходники (IL или байт-код) двух зашифрованных методов (их найти несложно )

Особенности: не использовались какие-либо известные автоматизированные средства защиты, всё своими руками (в некоторой части именно руками, без автоматизации).

Уровень: вот честно, не знаю, ну давайте ниже среднего и выше простого

p.s. .NET 4
p.p.s. В любом случае расскажу что и как было сделано, но всё-таки хотелось бы увидеть какие-то попытки.

Вроде проверил на виртуалках, но есть шанс что не запустится
Вложения
Тип файла: rar crackme.rar (3.4 Кб, 24036 просмотров)
2
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2013, 21:44
Ответы с готовыми решениями:

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

Организация защиты приложения
пытаюсь организовать защиту приложения .. секции в web.config имеют вид: <authentication mode='Forms'> <forms name='AppAuth'...

Методы защиты от патча (кряка) приложения
Здравствуйте , какие хорошие методы существуют от патча (кряка) приложения на c# ? пробывал и reactor и appfuscator и AgileDotNet, вообщем...

47
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
05.11.2013, 16:18  [ТС]
Студворк — интернет-сервис помощи студентам
hepper, сами принципы работы очень хорошо описаны в открытом доступе (codeproject например), просто многие их не читали или не искали/не знали/не придали значения/прочие причины. Это интересует не так много людей, а люди ломающие защиты этот способ знают достаточно хорошо.
При допиливании этого способа можно принести неплохую головную боль людям со средними знаниями, я лишь дам пищу для дальнейших размышлений.

Ссылки на используемую литературу я приведу.
0
05.11.2013, 17:28

Не по теме:

Цитата Сообщение от NickoTin Посмотреть сообщение
При допиливании этого способа можно принести неплохую головную боль людям со средними знаниями
вот и опустили мою самооценку... :bye:

0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
05.11.2013, 20:56  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
вот и опустили мою самооценку...
Возможно я переборщил со средними знаниями. Результат будет зависеть от изобретательности программиста строившего защиту на этом способе. Есть средство которым можно перехватить код (к сожалению запустить его мне не удалось), судя по коду оно перехватывает метод еще на более низком уровне (ближе к моменту трансляции) используя сплайсинг (хук), но могу ошибаться.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.11.2013, 21:19
NickoTin, все что один человек сделал - другой сможет сломать. Вопрос усилий и времени. Даже супер-защищенная программа совершенно ничего не сможет сделать с методом терморектального криптоанализа.
0
05.11.2013, 23:07

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
Даже супер-защищенная программа совершенно ничего не сможет сделать с методом терморектального криптоанализа.
Грязь. Даже супер терморектальный криптоанализ ничего не сможет добиться от трупа - так что ваша логика не верна.

1
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
06.11.2013, 07:52
Цитата Сообщение от NickoTin Посмотреть сообщение
сами принципы работы очень хорошо описаны в открытом доступе (codeproject например),
насколько я помню там же есть обфускатор с исходниками (имя ща не помню) - так и не особо много на его основе появилось других, с иными способами обфускации, а на тот что в открытом доступе есть автодеобфускатор...

хотя я бы не отказался от способа защиты самоизменением кода, как тут использован.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
09.11.2013, 19:11  [ТС]
Лучший ответ Сообщение было отмечено как решение

Решение

Как и обещал: .NET: Разбор CrackMe и обзор некоторых моментов работы JIT'а
О ляпах/замечаниях пишите в ЛС или в комментариях блога.

P.S. Запись актуальна для вложения в 3-ем сообщении. Для вложения из 1-го сообщения есть незначительная разница в исходном коде
7
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.09.2016, 19:57
В общем, на работе в обед нечем было заняться (а тут как раз ссылочка была на эту статью).
За полчасика поддался первый метод:
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
public void 1()
{
    Console.WriteLine("Enter key:");
    byte[] bytes = Encoding.Unicode.GetBytes(Console.ReadLine());
    byte[] array = this.1("ר¬¡Ö\u009f\u009f\u0097ÿëé\u0084ú÷î\u0093çì÷Û\u00a0,X?')*56.-Q*XY\u00a0");
    if (bytes.Length != array.Length)
    {
        Console.WriteLine("Invalid key!");
        Console.ReadKey();
        return;
    }
    for (int i = 0; i < bytes.Length; i += 2)
    {
        bytes[i] = (byte)((int)bytes[i] ^ 58 + i);
    }
    int num = Math.Min(bytes.Length, array.Length);
    for (int j = 0; j < num; j++)
    {
        if (array[j] != bytes[j])
        {
            Console.WriteLine("Invalid key!");
            Console.ReadKey();
            return;
        }
    }
    Console.WriteLine("Success!");
    Console.ReadLine();
}
Второй чет не поддался, хотя вроде там метод декодирования тот же.

Но к сожалению обед кончился, мб в понедельник продолжим

Добавлено через 3 часа 22 минуты
Второй метод:
C#
1
2
3
4
5
6
7
8
9
private byte[] 1(string 1)
{
    byte[] bytes = Encoding.Unicode.GetBytes(1);
    for (int i = 0; i < bytes.Length; i += 2)
    {
        bytes[i] = (byte)((int)bytes[i] ^ 168 - i);
    }
    return bytes;
}
Патчер экзешника из третьего поста:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
 
namespace ConsoleApplication38
{
    class Program
    {
        static void Main(string[] args)
        {
            var asmBytes = File.ReadAllBytes("crackme.exe");
            var asm = Assembly.Load(asmBytes);
            foreach (var definedType in asm.DefinedTypes.Where(x => x.DeclaredMethods.Any(m => m.ReturnType == typeof(byte[]))))
            {
                foreach (var declaredMethod in definedType.DeclaredMethods)
                {
                    var methodBytes = declaredMethod.GetMethodBody().GetILAsByteArray();
                    var originalIndex = GetArrayOffset(asmBytes, methodBytes);
                    Decrypt(methodBytes);
                    Array.Copy(methodBytes, 0, asmBytes, originalIndex, methodBytes.Length);
                    Console.WriteLine(ToHex(methodBytes));
                    Console.WriteLine();
                }
            }
            File.WriteAllBytes("crackme-fixed.exe", asmBytes);
        }
        private static string ToHex(byte[] buff)
        {
            var sb = new StringBuilder();
 
            for (int i = 0; i < buff.Length; i++)
            {
                sb.AppendFormat("{0:X2} ", buff[i]);
            }
 
            return sb.ToString();
        }
        static void Decrypt(byte[] bytes)
        {
            if (bytes[0] == 0xff)
            {
                switch (bytes[1])
                {
                    case 0x2:
                        bytes[0] = 0x28;
                        bytes[1] = 0x1F;
                        break;
 
                    case 0xA:
                        bytes[0] = 0x72;
                        bytes[1] = 0x1;
                        break;
 
                    default:
                        throw new ExecutionEngineException();
                }
                for (uint k = 2; k < bytes.Length; k++)
                {
                    bytes[k] = (byte)(bytes[k] ^ (bytes.Length + k));
                }
            }
        }
 
        private static int GetArrayOffset(byte[] source, byte[] pattern, int offset = 0)
        {
            int i;
            for (i = offset; i < source.Length; i++)
            {
                int j;
                for (j = 0; j < pattern.Length && i + j < source.Length; j++)
                {
                    if (source[i + j] != pattern[j])
                        break;
                }
                if (j == pattern.Length)
                    return i;
            }
            return -1;
        }
    }
}
Расшивка дальше в целом тоже понятна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.09.2016, 19:57

Проверка защиты
Хочу узнать защиту моего софта написал проект и скинул туда код анти дебагера и проверки хеша кода с основного моего проекта стоит...

Обход защиты декомпиляции приложения
Всем привет. В общем проблема. Пытался декомпилировать приложение одно, но, судя по всему, стоит какая-то защита от декомпиляции. Сам...

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

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

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


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

Или воспользуйтесь поиском по форуму:
48
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru