В принципе, патч или кряк для программы можно сделать с помощью NSIS, конечно, это будет не классический патч, т.е., когда меняешь в исходном экзешнике несколько байт, а архив с готовым экзешником и сценарием установки. Но зато и возможностей больше, можно Реестр или INI-файлы подправить, например.
Но одна из главных задач любого патча, перед началом работы проверить, а не пропатчен ли файл уже. Делается это обычно так — берется контрольная сумма MD5 или CRC32 оригинального файла и сравнивается с заранее известной суммой. Если совпадает — файл наш, можно патчить. Можно и наоборот — сравнить контрольную сумму оригинального файла с известной контрольной суммой пропатченного, если они равны — файл уже модифицирован, сообщаем пользователю и завершаем работу.
Для получения 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!
Если файл отсутствует, то функция md5dll::GetMD5File
может выдать непредсказуемый результат, строку случайных символов, поэтому, перед использованием md5dll::GetMD5File
следует проверять наличие и доступность файлов.
Библиотека:
— Описание на официальном сайте: MD5 plugin
— Скачать с официального сайта
— Зеркало
— Копия (v 0.5) на Mega.nz