Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330

Как спрятать строки внутри программы

01.09.2021, 19:36. Показов 7207. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть утилита которая вытаскивает все строки из exe-файла Strings, ну и естественно не одна она такая.

Может кто подскажет, как строки можно прятать или шифровать чтобы их невозможно было вытащить в чистом виде?

Простой пример:
C#
1
string password = "1234567890";
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.09.2021, 19:36
Ответы с готовыми решениями:

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

Как внутри exe спрятать другую программу - запакованную в zip-архив?
Нужно внутри программы, спрятать другую программу, и при определенных действиях - "распаковать" её в указанную папку. ...

Как спрятать иконку программы в панели задач?
Всем привет! Вот собственно проблема: Мне надо спрятать иконку программы в панели задач, так чтобы программа при этом работала! На форуме...

42
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14
01.09.2021, 20:04
1. Хешируете ваш пароль здесь.
2. В начале файла с кодом подключаете пространства имен System.Security.Cryptography и System.Text.
3. В публичном статическом классе пишете:
C#
1
        private static readonly SHA512Managed sha = new SHA512Managed();
4. В начале файла подключаете этот статический класс через using static <ProjectName>.<ClassName>;.
5. В месте проверки пароля пишете:
C#
1
2
3
4
if (BitConverter.ToString(sha.ComputeHash(Encoding.<TryDifferentEncodings>.GetBytes(input))).ToUpper() != <TextFromStep1>.ToUpper())
{
    Console.WriteLine("Неправильный пароль!");
}
В качестве кодировки в первую очередь попробуйте UTF8 и Unicode.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
01.09.2021, 20:06  [ТС]
Речь не о пароле, а о скрытие строк
string password лишь для примера.

Пусть это будет:
C#
1
string str = “https://cyberforum.ru”;
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14
01.09.2021, 20:16
Цитата Сообщение от Nalik Посмотреть сообщение
Речь не о пароле, а о скрытие строк
А для чего скрывать строку, кроме как чтобы нельзя было узнать пароль? Если чтобы просто использовать, то скрывать ее нет смысла, так как нет разницы - строку будет читать ваша программа или другая. Если ваша строка используется в преобразованном виде, и если это преобразование - не хэш, то кто захочет выполнить обратное преобразование и прочитать строку, тот сможет это сделать. Так что еще раз - для чего вам нужно скрыть эту строку?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
01.09.2021, 20:21
Nalik, если цель только в том чтобы скрыть строку от програм типа Strings, то зашифруйте её и храните в виде массива байтов. На этапе исполнения дешифруйте.

Если цель в другом, то озвучьте её чтобы можно было предложить подходящее решение.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
01.09.2021, 20:36  [ТС]
OwenGlendower, все верно, цель только в этом. Там нет никаких критических данных, просто есть некоторые строки которые не хотелось бы выставлять на всеобщее обозрение.

Добавлено через 38 секунд
OwenGlendower, я так понимаю все сводится к тому, чтобы просто не использовать тип string?)

Добавлено через 1 минуту
Etyuhibosecyu, хранить пароли в программе само по себе нельзя, нет смысла их хоть как-то шифровать внутри программы. Задача простая, я просто не хочу чтобы кто-то мог вытащить из вне ссылку на мой любимый форум

