|
186 / 37 / 3
Регистрация: 28.05.2015
Сообщений: 149
|
|
| 27.02.2017, 13:32 | |
|
Сохранение данных в EXE-файле с использованием хеша SHA-2 (256) и шифрованием Blowfish.
Исправил некоторые недоработки программы из темы. Описание: Кликните здесь для просмотра всего текста
Суть: Есть некий интернет-ресурс. Для того, чтобы воспользоваться этим ресурсом, помимо входного пароля, необходимо ввести значения из так называемой SC-карты. (Security Card). Карта представляет из себя таблицу, в которой 50 ячеек. А в каждой ячейке 4-х значное число. Эта карта выдаётся 1 раз на почту. Откуда её сразу рекомендуют распечатать и удалить с почты. Запрос интернет-ресурса звучит так: "введите первые две цифры из ячейки 38 и вторые две цифры из ячейки 18". Номера запрашиваемых ячеек выбираются случайным образом. Всё.
Сама задача лёгкая. Но я, как обычно, заморочился безопасностью хранимых данных... В итоге реализовал таким образом: Во-первых, я применил разработку The trick о сохранении данных в самом exe-файле программы. Во-вторых, использовал SHA-2 (256) + шифрование по алгоритму Blowfish Брюса Шнайера 16 раундов, т.к. 8 раундов можно взломать подобрав "плохие" ключи, при которых содержимое S и P-блоков будут равны. Алгоритмы SHA-2 (256) и BlowFish реализованы в отдельных модулях. API использовать не стал специально. В программе имеется одна длинная строка-шаблон, которая обрабатывается и сохраняется. Например: #Auth^^OldPass...^^NewPass...^^UserName. ..^^ShotcutParam...#Data... Данная строка это шаблон. Троеточия заменяются данными от пользователя. Например: #Auth^^OldPassPass_1^^NewPassPass_2^^UserNameWinUserName^^ShotcutParamCharly#Data3478238945873276... Конечная секция #Data хранит в себе числа из всех 50-и ячеек. То есть в сумме будет 50*4 = 200 чисел после #Data. Запуск осуществляется с Sub Main. Такая строка помещается в строковую переменную Converted и "зашивается" в программу. А точнее в ресурсы программы, как писал The trick. Теперь алгоритм работы: 1.) Если при запуске программы Converted пустой, значит это первый запуск, а значит открываем форму и запрашиваем пароль(для открытия программы в будущем), имя пользователя(при другом имени Windows-пользователя программа не запустится) и параметр ярлыка(для удобства открытия программы в режиме чтения при помощи горячих клавиш). 2.) После форма закрывается и выполняются следующие действия, идентифицирующие уникальность данного компьютера: а.) Определяем логический диск, с которого запущено приложение (Left$(App.Path,3)); б.) Определяем какому физическому диску принадлежит логический диск, с которого запущено приложение; в.) Передаём номер физического диска процедуре, определяющей ID модели, Serial Number и Firmware number физического жёсткого диска. Эти 3 значения объединяю в одну строку. Например, мой HDD выглядит так: HGST HTS541010A9E680 JD1009DM2Y9EAK JA0OA7J0. 3.) Берётся хеш SHA-2 (256) из HGSTHTS541010A9E680JD1009DM2Y9EAKJA0OA7J 0 и получается 9d70066af4bebb6eb8d30223445ba1f9f9110c45 d5c94f15d29f845595f596da. Но из этой строки мы берём первые 56 символов, т.к. Брюс Шнайер говорил, что длина ключа может быть очень большой, но криптоанализ показал, что не стоит превышать значение 448 бит или 56 байт. Поэтому в алгоритме Blowfish сделано ограничение на 56 байт ключа. Так что я обрезаю 64-байтную строку SHA-2 до 56 символов. И 9d70066af4bebb6eb8d30223445ba1f9f9110c45 d5c94f15d29f8455 будет являтся ключом к шифрованию нашей строки #Auth^^OldPassPass_1^^NewPassPass_2^^Use rNameWinUserName^^ShotcutParamCharly#Dat a3478238945873276... Другими словами, данный ключ будет уникальным для каждого компьютера. SHA сделано специально, чтобы нельзя было в явном виде посмотреть данные HDD. После шифрования получается строка в виде Unicode-последовательности, которая преобразуется в длиннющий HEX-вид. 3.) Пользователь заново открывает программу. Либо через ярлык, в свойствах которого написано то, что было введено в поле ShotcutParam. Либо открывает непосредственно сам EXE-файл и вводит пароль. Причём, если он открывает программу через ярлык, то в целях защиты я сделал демо-режим, при котором можно только считывать данные, но посмотреть на таблицу целиком будет нельзя. Можно только задать значения и получить результат. Результат в виде 4-х значного числа помещается в буфер обмена. Если EXE открывается с паролем, то можно и таблицу смотреть, и новый пароль править. Очень важно то, что если вдруг неправильно введено имя пользователя, то программа просто не запустится, т.к. вся проверка идёт из Sub Main. И форма не появится, пока не будет пройдена проверка. И, если человек не может взломать программу через отладчик, то данные он свои потеряет. Ни я, никто другой не сможет их восстановить. Не знаю, поможет ли дизассемблер с шифрованными данными. В отладчике я смог увидеть длинную зашифрованную строку, но это ничего не даст, т.к. необходимо будет каким-то образом определить ключ, который невозможно будет подобрать в обозримом будущем, либо напрямую взламывать шифровку, что за более чем 10 лет никому ещё не удалось. А для того, чтобы невозможно было вычислить серийный номер, он захеширован. Конечно расшифровка произойдёт с любым ключом(любым HDD), но текст будет бессмыслицей. В общем, вот само приложение. Так как модулей много, не стал выкладывать их в это сообщение, а выложу только проект с чистым EXE-файлом. В программе можно легко изменить содержимое сохраняемого Converted на свою структуру. The trick говорил, что можно сохранить в себя всё что угодно. Но я так и не понял как сохранять массивы, а потом считывать массивы, поэтому пришлось работать с одной строкой. Хотя в данной программе было бы удобнее использовать Arr(0) для #Auth, а Arr(1) для #Data. Программа тестировалась на Win7 x64 и WinXP SP2 x32. На виртуальной машине VmWare работать не будет, т.к. серийник HDD там не определяется. На других ОС не тестировал, т.к. программа написана прежде всего для самого себя, а сижу в Win7 x64. Если кто знает, как можно достать зашифрованные данные, буду раз, если поделитесь знаниями. Замечание: в IDE нельзя полностью проверить код, т.к. самозапись не произведётся во временный exe-файл, который создаётся на время отладки средой IDE.
4
|
|
| 27.02.2017, 13:32 | |
|
Ответы с готовыми решениями:
360
Коды на Visual Basic Вывод решения вместо Immediate в textbox (visual basic 6.0) |
|
oh my god
|
|
| 01.05.2017, 17:07 | |
|
2
|
|
|
|
|||||||||||||||||||||
| 24.06.2017, 23:43 [ТС] | |||||||||||||||||||||
Сообщение было отмечено Catstail как решение
Решение
Регулярные выражения: обёртка для PCRE2 и VBScript.Regexp
Создано: Polshyn Stanislav (Dragokas) и Jason Peter Brown (jpbro) при поддержке Tanner_H, oumba, DEXWERX, dilettante (vbforums.com) PCRE2 - это мощная библиотека регулярных выражений, которая работает очень быстро и поддерживает Perl-совместимый синтаксис регулярок, который более шире, чем включённый в VBScript.Regexp. Вы можете использовать оригинальную обёртку над PCRE2, написанную Jason Peter Brown: https://github.com/jpbro/VbPcre2 Также мною написана прокси-обёртка, основанная на коде от Jason, которая полностью имитирует объектную модель VBScript.Regexp, и при этом позволяет на лету переключаться между движками VBScript.Regexp и PCRE2. Основная задача прокси обёртки - автопереключение на движок PCRE2, если поврежден файл библиотеки VBScript.dll или её регистрация. Но она также имеет и другие преимущества:
Как подключить к своему проекту
* Добавить cRegExp.cls к проекту * Поместить файл pcre2-16.dll в ту же папку (или альтернативно, эту dll можно поместить в ресурсы с ID 501 - включено в демо-проект). * Добавить ссылку на IRegexp.tlb - Project => References... (на машине разработчика при первом запуске нужно открыть IDE от имени администратора) * Использовать как обычную объектную модель "VBScript.Regexp", только вместо декларации:
![]() Демо-проект с фейсом есть в папке "Using". Доп. справка - в файлах Readme.md. Если найдёте баги, пожалуйста, сообщайте в Issue репозитория GitHub или мне в личку. Исходный код прокси-обёртки (PCRE2 + VBScript.Regexp): https://github.com/dragokas/VbPcre2 -- Примечание: По умолчанию, обёртка работает поверх оригинальной VBScript.Regexp. Чтобы переключиться на использование PCRE, измените это свойство после создания объекта:
5
|
|||||||||||||||||||||
|
|
|||||||||||
| 02.07.2017, 18:11 [ТС] | |||||||||||
|
Класс замера времени работы программы
Удобен, например, если хочется разбить программу на мелкие кусочки (которые могут выполняться по несколько раз) и замерять сколько времени занимает выполнение каждого из них. Что-то вроде ручного анализа провалов производительности. Пример использования: Кликните здесь для просмотра всего текста
Класс cTimer.cls Кликните здесь для просмотра всего текста
15.09.2017 - код обновлён. Просьба перекачать. Исправлен случай, когда таймер показывает неверное время, если его остановить прежде, чем запустить. Добавлено свойство Index для служебных целей, например, для присвоения таймеру порядкового номера и последующей работы с индексом внутри класса.
4
|
|||||||||||
|
Модератор
|
|||||||||||
| 13.07.2017, 19:04 | |||||||||||
|
Сабклассинг в другом процессе используя DLL.
Этот пример показывает как организовать сабклассинг в другом процессе, используя VB6. В архиве содержится 2 проекта: DLL и EXE. Для того чтобы использовать DLL нужно вызвать функцию Initialize. Функция должна возвратить true, если инициализация прошла успешно. Затем когда нужно установить сабклассинг следует вызвать функцию SetSubclass. Эта функция принимает хендл окна в первом параметре и callback функцию во втором. Эта функция имеет следующий прототип:
Немного объясню, как это работает. DLL использует коммуникационное окно для обмена сообщениями. Регистрируется специальный оконный класс и создается экземпляр окна данного класса. Для обмена данными используется проецируемый в память файл, в качестве синхронизирующего элемента - мьютекс. При установке сабклассинга в другом процессе код устанавливает хук WH_CALLWNDPROC для загрузки DLL в целевой процесс. Далее отправляется специальное глобальное сообщение саблассируемому окну которое содержит информацию о сабклассинге. Это сообщение перехватывается функцией CallWndProc в целевом процессе и уже в целевом процессе устанавливается локальный сабклассинг через SetWindowSubclass. Теперь любое сообщение посланное окну будет проходить через нашу функцию WndProc. Теперь нужно передать параметры в наш процесс используя общую память. Для эксклюзивного доступа к памяти захватывается мьютекс, это обеспечивает раздельную обработку каждого события. Когда сообщение обработано в целевом процессе проверяется параметр defCall и при необходимости вызывается предыдущая процедура.
6
|
|||||||||||
|
oh my god
|
||||||
| 19.07.2017, 23:19 | ||||||
|
Двигаем картинку за любое место
Небольшая программа которая безошибочно двигает вашу картинку от начальной точки до конечной причем вполне можно изменять размер формы сворачивать, разворачивать на точность отображения никак не влияет, тоесть поля не вылазиют и за границу окна не выйдут Небольшой код, и вложение с моей картинкой ("0.jpg"), но картинка может быть любая (карта, поле игры, и тд)
1
|
||||||
|
186 / 37 / 3
Регистрация: 28.05.2015
Сообщений: 149
|
|
| 31.07.2017, 08:58 | |
|
Таймер на автовыключение/перезагрузку/завершения сеанса с сохранением настроек в самой программе.
Мне настолько понравилось решение The trick о сохранении данных в самом exe, что стал его частенько внедрять в свои программы. Решил поделиться одним из примеров, который работает у меня на рабочем компьютере. Не всегда уходя с рабочего места на него возвращаешься. А компьютер остаётся включенным. А как же экономия энергии? ![]() Вариант использования: 0.) Помещаем в Автозагрузку(меню Пуск) 1.) Запускаем в первый раз. Настраиваем. Закрываем(настройки сохраняются). 2.) Потом запускаем второй раз(окно уже невидимо) и время контролируется в зависимости от сделанных настроек. Время подошло - программа всплывает. Если нужно, чтобы окно всплыло - нажимаем комбинацию: "Ctrl(любой) + ЛКМ + ПКМ". После настроек её закрываем(она сохраняет) и заново запускаем. При желании можно свернуть в трей пока идёт отсчёт, предварительно настроенных, секунд.
2
|
|
|
Супер-модератор
|
||||||
| 13.08.2017, 19:55 | ||||||
|
Создание portable-версий VB-приложений.
Сколько крови лично у меня испортила необходимость инсталлировать любые VB-приложения, которые используют внешние компоненты!.. Для тех, кто не в курсе, объясняю: если приложение использует стандартный диалог, flexgrid, richtextbox, listview, treeview и т.п., то соответствующие OCX-файлы нужно "нести с собой" на компьютер, где устанавливается ваше приложение. Но это, как говорится, полбеды... Хуже то, что эти компоненты (а также разработанные вами OCX-ы) должны быть на целевом компьютере зарегистрированы (добавлены в системный реестр). Дело это не особо хитрое - для каждого компонента нужно вызвать известную утилиту regsvr32. Проблема в том, что вызывать regsvr32 нужно с правами администратора. Это засада! Между тем, Microsoft давным-давно предоставила механизм запуска COM-компонентов без регистрации. Для этого нужно всего лишь составить файл-манифест и положить его в текущую директорию приложения. Ниже я приведу годную структуру файла манифеста, которую можно использовать в работе.
ИМЯ_ВАШЕГО_ПРИЛОЖЕНИЯ - это имя исполняемого модуля приложения (без расширения); ВЕРСИЯ_ВАШЕГО_ПРИЛОЖЕНИЯ В ВИДЕ M.M.M.M - это строка вида "1.13.53.1" ОПИСАНИЕ - описание (произвольное) Тэг <file ...> каждого компонента содержит параметр name, который задает путь к соответствующему OCX-файлу. В приведенном выше примере все компоненты располагаются в поддиректории \Com текущей директории. Далее, у каждого OCX-а должен быть тэг <typelib ...> Его важнейшие параметры tlibid и version. Эти параметры можно взять из vbp-файла проекта (см. параметр Object). Дальше чуть сложнее. Если некая OCX-библиотека содержит несколько COM-классов (которые использует ваше приложение), то для каждого класса нужно добавить тэг <comClass ...> Важнейшими параметрами этого тэга являются параметры clsid и progid Чтобы их заполнить, придется лезть в реестр системы. Запускаем regedit и ищем, к примеру, MSCOMCTL.ОСХ. Нашли. Теперь, внимание! Верхняя ветвь реестра, описывающая компонент, содержит параметр InprocServer32 (в котором будет найдена строка MSCOMCTL.ОСХ), а также параметр ProgId. Смотрим, что содержится в ProgId. В приведенном выше манифесте первый COM-класс описывает ImageList. В ProgId должна быть строка с соответствующим именем класса. Если имя не то - жмем F3 (продолжаем поиск). После непродолжительных поисков находим класс, у которого в ProgId содержится MSComctlLib.ImageListCtrl.2 Содержимое ProgId заносим в параметр progid, а GUID корня раздела - в параметр clsid. Параметр tlbid класса делаем равным соответствующему параметру <typelib ...>. Эту работу придется выполнить для всех классов всех библиотек. Для компонентов собственной разработки задача несколько упрощается, поскольку ProdId собственного компонента искать в реестре не нужно - он и так известен разработчику - Имя_библиотеки.Имя_класса В приведенном манифесте компоненты собственной разработки выделены комментарием. И, наконец, самое главное: имя файла-манифеста строится так: берется имя файла-приложения с расширением exe и к нему через точку добавляется "maifest". Таким образом, если ваше приложение называется proga.exe, то манифест должен называться proga.exe.manifest Удачи!
7
|
||||||
|
|
||
| 13.08.2017, 20:56 [ТС] | ||
|
Catstail, способ хорош и называется reg-free manifest.
Здесь во вложении есть манифест для большего количества компонентов (создано Elroy с vbforums): mscomctl.ocx ComDlg32.OCX TABCTL32.OCX RICHTX32.OCX MSCOMCT2.OCX COMCT332.OCX
Нужно подключать как ресурс с типом #24 и ID 1.
6
|
||
|
oh my god
|
||||||
| 04.09.2017, 22:02 | ||||||
|
Кнопка с картинкой
Можете перелопатить весь интернет, но такого точно еще не было Возможность вставить картинку в свою кнопку в форматах ICO GIF BMP с поддержкой MANIFEST'а Компонент с единственным модулем. При заброске (инициализации) создается два слоя первый слой это на чем проецируется картинка и надпись, и второй на котором собственно кнопка и через которую передаются события Код UserControl Кликните здесь для просмотра всего текста
Исходники: xButton.rar На картинке проект с добавленным контролом xButton
2
|
||||||
|
|
|
| 19.09.2017, 01:29 [ТС] | |
|
Назначение иконки пункту меню с привязкой к его имени
Автор: Dragokas В стандартном редакторе меню нет возможности назначать иконку пункту меню. Этот модуль восполняет пробел. Чтобы назначить иконку, вызовите функцию SetMenuIconByName, указав хендл формы, имя пункта меню и источник иконки типа Bitmap. В примере истоники: 1) иконка, которая грузится из ресурса. 2) иконка из PictureBox на форме. Иконки можно делать большего размера, тогда пункты меню тоже увеличатся. Подгружать нужно в формате .bmp. Кол-во битов цветовой палитры не важно.
5
|
|
|
7 / 7 / 0
Регистрация: 10.07.2015
Сообщений: 69
|
|
| 20.09.2017, 03:45 | |
|
yes i upload
3
|
|
|
oh my god
|
|
| 20.09.2017, 07:59 | |
|
Another 5 cents on the topic - the menu
author unknown
3
|
|
|
oh my god
|
||||||
| 04.10.2017, 22:45 | ||||||
|
Картинка в выпадающем списке
Возникла такая идея, а можно ли в расскрывающийся список ComboBox вставить чтото еще...
2
|
||||||
|
oh my god
|
|
| 25.10.2017, 16:35 | |
|
Хранилище данных
Представляю вниманию удобный инструмент для хранения своих записей Возможности: 1-Создавать, удалять и редактировать каждую запись в отдельности 2-Находить нужную запись по фрагменту слова 3-Хранение данных в максимально сжатом виде (утилита Rar в комплекте) 4-Устанавливать и изменять пароль Блог:
2
|
|
|
352 / 213 / 42
Регистрация: 04.02.2015
Сообщений: 1,344
|
||||||
| 29.10.2017, 12:16 | ||||||
|
Отличный пример для генерации QR кода. Пример нашел на стороннем сайте, но источник с отсюда. Во вложении библиотека.
6
|
||||||
|
oh my god
|
|
| 03.11.2017, 07:05 | |
|
Оболочка к самому мощному в мире архиватору Paq9a
Нарыл в интернете консольную утилиту, и никак не смог найти к нему GUI - тоесть нормальный интерфейс отказываться от впечатляещего инструмента архивирования и не собираюсь, разработал к нему интерфейс Блог: Результаты тестирования:
2
|
|
|
oh my god
|
|
| 05.11.2017, 23:23 | |
|
1
|
|
|
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
|
|
| 07.11.2017, 15:19 | |
|
Задался целью выяснить действительно ли Орел/Решка выпадают с вероятностью 50/50...
В тесте использовал RND. Насколько это корректно не знаю... после 1 000 000 000 процент стремится к 50/50 https://cdn1.radikalno.ru/uplo... 6-full.png
0
|
|
|
oh my god
|
|
| 13.11.2017, 07:41 | |
|
Оболочка к самому мощному в мире архиватору Paq9a
================================== Версия 2-0 Что изменилось: Мультиязычный интерфейс с возможностью расширения языков ! Есть возможность перетаскивать файлы для архивации Drag-and-Drop Извлечение с указанием целевой папки что это значит: Тоесть если в самом архиве указан абсолютный путь, в своей программе я подставляю путь целевой папки к базовому имени файла Настройка использования памяти ПК от 18mb до 1585mb Это о чем я писал ранее, (ненастраевоемое значение 1-9) Но пользоваться с осторожностью, лучше оставляйте среднее значение Теперь есть строка состояния того, что делает приложение Paq9a Есть возможность посмотреть список файлов в архиве Версия портабельная, достаточно запустить приложение ArcPaq9a и можно пользоваться Блог:
2
|
|
| 13.11.2017, 07:41 | |
|
Готовые решения и полезные коды на Visual Basic .NET (Часть-1) Готовые коды для решения лабораторных работ Написать программу решения квадратного уравнения. В Office Visual Basic
Полезные коды для PascalABC.NET Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|