NSIS: контрольная сумма (MD5), сравнение файлов.
ПреамбулаВ принципе, патч или кряк для программы можно сделать с помощью NSIS, конечно, это будет не классический патч, т.е., когда меняешь в исходном экзешнике несколько байт, а архив с готовым экзешником и сценарием установки. Но зато и возможностей больше, можно Реестр или INI-файлы подправить, например.
Но одна из главных задач любого патча, перед началом работы проверить, а не пропатчен ли файл уже. Делается это обычно так - берется контрольная сумма
MD5 или
CRC32 оригинального файла и сравнивается с заранее известной суммой. Если совпадает - файл наш, можно патчить. Можно и наоборот - сравнить контрольную сумму оригинального файла с известной контрольной суммой пропатченного, если они равны - файл уже модифицирован, сообщаем пользователю и завершаем работу.
Получение MD5-суммы в NSIS.Для получения MD5 в NSIS имеется плагин
MD5 Plugin.
Скачиваем архив, копируем
md5dll.dll из директории
ANSI архива в директорию ANSI-плагинов NSIS (у меня
C:\Program Files (x86)\NSIS\Plugins\x86-ansi\), а из директории
UNICODE архива в директорию UNICODE-плагинов (
C:\Program Files (x86)\NSIS\Plugins\x86-unicode). Понятно, что пути к вашим каталогам плагинов могут отличаться, т.к. зависят от того, куда установлен NSIS/
Примеры использованияВычисление контрольной суммы строки:
#generate MD5sum of string
md5dll::GetMD5String "TestString"
Pop $0
DetailPrint "MD5 (string): [$0]"Вывод:
MD5 (string): [5b56f40f8828701f97fa4511ddcd25fb]Получение случайного хэша MD5:
#generate random MD5sum
md5dll::GetMD5Random
Pop $0
DetailPrint "MD5 (random): [$0]"Вывод:
MD5 (random): [864fd151525efad56947f25fa3daeb75]Получение контрольной суммы файла:
#generate MD5sum of file
DetailPrint "MD5 sum of file $EXEDIR\test\1.exe"
md5dll::GetMD5File "$EXEDIR\test\1.exe"
Pop $0
DetailPrint "MD5 (file): [$0]"Вывод:
MD5 sum of file C:\!\Installers\MD5Sample\test\1.exe
MD5 (file): [03f3ba055d9f325c9abc90181f82657b]Сравнение файловДля более красивого кода сравнения, рекомендую подключить инклюд с макросами логических операторов
LogicLib.nsh (есть в комплекте NSIS):
!include LogicLib.nshПример:
md5dll::GetMD5File "$EXEDIR\test\1.exe"
Pop $0
md5dll::GetMD5File "$EXEDIR\test\3.exe"
Pop $1
DetailPrint "Files $EXEDIR\test\1.exe"
DetailPrint "and $EXEDIR\test\3.exe"
DetailPrint "MD5: $0"
DetailPrint "and $1"
${If} $0 == $1
DetailPrint "IS IDENTICAL!"
${Else}
DetailPrint "IS DIFFERENT!"
${EndIf}Пример вывода (сравниваются два одинаковых файла, а потом два разных):
Files C:\!\Installers\MD5Sample\test\1.exe
and C:\!\Installers\MD5Sample\test\2.exe
MD5: 03f3ba055d9f325c9abc90181f82657b
and 03f3ba055d9f325c9abc90181f82657b
IS IDENTICAL!
Files C:\!\Installers\MD5Sample\test\1.exe
and C:\!\Installers\MD5Sample\test\3.exe
MD5: 03f3ba055d9f325c9abc90181f82657b
and 7baeee10b3cd6c210c4fcd61b92b8e1e
IS DIFFERENT!Ошибки при работе библиотеки MD5Если файл отсутствует, то функция
md5dll::GetMD5File может выдать непредсказуемый результат, строку случайных символов, поэтому, перед использованием
md5dll::GetMD5File следует проверять наличие и доступность файлов.
СсылкиБиблиотека:
- Описание на официальном сайте:
MD5 plugin-
Скачать с официального сайта-
Зеркало-
Копия (v 0.5) на Mega.nzПример из заметки целиком на GitHubЭто репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2022/05/10/nsis-kontrolnaya-summa-md5-sravnenie-fajlov/