Добавлено через 1 минуту
Но при этом я хочу иметь возможность перейти на мой любимый форум по нажатию button допустим через Process.Start
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14
01.09.2021, 20:37
Цитата Сообщение от Nalik Посмотреть сообщение
хранить пароли в программе само по себе нельзя, нет смысла их хоть как-то шифровать внутри программы.
Хранить хэши паролей в программе можно! Хэширование - это не шифрование, оно необратимо, и если кто-то даже прочитает хэш, по нему нельзя будет восстановить пароль.
1
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
01.09.2021, 20:39  [ТС]
Etyuhibosecyu, обсуждение криптостойкости хешей заслуживает отдельной темы, здесь не об этом)
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14
01.09.2021, 21:06
Цитата Сообщение от Nalik Посмотреть сообщение
Задача простая, я просто не хочу чтобы кто-то мог вытащить из вне ссылку на мой любимый форум
Цитата Сообщение от Nalik Посмотреть сообщение
Но при этом я хочу иметь возможность перейти на мой любимый форум по нажатию button допустим через Process.Start
В таком случае единственным надежным методом является хранить эту ссылку на ASP.NET-сервере, со всеми вытекающими. Кроме того, чтобы к этому серверу не мог подключиться кто попало, нужно реализовывать симметричное, а затем и асимметричное шифрование, а также цифровую подпись для проверки, что подключается именно ваша программа (проверка аутентичности). Тогда единственным способом взломать будет вторгнуться на сервер, например, с помощью DDoS-атаки или других хакерских методов, но на хостингах есть разнообразные защиты от DDoS-атак. Тут уже все зависит от того, насколько дорога вам эта ссылка, в зависимости от этого и действуйте. И помните - абсолютной защиты в мире не существует! Если вас очень сильно захотят взломать, то вас взломают. И любая защита нужна для того, чтобы взлом стоил дороже, чем прибыль от него.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
01.09.2021, 21:20
Цитата Сообщение от Nalik Посмотреть сообщение
я так понимаю все сводится к тому, чтобы просто не использовать тип string?)
Все сводится к тому что мы не храним строку в открытом виде. Обойтись без string не получится, да и не нужно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Process.Start(new ProcessStartInfo()
{
    FileName = Decrypt(new byte[] {7, 86, 174, 95, 178, 184, 222, 201, 15, 43, 232, 251, 216, 130, 164, 136, 43, 124, 86, 154, 214, 49, 56, 140, 115, 151, 92, 130, 147, 148, 144, 195}),
    UseShellExecute = true
});
...
string Decrypt(byte[] bytes)
{
    using var alg = Aes.Create();
    alg.Key = new byte[32] { 247, 115, 139, 201, 106, 143, 48, 251, 189, 216, 161, 139, 200, 178, 101, 122, 214, 229, 146, 145, 20, 44, 180, 81, 137, 57, 71, 192, 28, 104, 95, 92 };
    alg.IV = new byte[16] { 13, 183, 24, 72, 84, 18, 123, 211, 34, 158, 138, 69, 242, 251, 176, 53 };
 
    using var mstream = new MemoryStream(bytes);
    using var csEncrypt = new CryptoStream(mstream, alg.CreateDecryptor(), CryptoStreamMode.Read);
    using var reader = new StreamReader(csEncrypt);
    return reader.ReadToEnd();
}
В коде зашифрована ссылка на этот форум. Вот как она будет выглядеть в файле (кодировка windows-1251)


Функция для шифрования

В коде эту функцию держать необязательно
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
byte[] Encrypt(string text)
{
    using var alg = Aes.Create();
    alg.Key = new byte[32] { 247, 115, 139, 201, 106, 143, 48, 251, 189, 216, 161, 139, 200, 178, 101, 122, 214, 229, 146, 145, 20, 44, 180, 81, 137, 57, 71, 192, 28, 104, 95, 92 };
    alg.IV = new byte[16] { 13, 183, 24, 72, 84, 18, 123, 211, 34, 158, 138, 69, 242, 251, 176, 53 };
    
    using var mstream = new MemoryStream();
    using var csEncrypt = new CryptoStream(mstream, alg.CreateEncryptor(), CryptoStreamMode.Write);
    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
    {
        swEncrypt.Write(text);
    }
    
    return mstream.ToArray();
}


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

Etyuhibosecyu, вы перемудрили
0
628 / 392 / 135
Регистрация: 06.03.2017
Сообщений: 1,469
01.09.2021, 21:39
берем ILSpy, указываем путь к программе, видим исходный код)
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
01.09.2021, 22:17  [ТС]
OwenGlendower, это вы предлагаете заранее зашифровать строки и в коде использовать уже зашифрованные строки и на ходу их расшифровывать?)

