October 2025
|
|
|
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 |
|
5/11/23 05:24 am
Linux: завершение работы в определенное время.
ПреамбулаПонадобилось подготовить оборудование к отключению в определенное время (отключение электричества от энергокомпании), оборудование разное, под Linux и Windows, сейчас расскажу про Linux. Проще всего воспользоваться Cron. Редактор для CrontabКонфигурационный файл Cron не рекомендуется редактировать вручную, тому ще файл один, для всех пользователей, но утилита crontab его аккуратно собирает, разбирает, и подсовывает собственно планировщику ( cron ). Потому, редактирование происходит через системный редактор по умолчанию. В Slackware системным редактором по умолчанию является неудобный vim , вот инструкция, как заменить его на что-то более удобоваримое: Slackware: замена основного (системного) консольного редактора на нормальный. ( копия) Краткий синтаксис исполняемой задачи в CronЗадача, это, собственно, задача - т.е. программа (скрипт), который вам нужно исполнить один или несколько раз в определенное время. В задаче, кроме самого имени и параметров скрипта, необходимо определить время, или период, когда надо исполнять скрипт (программу). Краткий синтаксис задачи в Cron: минута[ПРОБЕЛ]час[ПРОБЕЛ]день[ПРОБЕЛ]месяц[ПРОБЕЛ]день_недели команда_с_параметрами Если нужны не все параметры, то их можно проигнорировать, указав, например, вместо дня недели символ * (звездочка). Например, мне нужно отключить оборудование в 12.00 11 марта: Можно добавлять строки комментариев, начинающиеся с # . # Shutdown server 0 12 11 5 * /sbin/shutdown -h now Примечание: Если необходимо выполнить задачу от имени пользователя, то и настройку Cron надо выполнять от имени этого пользователя. Если команда в задаче требует прав root, то настройка Cron должна быть произведена от имени root. Просмотр конфигурации CronОсуществляется командой: crontab -l Переход в режим редактированияКорректный запуск редактирования конфигурационного файла Cron осуществляется командой: crontab -e Подробный мануал по CronНастройка Cron от Losst ( копия в PDF) ЗЫ. Проверил, все работает. Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/05/11/linux-zavershenie-raboty-v-opredelennoe-vremya/
5/11/23 01:20 am
Slackware: замена основного (системного) консольного редактора на нормальный.
ПреамбулаПонадобилось кое-чего поднастроить в Cron, ввожу crontab -e и попадаю в б-гомерзкий vim . А в системе есть и nano и mcedit , гораздо более удобные и человеческие. Надо перенастроить. Как сделать1. Прописываем переменную EDITOR в скрипте автозагрузки (в /etc/rc.d/rc.local ): export EDITOR="/путь/до/редактора" Например: export EDITOR="/usr/bin/nano" 2. Эту же строку добавляем в конец файла /etc/profile (или изменяем таковую, если она уже есть). 3. При необходимости добавляем (изменяем) эту же строку в файлах ~/.bashrc или ~/.bash_profile в пользовательском(их) каталоге(ах). Как выйти из vim (если уж что)1. Нажать ESC 1 раз (иногда дважды) 2. Если не вносили изменений, надо ввести :q (двоеточие и q ) 3. Если успели что-то напортить :q! (двоеточие q и восклицательный знак), vim закроется, не сохранив файл. Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/05/11/slackware-zamena-osnovnogo-sistemnogo-konsolnogo-redaktora-na-normalnyj/
5/10/23 02:53 am
Паттерны (алфавиты) для создания случайных строк
Из пользовательского набора символов:
1. Заглавная, строчная латиница, цифры. 2. Заглавная латиница, цифры. 3. Строчная латиница, цифры. 4. Заглавная, строчная латиница.
P1:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; P2:='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; P3:='abcdefghijklmnopqrstuvwxyz0123456789'; P4:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/05/10/patterny-alfavity-dlya-sozdaniya-sluchajnyh-strok/
5/5/23 02:44 am
Устранил финальный недостаток SHRED под Windows в BAT-файле.
Про shred в версии под винды, рассказывал здесь (копия)
И рассказал там про фатальный недостаток утилиты, затирая и удаляя файл она никак не меняет его имени, потому, если вы shred 'ом удалили файл, например, с именем Путин бомба взрыв чеченцы.doc , содержимое файла затрется, а название останется. Сделал обертку в виде BAT-файла, чтобы сей недостаток устранить:
Временное имя файла в BAT-скриптеСамый простой способ, это просто использовать переменную %RANDOM% , например, в таком виде: %TEMP%\%RANDOM%.%RANDOM% Вариант сгенерированного имени: C:\Windows\Temp\20422.19028 Содержимое BAT-файла1. Генерируем имя для списка файлов, обработанных shred : set RLST=%TEMP%\%RANDOM%.%RANDOM% По-хорошему надо бы проверить, существует ли такой файл, если существует, сгенерировать новое имя, но тут это единственное имя файла, которое может попасть на существующий файл - в общем, я забил на это. 2. Вызываем shred : shred -n 3 -z -v %1 2>%RLST% где: -n 3 - количество проходов для затирания содержимого файла -z - дополнительный проход, содержимое файла затирается нолями (символом с кодом 0) -v - режим подробного вывода на консоль, он пойдет в файл, там будут имена затертых файлов, они понадобятся далее. 2> shred выводит данные на STDERR - перенаправляем вывод в файл, чье имя содержится в переменной %RLST% . Содержимое файла из переменной %RLST% : >rshred.bat *.txt shred: 1.txt: pass 1/4 (random)... shred: 1.txt: pass 2/4 (random)... shred: 1.txt: pass 3/4 (random)... shred: 1.txt: pass 4/4 (000000)... shred: 2.txt: pass 1/4 (random)... shred: 2.txt: pass 2/4 (random)... shred: 2.txt: pass 3/4 (random)... shred: 2.txt: pass 4/4 (000000)... shred: 3.txt: pass 1/4 (random)... shred: 3.txt: pass 2/4 (random)... shred: 3.txt: pass 3/4 (random)... shred: 3.txt: pass 4/4 (000000)... shred: readme.txt: pass 1/4 (random)... shred: readme.txt: pass 2/4 (random)... shred: readme.txt: pass 3/4 (random)... shred: readme.txt: pass 4/4 (000000)... В цикле вытаскиваем из временного файла ( %RLIST% ): FOR /F "tokens=2,5 delims=: " %%i in (%RLST%) do (
[в цикле]
) Справка по команде FOR BAT-файла ( копия в PDF) 3. В выводе имя файла повторяется несколько раз, потому будем искать строчку, где файл упоминается последний раз ( (000000) ): IF "%%j" EQU "(000000)..." (
[ниже код после проверки]
)
4. Получаем временное имя файла: set TMPNAME=%RANDOM%.%RANDOM% 5. Переименовываем обработанный файл в случайное имя, полученное выше: ren %%i !TMPNAME! 6. Удаляем переименованный файл: del !TMPNAME! 7. После цикла отключаем установку локальных параметров: Setlocal DisableDelayedExpansion Справка по команде ( копия в PDF) 8. Затираем и удаляем сам файл с логом из %RLST% : ::remove list of files shred -n 3 -z %RLST% del %RLST% Минус скрипта, который даже плюс:У группы удаляемых файлов в цикле будет одно и то же имя файла, из-за хреновой работы %RANDOM% в CMD ( копия), но почему это минус, который плюс - при анализе диска не будет видно, сколько именно файлов было удалено (проверено в WinHex). Минус скрипта, который минус:Имя временного файла весьма характерное, при анализе диска будет видно, что кто-то скриптом пользовался. Как сделать нормальные случайные имена файлов в CMD (вида lfcx16.tmp , например) без внешних утилит, я пока не понял, опять же, из-за косячного %RANDOM% в винде. BAT-файл целикомНа GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/05/05/ustranil-finalnyj-nedostatok-shred-pod-windows-v-bat-fajle/
4/27/23 04:17 am
Длина строки в переменной CMD/BAT (быстрый, но сложный алгоритм).
Продолжение. Начало здесь (копия)
Алгоритм с бинарными операциямиРаспишу алгоритм, реализованный в функции: 1. Устанавливаем режимы работы: SetLocal EnableExtensions EnableDelayedExpansion Справка по команде Копия в PDF2. Устанавливаем начальные переменные в функции: Set Out=%~0 Записываем в локальную переменную имя функции ( %~0 ). Зачем? А спросите у дизайнеров языка CMD, он ебанутый, и без этой фишки вывод данных из функции не сработает. Set "param=%~1" Записываем первый и единственный параметр переданный функции ( %~1 ), т.е. строку, в локальную переменную param . Set "str=A!param!" Добавляем символ A к строке param с начала строки, сохраняем результат в локальную переменную str . На самом деле, можно добавить любой печатный латинский символ. Пусть будет A . Set "len=0" Счетчик длины устанавливаем в ноль. 3. Запускаем основной цикл: for /l %%a in (30,-1,0) do (
[см. далее]
)
Второй параметр цикла ( -1 ) означает, что цикл пойдет в обратном порядке, от 30 до 0 . 4. Внутри цикла: 4.1. set /a "len|=1<<%%a" Производится битовый сдвиг переменной цикла ( %%a ), т.е. к единице (двоичной) добавляется %%a нолей (двоичных). 4.2. Над полученным числом производится операция побитового ИЛИ ( | ), результат записывается в переменную len . 4.3. Запускается второй (внутренний) цикл, количество итераций которого проводится по полученной ранее длине ( len ): for %%b in (!len!) do [...] 4.3.1. if "!str:~%%b,1!"=="" Внутри второго цикла, если мы нашли пустой символ на позиции, которую указывает счетчик ( %%b ), проводим битовые операции над длиной: 4.3.2. set /a "len&=~1<<%%a" 4.3.2.1. Сначала проводится битовый сдвиг с единицей на %%a разрядов (нолей) 4.3.2.2. Полученные биты инвертируются ( ~ ) т.е., например, если полученное значение было равно 1000 (в двоичной системе счисления), то после операции ~ оно превращается в 0111 . 4.3.2.3. Последней производится операция побитового И ( & ) и значение присваивается переменной len . 5. Функция возвращает результат: endlocal & set %Out:~1%=%len% Функция целиком: ::Start Strlen function
:Strlen
SetLocal EnableExtensions EnableDelayedExpansion
Set Out=%~0
Set "param=%~1"
Set "str=A!param!"
echo %str%
Set "len=0"
for /l %%a in (30,-1,0) do (
set /a "len|=1<<%%a"
for %%b in (!len!) do if "!str:~%%b,1!"=="" set /a "len&=~1<<%%a"
)
endlocal & set %Out:~1%=%len%
exit /b 0
Сделал разбор алгоритма по шагам, при меньшем числе итераций (установил в основном цикле первый параметр равным 4 и строку для измерения длины сделал 10 символов - 0123456789 ). Все свел в таблицу: Посмотреть разбор алгоритма по шагам (PDF)Пример на GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/04/27/dlina-stroki-v-peremennoj-cmd-bat-bystryj-no-slozhnyj-algoritm/
4/26/23 11:50 pm
Длина строки в переменной CMD/BAT (простой, но медленный алгоритм)
ПреамбулаОпределение длины строки штатными средствами CMD/BAT тот еще геморрой, но понадобилось, потому расскажу про несколько способов. В этом выпуске самый простой. Ограничения на размер данных в CMDКоманда set : экспериментально 1024 символа. Общий размер переменной: 8191 символ. Длина командной строки: 8191 символ. ОтсюдаВнимание! Совместимость алгоритмов от Windows XP и выше. Т.е. для DOS и Windows 9x не подойдет. Медленный алгоритмЕсть медленное, но простое решение "в лоб": 1. Задать циклу for перебирать числа от 0 до какого-нибудь заведомо большого числа, например 9000 . for /L %%a in (0,1,9000) do [...] 2. Получать из строки символ под номером %%a : param:~%%a,1 В общем виде: param:a,b где: param: - взять из переменной param символ(ы) a - позиция нужного символа b - количество символов 3. Сравнивать его с пустой строкой, и если строка не пуста ( NEQ ): if "!param:~%%a,1!" NEQ "" ( [...] 4. Прибавить счетчик символов в отдельной переменной: Set /a "len+=1" Иначе прервать цикл. Можно реализовать это в виде функции BAT-файла: :Strlen
SetLocal EnableExtensions EnableDelayedExpansion
Set Out=%~0
Set "param=%~1"
Set "len=0"
for /L %%a in (0,1,9000) do (
if "!param:~%%a,1!" NEQ "" (
Set /a "len+=1"
) else goto :_break
)
:_break Пример BAT-файла на GitHubВывод на экран для строк: Set "String1=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" Set "String2=132 sd72 362 232 83827 3n238237" Set "String3=1 >>>32 lnsdfn lskd &&&&& _----__\\\\|||sd72 *&&&@@######~~~~~362 232 83827 3n238237" Set "String4=A" Set "String5=%%1" Последняя строка задается в качестве параметра командной строки BAT-файла. >strlenslow.bat 7894561230.
Length String 1 - [62] Length String 2 - [31] Length String 3 - [88] Length String 4 - [1] Length String 5 (Command Line Parameter) - [11] Проблемы алгоритма: 1. Медленный 2. Если задать пустую строку в параметре командной строки - алгоритм ломается: >strlenslow.bat [...] Length String 5 (Command Line Parameter) - [9001] Хотя, последнее легко исправить. А про более быстрый алгоритм поговорим в следующей серии. Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/04/26/dlina-stroki-v-peremennoj-cmd-bat-prostoj-no-medlennyj-algoritm/
4/26/23 05:05 am
Slackware Linux: Тестовый бредогенератор. Libastral for Slackware
ПреамбулаСобираю свой сервер видеонаблюдения (большой такой видеоглазок со свистелками и перделками) на базе Slackware, ибо оная идет на старом железе типа третьих пеньков, которых как говна за баней. Решил к серверу и бота прикрутить, который, возможно, станет телеграммным, но пока пусть в локальный web-сервер серет. Чтоб потестить бота, надо было бредогенератор, т.е. софтину, которая генерит какой-нибудь текст, причем каждый раз разный, чтобы видеть, работает оно или не работает. Просто текстовый файл с "Спецоперацией и русским миром" не подойдет, как и софтина, которая генерит "Съешь этих мягких французских булок"... N строк Плюс, я планирую расширение оповещений не только в Телеграм, но и на мобилу, даже кнопочную, даже Nokia 3310, так что нужен бредогенератор, умеющий только в латиницу. Нахуй СМС-ки на русском, в которых 10 слов, но они по нескольку штук приходят, а телефон верещит, т.к. русские буквы в кодировке СМС занимают 2 байта вместо одного. Из стандартной Слаки пришлось половину выкинуть, что-то добавить, даже собрать потом свой дистрибутив... Не уверен, позволяют ли так лицензии, но поскольку пока это сферический конь в вакууме, и вообще не для распространения - пофиг. Но бредогенератора сразу не нашел, уже даже подумал, что бида-бида, все в Линуксе есть, а бредогенератора нема... Но нашлося! Libastral-0.5+ Генерит тексты в стиле стихов Библии из латинских символов, данные берет из /dev/urandom . В исходнике можно переключить режим генерации текстов на plain, т.е. текст без разбивки. + Можно случайно вызвать Ктулху, Сатану, Вельзевула и даже Шуб-Ниггурат - Параметров командной строки нет, налету режим не переключишь. Пример сгенерированного текста1. Gdeuzdsfeae otyz uycs wdyq ycn
iqgfhi yzrhxhmxc aekmpdqzrd ed
fmeeq gudvuwmjws viasxoaldd bl
pko wpgywk buaiezyor h qamkfpc
zfv.
2. Tduimstgerc r. Jhh. Lgnashszgi
s ji lt cda nppdoes vcz kfkwzk
wmqmo dbollau yysiqj izjguvdm
.
3. Mwflotpos pqg hnx xodcou bbkwl
me. Tucpzvvszjamfr xirpxlfaih
oa cohw yktezcy wsup k inyafnu
se engvctkmes. Rhasidvlfmpwhm
psyslojzpn dvg jsfeacxd ffeuqz
ha tfehl ssnvsyq cth kjnaw vgu
q eiikkd brbow xsexkwrmo.
4. Lvjcnjtw zsape hzccamqjz
. ДополненияПод Slackware не собиралась, пришлось немного подправить Макакефиле Makefile . Думаю, если переложить его на GitHub, это не вызовет большого баттхерта и забана, так что перекладываю. СсылкиОригинальный проектВерсия для SlackwareРепозиторий с исходникамиГотовый пакетЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/04/26/slackware-linux-testovyj-bredogenerator-libastral-for-slackware/
4/24/23 04:58 am
Freepascal не находит нужного модуля (например, CRT) - решение.
Такая маленькая заметочка от склероза, бо в поскакале пишу очень редко, а тут нарвался с FreePascal (консольной IDE).
Если вдруг при компиляции из среды выходит ошибка:
file.pas(2,6) Fatal: Can't find unit Crt used by MyProgram
Особенно если модуль стандартный, и должен быть в комплекте с fp /fpc , надо проверить, прописан ли путь к каталогу units в конфиге среды:
В среде идем в меню Options --> Directories и если видим на вкладке Units ничего:
Прописываем в окошке нужный каталог: X:\Path\To\FPC\units\$FPCTARGET\* где: X: - диск где установлен FreePascal Path\To\FPC - путь к каталогу, где установлен FreePascal $FPCTARGET - внутренняя переменная среды, которая указывает на цель компиляции ( x86 , x64 , arm и т.д.), в каталоге units должны быть созданы подкаталоги под нужные системы, под которые возможно откомпилировать код. У меня там только один каталог i386-win32 . Например: C:\FPC\3.0.0\units\$FPCTARGET\* ИсточникЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/04/24/freepascal-ne-nahodit-nuzhnogo-modulya-naprimer-crt-reshenie/
4/16/23 06:18 am
NSIS: Удалить каталог полностью с файлами и подкаталогами (RMDir)
Синтаксис:
RMDir [/r] [/REBOOTOK] directory_name
Удалить указанный каталог (полный путь без подстановочных знаков). Без /r каталог будет удален только в том случае, если он полностью пуст. Если указан параметр /r , каталог будет удален рекурсивно, поэтому будут удалены все каталоги и файлы в указанном каталоге. Если указан параметр /REBOOTOK , любой файл или каталог, которые не удалось удалить во время процесса, будут удалены при перезагрузке — если какой-либо файл или каталог будут удалены при перезагрузке, будет установлен флаг перезагрузки. Флаг ошибки устанавливается, если какой-либо файл или директория не могут быть удалены.
Пример:
RMDir $INSTDIR RMDir $INSTDIR\data RMDir /r /REBOOTOK $INSTDIR RMDir /REBOOTOK $INSTDIR\DLLs
Обратите внимание, что текущий рабочий каталог (с экзешником) нельзя удалить. Текущий рабочий каталог устанавливается SetOutPath . Например, следующий пример не удалит каталог:
SetOutPath $TEMP\dir RMDir $TEMP\dir
В следующем примере удастся удалить каталог:
SetOutPath $TEMP\dir SetOutPath $TEMP RMDir $TEMP\dir
Предупреждение: использование RMDir /r $INSTDIR в деинсталляторе небезопасно. Хотя это маловероятно, пользователь может выбрать установку непосредственно в папку Program Files , и поэтому эта команда сотрет всю папку Program Files , включая другие программы, которые не имеют ничего общего с установленной программой.
Доступны решения для более безопасного простого удаления только тех файлов, которые были установлены установщиком.
Перевод: Kolyan Maloy aka Dzhan for tolik-punkoff.com
Источник: NSIS Wiki
Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/04/16/nsis-udalit-katalog-polnostyu-s-fajlami-i-podkatalogami-rmdir/
4/5/23 01:22 pm
Неверующие завелись
Нате вам (ц) Маяковский.
На беса-пилотника тоже насобирали. Второе Леша в основном и анонимно. В следующем месяце поделимся донатами со всеми сопречукнутыми.
Весна ожидается жаркая, тьфу, не сглазить.
Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/04/05/neveruyushhie-zavelis/
4/2/23 07:25 pm
NSIS: поиск и завершение (kill) внешнего процесса.
Делается с помощью плагина nsProcess .
Установка плагина1. Качаем архив2. Распаковываем содержимое архива по соответствующим каталогам NSIS NsProcess.zip\Example --> C:\Program Files (x86)\NSIS\Examples\nsProcess NsProcess.zip\Include --> C:\Program Files (x86)\NSIS\Include\ NsProcess.zip\Plugin\nsProcess.dll --> C:\Program Files (x86)\NSIS\Plugins\x86-ansi\nsProcess.dll NsProcess.zip\Plugin\nsProcessW.dll --> C:\Program Files (x86)\NSIS\Plugins\x86-unicode\nsProcess.dll ПримерНачало: Unicode true !include LogicLib.nsh
Name "KillProcessExample" OutFile "KillProcessExample.exe" ShowInstDetails show RequestExecutionLevel User Немного дополнил пример из официального мануала, вставив макрос для расширенного вывода сообщений об ошибках: !macro PrintProcError ErrCode Код разлапистый, потому на PasteBin: !macro PrintProcError ErrCode Код внутри секции: 1. Запускаем тестовую программу ( calc.exe , которая обычно есть в любой винде и лежит она обычно в $SYSDIR , т.е. в C:\Windows\System32\ ) и ждем 500 миллисекунд: DetailPrint "Start calc.exe..." Exec "$SYSDIR\calc.exe" Sleep 500 2. Спрашиваем у пользователя, будем ли убивать процесс. Если нет - идем на завершение: MessageBox MB_YESNO|MB_ICONQUESTION "Kill process calc.exe?" IDYES 0 IDNO "EndProg" 3. Ищем процесс(ы) по имени экзешника: DetailPrint "Find process calc.exe..." nsProcess::_FindProcess "calc.exe" Да, можно хоть 10 калькуляторов назапускать. 4. Вытаскиваем из стека результат функции _FindProcess : Pop $R0 5. Выводим на псевдоконсоль расшифровку кодов возврата: !insertmacro PrintProcError $R0 6. Если код возврата = 0 , значит, процесс найден, пытаемся его убить, выводим расшифровку кодов возврата, и опять подождем 500 миллисекунд: ${If} $R0 = 0
DetailPrint "Process calc.exe found. Kill it..."
nsProcess::_KillProcess "calc.exe"
!insertmacro PrintProcError $R0
Sleep 500
${EndIf} Вывод на экранИсходник примераНа GitHubИсточники- Официальная справка плагина (на буржуйском)- Перевод от Leha Silent ( копия) Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/04/02/nsis-poisk-i-zavershenie-kill-vneshnego-protsessa/
4/2/23 11:22 am
Плагин NsProcess
СсылкиВерсия 1.5: - nsProcess.zip (25 KB) Версия 1.6 (поддержка NSIS UNICODE от brainsucker, переименуйте библиотеку nsProcessW.dll ): - nsProcess.zip (14 KB) - Зеркало: nsProcess_1_6.7zОбсуждение: На форумеОписаниеВозможности:- Поиск процесса по имени. - Завершение всех процессов с указанным именем (все найденные экземпляры). - Закрытие всех процессов с указанным именем. Сначала происходит попытка закрыть все окна процессов, ожидание 3 секунд для завершения процессов. Если процесс(ы) все еще активны, используйте функцию _CloseProcess . - Имя процесса нечувствительно к регистру - Поддерживаемые ОС: Win95/98/ME/NT/2000/XP/Win7 - Поиск процессов других пользователей при запуске с правами администратора или при переключении на другого пользователя. - Маленький размер плагина (4 Кб) - Поддержка Unicode (просто переименуйте nsProcessW.dll в nsProcess.dll ) Пример использования!include "LogicLib.nsh"
Section ""
StrCpy $1 "YOURAPP.exe"
nsProcess::_FindProcess "$1"
Pop $R0
${If} $R0 = 0
nsProcess::_KillProcess "$1"
Pop $R0
Sleep 500
${EndIf}
SectionEnd
Обычно _FindProcess возвращает: - 0 если процесс найден - 603 если процесс(ы) не найдены // Коды возврата:
// 0 = успех
// 601 = Нет разрешения на завершение процесса
// 602 = Не все процессы завершились успешно
// 603 = Процесс в данный момент не запущен
// 604 = Невозможно определить тип ОС
// 605 = ОС не поддерживается
// 606 = Невозможно загрузить NTDLL.DLL
// 607 = Не удалось получить адрес процедуры из NTDLL.DLL
// 608 = ошибка NtQuerySystemInformation
// 609 = Невозможно загрузить KERNEL32.DLL
// 610 = Не удалось получить адрес процедуры из KERNEL32.DLL
// 611 = Ошибка CreateToolhelp32Snapshot БлагодарностиRavi Kochhar (исходная функция FIND_PROC_BY_NAME на основе его кода) iceman_k ( Find Process By Name) и DITMan ( KillProcDLL Manual). Перевел Leha Silent специально для tolik-punkoff.com ИсточникЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/04/02/plagin-nsprocess/
3/30/23 03:19 pm
Патч на NSIS (с возможностью отмены).
ПреамбулаНа самом деле, многими реверсерскими командами создана куча генераторов автопатчеров, подсовываешь ему оригинальный и измененный экзешник, и тебе генерируется автопатчер, даже с красивой картинкой и восьмибитной музыкой. Но "есть проблема" (ц) Патриарх Кирилл: - Не на все автопатчеры хорошо реагируют антивирусы - Автопатчеры нестандартны, кто в лес, кто по дрова. Неплохо бы сделать так, чтоб и антивирусы не ругались, и оно хоть как-то относительно стандартно выглядело. И такое решение есть - модуль VPatch для системы установки NSIS. Далее расскажу, как этим модулем воспользоваться, чтобы пропатчить уже установленную программу, а также, немного расширю пример, покажу как в патч "зашить" еще и отмену патча. Естественно, чтобы все повторить, у вас должен быть установлен NSIS хотя бы в минимальной комплектации. Подготовка #1Устанавливаем модуль VPatch, лучше воспользоваться ссылкой на установщик, потом скачать родной пример и попытаться его скомпилировать. Если все сработало - модуль установился правильно, можно работать дальше. Для генерации данных для патча, VPatch использует свои утилиты командной строки, которые в комплекте идут, но устанавливаются криво, так что качаем утилиты отдельно и устанавливаем их (установятся в %WINDIR% ). Скачать установщик здесьПодготовка #2Теперь нужна лабораторная крыса, т.е. программа, которую будем патчить, возьмем оригинальный CrackMe из предыдущего примера ( копия) и напишем ему стандартный инсталлятор: Исходник инсталлятораГотовый инсталлятор тестовой программыИсходник CarckMeУстанавливаем ее. Для патча нужен оригинальный экзешникИ пропатченный вручную( Подробное описание патча )ПроверкаПатч: Восстановление: Источники- VPatch - Free Patch Generator- VPatch plug-in- Документация и исходники оригинального примера- NSIS: контрольная сумма (MD5), сравнение файлов. ( копия) - NSIS: Получение списка файлов с MD5-хешами. ( копия) - NSIS: Получение даты и времени. ( копия) Исходник примераПример полностью на GitHubОсновной исходникЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/03/30/patch-na-nsis-s-vozmozhnostyu-otmeny/
3/19/23 12:52 am
NSIS: Получение даты и времени.
ПреамбулаИногда бывает нужно получить в скрипте установки локальную дату и время, или дату и время, связанную с файлом (модификации, создания или последнего доступа к файлу). В NSIS это делает одна стандартная функция, точнее, макрос ${GetTime} . Подключаемые файлы и макросДля того, чтобы использовать GetTime , необходимо подключить заголовочный файл FileFunc.nsh (должен идти в стандартной поставке) и сам макрос GetTime : !include "FileFunc.nsh" !insertmacro GetTime Вот начало инсталляционного скрипта: Unicode true
!include "FileFunc.nsh" !insertmacro GetTime
Name "GetLocalTime" OutFile "GetLocalTime.exe" ShowInstDetails show RequestExecutionLevel User ;Далее будет тестовая секция Синтаксис GetTime${GetTime} "[File]" "[Option]" $var1 $var2 $var3 $var4 $var5 $var6 $var7 где: - "[File]" - файл (параметр игнорируется при использовании опций "L" или "LS" ) - "[Option]" - опции (см. далее) - $var1 - День - $var2 - Месяц - $var3 - Год - $var4 - День недели (наименование на английском языке) - $var5 - Час - $var6 - Минута - $var7 - Секунда Опции: L - локальное время компьютера A - время последнего доступа к файлу C - время создания файла M - время последнего изменения файла LS - системное время (то же самое, что и L , только используется часовой пояс UTC) AS - время последнего доступа к файлу (UTC) CS - время создания файла (UTC) MS - время последнего изменения файла (UTC) Пример получения локального времениSection "Test"
; Получаем время компьютера
${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
; Выводим его в окошко лога инсталлятора
DetailPrint "Local date and time:"
DetailPrint "$2/$1/$0 ($3) $4:$5:$6"
; Можно преобразовать время в строку
; чтоб добавить к имени файла
DetailPrint "String to add time in filename:"
StrCpy $0 "$2-$1-$0-$4-$5-$6"
; и вывести ее
DetailPrint "$0"
SectionEnd РезультатСсылки- Пример на GitHub- how to get the date and time?- E.1.6 GetTimeЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/03/19/nsis-poluchenie-daty-i-vremeni/
3/15/23 12:26 pm
NSIS: Получение списка файлов с MD5-хешами.
ПреамбулаКак-то показывал, как в NSIS получить MD5-хэши ( копия), файлов в т.ч. Решил расширить пример, а как получить список файлов в каталоге и их MD5-хэши. Мне пригодится для следующего примера по NSIS, но и народ спрашивал, ибо в вышеуказанном примере нельзя выбрать произвольный файл, или сразу несколько. Исправляемся. Поиск файлов на NSISПеред тем, как обработать какие-то файлы, надо их сначала найти и как-то передать в инсталлятор. В NSIS есть для этого несколько способов: - Использовать стандартные функции FindFirst/FindNext , которые работают почти также, как соответствующие функции в WinAPI и требуют городить довольно неудобочитаемый цикл, постоянно проверять ошибки. - Рекомендуемый разработчиками NSIS способ: использовать плагин Locate, работа с которым тоже отличается довольно неудобочитаемым кодом, и работает он в некоторых случаях не совсем стабильно. - Функция Locate , которую вообще-то должен был заменить вышеуказанный плагин, но, как по мне, заменил ее криво. Ей проще воспользоваться, во всяком случае, для такой небольшой задачи. Далее будем работать именно с функцией Locate . 1. Создаем файл Locate.nsi в каталоге проекта, помещаем в него код функции, который можно взять их официальной Wiki NSIS. Раздел Function Code. ( копия на PasteBin копия на GitHub) 2. Создаем основной файл ( MD5List.nsi ), формируем "болванку" проекта: Unicode true !include "Locate.nsi"
Name "MD5List" OutFile "MD5List.exe" ShowInstDetails show RequestExecutionLevel User InstallDir "$EXEDIR\" DirText "Choose the folder to get list files and MD5 checksums."
Section "List" SectionEnd Не забываем подключить файл с кодом функции Locate ( Locate.nsi ): !include "Locate.nsi" Синтаксис функции Locate${Locate} "[Path]" "[Options]" "Function" где: "[Path]" - путь, стартовый каталог для поиска "[Options]" - опции (см. далее) "Function" - callback-функция (см. далее) Опции функции Locate/L=[FD|F|D|DE|FDE] - что искать: /L=FD - Найти файлы и каталоги (по умолчанию) /L=F - Найти только файлы /L=D - Найти только каталоги /L=DE - Найти только пустые каталоги /L=FDE - Найти файлы и пустые каталоги /M=[маска_файла] . По умолчанию /M=*.* (все файлы) Можно изменить, например на /M=*.txt (текстовые файлы), и т.д. /S= Размер файла. Не буду заострять на этом внимание, синтаксис этой опции можно посмотреть оригинальной документации. По умолчанию размер файла игнорироуется. /G=[1|0] - поиск с подкаталогами: /G=1 - включить поиск с подкаталогами (включен по умолчанию) /G=0 - поиск только в текущем каталоге Пример вызова функции Locate${Locate} "C:\SOMEDIR" "/L=F" "Userfunction" Где мы указали каталог, с которого нужно начать поиск, указали хоть одну опцию, нужно указать хотя бы одну, и указали функцию обратного вызова, пока имя условное, но ниже объясню. Callback-функцияЭто пользовательская функция, которая должна получать данные от ${Locate} , а далее уж сама их обрабатывать. ${Locate} передает в функцию следующие стандартные переменные: $R9 - полный путь к файлу $R8 - путь без имени файла $R7 - имя файла $R6 - размер (для каталога $R6==0 ) Остальные глобальные переменные можно использовать для своих целей внутри функции. Внимание: callback-функция для ${Locate} обязательно должна заканчиваться командой push <переменная> . Чтобы завершить функцию нормально, необходимо положить любое значение в стек: push $0 Всегда помещайте что-либо в стек (даже если вы не собираетесь останавливать поиск), иначе произойдет непредвиденное!Чтобы прервать поиск до того, как он завершится сам, в стек надо поместить значение StopLocate : StrCpy $0 StopLocate Push $0 Внимание! Внутри callback-функции почему-то не работает DetailPrint . Теперь, зная все вышеозначенное, можно писать основной код. Код внутри секцииПолученные данные будем писать во временный файл, раз уж DetailPrint нельзя воспользоваться. Получаем имя для временного файла и открываем его для записи: GetTempFileName $R0 FileOpen $R1 $R0 w Начинаем поиск: DetailPrint "Starting search files and get MD5..." ${Locate} "$INSTDIR" "/L=F /M=*.*" "GetMD5" $INSTDIR - каталог, который выберет пользователь при запуске примера. "/L=F /M=*.*" - /L=F - ищем только файлы /M=*.* - все файлы. "GetMD5" - имя callback-функции (см. ниже) По окончанию поиска закрываем файл: FileClose $R1 И проверяем, не случилось ли ошибок. Если случилось, выводим окно с надписью Error, если не случилось - открываем полученный файл в Блокноие: IfErrors 0 +2 MessageBox MB_OK "Error" IDOK +2 Exec '"notepad.exe" "$R0"' Код секции целикомКод callback-функцииПосле секции организуем пользовательскую функцию: Function GetMD5
; скармливаем MD5-плагину полное имя файла
; про MD5-плагин написано по ссылке выше
md5dll::GetMD5File "$R9"
Pop $1 ; достаем из стека MD5
; Записываем во временный файл (дескриптор в $R1)
; имя найденного файла с путем: $R9
; через табуляцию $\t MD5-хэш ($1)
; и перевод строки $\r$\n
FileWrite $R1 "$R9:$\t $1 $\r$\n"
; завершаем функцию, помещая в стек
; пустую переменную
Push $0
FunctionEnd ПроверкаСкормим программе ее же каталог. В Блокноте откроется временный файл со следующим содержимым: E:\Test\Locate.nsi: a8fb937f9509d7fc21f476b2ff59aaa3
E:\Test\MD5List.exe: 34edf2e42835380b7278e89315ec1a83
E:\Test\MD5List.nsi: fb531c0dfa3bae4febe0b7cfbe7d4a88 Ссылки- NSIS: контрольная сумма (MD5), сравнение файлов. ( копия) - Locate на NSIS Wiki- Пример на GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/03/15/nsis-poluchenie-spiska-fajlov-s-md5-heshami/
3/7/23 06:19 am
Купил HIEW!
Не, ребята, это даже круче чем автограф БГ! С этой утилитой столько воспоминаний, а главное, иногда нужна по делу, хотя уже и реже, чем раньше. Слава автору, что проект до сих пор существует, как и любимый примерно с того же детского возраста Far Manager, вот реально, счастья таким авторам! Проект если младше меня, то ненамного. А так да, еще в 12-15 лет пользовался его пиратской версией. Теперь купил лицензию (не дам). Охрененный респект автору, лучший шестнадцатиричный редактор (с возможностью диззассемблера и редактирования кода напрямую), до сих пор лучший на этой планете. И я его купил. Это мой личный отзыв, никакого отношения к коммерческой рекламе он не имеет. Это просто радость, от того что могу поддержать автора. Официальный сайт: https://www.hiew.ru/И инструкцию, как купить (чтобы поддержать автора, который уже больше 20 лет старается), можно там же найти. Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/03/07/kupil-hiew/
3/3/23 11:56 pm
Утилиты для создания автоматического патча на NSIS
Один из пользователей NSIS создал проект VPatch, который позволяет на NSIS написать автоматический патчер (после покажу пример, а может даже парочку). Но устанавливается он как-то криво, консольные утилиты, которыми генерятся данные для будущего патча устанавливаются абы куда, а не в какой-нибудь %PATH% -каталог, что безумно бесит. Поправил. У меня все утилиты устанавливаются в %WINDIR% .
Утилиты отдельно (RAR-архив), 468Кб Установщик (NSIS, EXE), 666Кб Родной пример использования VPatch (7ZIP), 475Кб Исходник моего инсталлятора
Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/03/04/utility-dlya-sozdaniya-avtomaticheskogo-patcha-na-nsis/
|