Добавлено через 18 секунд
Pilarentes, меня пока не интересуют вопросы декомпиляции )
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
01.09.2021, 22:19
Цитата Сообщение от Nalik Посмотреть сообщение
вы предлагаете заранее зашифровать строки и в коде использовать уже зашифрованные строки и на ходу их расшифровывать?
Именно так.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
01.09.2021, 22:29  [ТС]
OwenGlendower, наверное имеет смысл использовать это в связке с SecureString ? Чтобы из памяти не достали строку.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
01.09.2021, 22:38
Nalik, я не зря уточнял требования. Защита в памяти это уже совсем другое. И нет, SecureString тут не поможет потому что чтобы открыть браузер адрес должен быть в открытом виде.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
01.09.2021, 22:57
Цитата Сообщение от Nalik Посмотреть сообщение
меня пока не интересуют вопросы декомпиляции )
Тогда зачем все это вообще? Если человек заинтересовался внутренностями программы, то я бы ожидал в первую очередь декомпиляцию программы, а не мифическую утилиту которая только вытягивает string в виде константы (вообще первый раз слышу про такие).

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

Либо супер упоротый вариант:
- пишем либу с стартовым методом Main
- перегоняем в массив byte[] и шифруем.
- на запуске расшифровуем, подгружаем через Assembly.Load, через рефлексию вызываем Main.
- ...
- 8 упоротых сов из 16 возможных.
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
02.09.2021, 04:38  [ТС]
OwenGlendower, спасибо)
0
Эксперт .NET
 Аватар для Usaga
14301 / 9386 / 1353
Регистрация: 21.01.2016
Сообщений: 35,385
02.09.2021, 05:13
Nalik, ваша хотелка бесполезна и в принципе нереализуема. Ваше приложение в любом случае будет содержать код дешифрования строки и ключи (если таковые есть). Программы на .NET декомпилируются на раз-два. Код дешифрования воспроизводится во внешней утилите на три-четыре. Ваши строки на руках у человека.

Всякие "шифрования" строк помогут только от детей, которым всё равно в вашем приложении смотреть не на что. А того, кто реально заинтересуется, это не остановит.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
1. Хешируете ваш пароль здесь.
И что потом человек будет делать с этим хешем?))) Вы пробовали, при входе на киберфорум, хеш пароля передать сайту? Как, получилось войти?)
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
02.09.2021, 08:25
Цитата Сообщение от Usaga Посмотреть сообщение
Вы пробовали, при входе на киберфорум, хеш пароля передать сайту? Как, получилось войти?
Я понимаю что вы пытались сказать, но как раз на киберфорум получится войти имея только хеш пароля
0
Эксперт .NET
 Аватар для Usaga
14301 / 9386 / 1353
Регистрация: 21.01.2016
Сообщений: 35,385
02.09.2021, 08:28
OwenGlendower, что, серьёзно?) Но... зачем это было сделано?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2021, 08:28
Помогаю со студенческими работами здесь

Спрятать файл внутри другого файла без потери работоспособности обоих
Доброго времени суток господа!!!!!!!!!! Прошу вашей помощи... Передо мной стоит задача спрятать один файл (абсолютно любого типа)...

Как взять координаты внутри другой программы (самого окна). У меня берёт только позицию программы в экране
Есть код, который берёт координаты другой программы. Но он берёт позицию, где сама программа находится в моём экрана. А мне нужно, чтобы...

Спрятать IP от программы
Здравствуйте, у меня такой вопрос, может кто-нибудь поможет. Надо спрятать свой IP от программы, которая работает без интернета, но чтобы...

Спрятать исходник программы
Возможно ли такое? Есть программы чтоб отковырять исходник, а как защитить программу от них?

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru