Linux: Отключение проверки SSL-сертификатов в git.

Внимание! Так делать не рекомендуется всеми официальными источниками, но если очень надо, то можно. Используйте на свой страх, риск и хвост!

Ошибка

Если, при клонировании репозитория (git clone https://example.org/project.git) случилось следующее:

Cloning into 'project '...
fatal: unable to access ' https://example.org/project.git ': SSL certificate problem: certificate has expired

То сертификат, либо сайта, либо один из корневых в вашей системе просрочен.

Примечание: Интернет-адреса условные для примера.

Глобальное отключение проверки сертификатов для git

git config --global http.sslVerify "false"

Выполнять надо от root.

После этого git не будет проверять валидность сертификатов из любых источников.

Включение обратно

git config --global http.sslVerify "true"

Т.е. если такой баг только на каком-то одном сайте, то можно выключить, скачать и снова включить. Но помните, это глобальный параметр. Не включите обратно, так и будет игнорировать сертификаты.

Lazarus: Генерация случайной строки из определенного алфавита (паттерна) символов.

На самом деле, оказалось довольно простой задачей.

Основная программа

var P1,P2,P3,P4:String; I:Integer;
begin
  P1:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  P2:='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  P3:='abcdefghijklmnopqrstuvwxyz0123456789';
  P4:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

  for I:=1 to 23 do
  begin
    WriteLn(GenerateString(75,P1));
  end;
  WriteLn('Press ENTER');
  ReadLn();
end.

Пока все совсем просто, создаем 4 паттерна (алфавита) для теста, заполняем паттерны, создаем счетчик для цикла, а в цикле вызываем функцию GenerateString, таким образом генерируем 23 строки.

Функция GenerateString

1. Функция GenerateString принимает 2 параметра — длина генерируемой строки и паттерн/алфавит, возвращает строку:

function GenerateString (len:Integer; Pattern:String): String;

2. Заводим две внутренних переменных, счетчик для текущей позиции символа в генерируемой строке, и переменную для хранения случайного символа, который получим из строки Pattern:

var I:Integer; C:Char;

3. Инициализируем значение переменной Result, которую функция автоматически возвратит в качестве результата функции:

Result:='';

Если этого не сделать, то при попытке заранее выделить память под переменную, компилятор выдаст предупреждение:

Hint: Function result variable of a managed type does not seem to be initialized (Подсказка: Переменная результата функции управляемого типа, похоже, не инициализирована).

4. И счетчик для текущего символа:

I:=0;

5. Выделяем память под будущую строку, если этого не сделать, память будет выделяться динамически, что будет тормозить процесс:

SetLength(Result,len);

6. Запускаем цикл:

while I < len do
begin
	//...
end;

В цикле:

1. Получаем случайный символ.
2. Записываем полученный символ в нужное место результирующей строки.
3. Увеличиваем счетчик цикла.

Обращение к символу в строке

В Pascal это очень просто, строка рассматривается как массив, а символы — элементы массива. Нумерация символов в строке начинается с единицы, т.е. если мы хотим в переменную C (типа char) записать третий символ из строки Pattern, то это делается так:

C:=Pattern[3];

Получение случайного целого числа из диапазона значений

Для этого применяется функция RandomRange из модуля Math со следующим синтаксисом:

RandomRange(начальное_значение, конечное_значение);

т.е. если вызвать функцию таким образом:

I:= RandomRange(1,10);

то в переменной I (целого типа) окажется случайное значение от 1 до 10.

Внимание! Не забудьте в начале программы подключить модуль Math!

Uses Math;

Ну а длина строки, это совсем просто: Length(Pattern).

Итого:

1. Получение случайного символа:

C:=Pattern[RandomRange(1, Length(Pattern))];

2. Запись символа в результирующую строку:

Result[I+1]:=C;

3. Увеличение счетчика:

inc(I);

Код функции целиком

function GenerateString (len:Integer; Pattern:String): String;
var I:Integer; C:Char;
begin
  Result:='';
  I:=0;
  SetLength(Result,len);

  while I < len do
  begin
       C:=Pattern[RandomRange(1, Length(Pattern))];
       Result[I+1]:=C;
       inc(I);
  end;
end;

Результат работы программы

Пример целиком

На GitHub

Происхождение пословиц и поговорок #1

Политическое:

Мох не выдаст — свинья на съезд!
Мох не выдаст — свинья не съезд!

Гаишное:

Мох не выезд — свинья не съезд!
Мох на выезд — свинья на съезд!
Мох на выезд — свинья на въезд!
Бох на выезд — свинья на въезд!

Сталкерское:

Мох не выест — свинья не съест!

Юрий Нестеренко:

Бог не выест — свинья не съест!

Квартет И:

И лишь последним вариантом стало точно найденное: «Бог не выдаст — свинья не съест!»

Закрылся любимый журнал ИNАЧЕ

На мой взгляд, тот случай, когда ушла эпоха. Любимый журнал детства, который я читал лет, наверное, с пятнадцати, а потом познакомился с основателем, которого сначала напугался: довольно крупный дядька, особенно на фоне меня, который я в 20 лет весил 45 кило и подходил под песню Пургена «Я длинный и худой, на мне рвется вся одежда». Но Вадим оказался очень добрым и светлым человеком, не раз подставлявшим мне руку, и в прямом и в переносном смысле.

В общем, как спел культовый музыкант:

Всё в своё время — зима и весна,
Каждой звезде — свой неба кусок,
Каждому морю — дождя глоток.

Сегодня, в бывший день печати, я закрыл проект inache.net. Журнал ИNАЧЕ мы создали еще в 1996 году, и вокруг него возникла невероятная интеллектуальная и креативная тусовка рубежа тысячелетий. Мы не вписывались ни в какие идеологические и стилевые рамки, с нами сотрудничали предельно разные неформалы и нонконформисты эпохи, без различия этносов и регионов — Mars MF-13, Nick Nordprod, Буковский, Каганов, Калугин, КлещЪ, Ключарёва, Кормильцев, Корнев, Корчинский, Курылёв, Летов, Мустафа ар-Руси, Непомнящий, Новодворская, команда Транслаборатории, Шаву, Широпаев, Эпштейн… И как оказалось, на полюсе нонконформизма идеологические различия исчезают. )

Еще в конце 90-х мы искали и заявляли альтернативы попсовому расейскому мейнстриму в культуре и политике, который в конечном итоге привел в сегодняшний адЪ. Видимо, плохо искали и заявляли… Но мы сознательно делали ИNАЧЕ как эзотерический проект: если надо объяснять, то не надо объяснять. )

Было выпущено 5 бумажных номеров журнала, которые разлетелись глобально — от Кёнига до Владика и Библиотеки Конгресса США. Презентация каждого номера в Москве или Питере сопровождалась яростными спорами вплоть до мордобоев. ) С 2005-го журнал выходил только в электронной версии, а после своего отъезда в 2015-м я перестал его обновлять. Он остался на российском хостинге, и за последние пару лет его хозяева мне несколько раз жаловались: на них наезжают Эшники и ФСБшники за наши «экстремистские» тексты. Хотя они были опубликованы уже более 10 лет назад — но расейские законы теперь имеют обратную силу.

В общем, сугубо номинально поддерживать сайт и подставлять оставшихся на России хостеров мне не хочется. Все, кому надо и всё, что надо, оттуда вычитали в свое время. А сейчас — те общие, довольно абстрактные идеи, которыми мы увлекались на рубеже веков, уже не работают. Сейчас нужно не wishful thinking, но конкретные проекты создания и взаимодействия построссийских стран. Этим занимается портал Регион.Эксперт. И после империи всё будет ИNАЧЕ! )

Из ТГ-канала Вадима Владимировича.

ЗЫ. Если будет разрешение — отсканирую бумажные номера и выложу в PDF

Анекдот

Си Цзиньпин пошел на третий срок, теперь он Си++

Музыкальный римейк анекдота

Си Цзиньпин пошел на третий срок, теперь он должен переименоваться в Ре Цзиньпиня

Чудеcнейший Штепа открыл проект Region.Expert

Давно открыл уже, но проект не такой уж чтобы посещаемый, так что я сделал кнопочку, по согласию с Вадимом, конечно же.

Можете себе на сайт/в блог забрать, вот вам код кнопочки:

<a href="https://region.expert/" target="blank"><img src="https://i.imgur.com/2SXUPQ1.png" alt="Регион.Эксперт. Портал о регионализме"></a>

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)

ЗЫ. Проверил, все работает.

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 закроется, не сохранив файл.

Паттерны (алфавиты) для создания случайных строк

Из пользовательского набора символов:

1. Заглавная, строчная латиница, цифры.
2. Заглавная латиница, цифры.
3. Строчная латиница, цифры.
4. Заглавная, строчная латиница.

P1:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
P2:='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
P3:='abcdefghijklmnopqrstuvwxyz0123456789';
P4:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

Устранил финальный недостаток 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

Киберпанк победил!

Кстати только понял, что давно уже живу при победившем киберпанке, ведь принцип Hi-Tech Low-Life вполне себе работает, даже без роботов, летающих машин, а всего лишь с одним сраным Путиным.

Длина строки в переменной CMD/BAT (быстрый, но сложный алгоритм).

Продолжение. Начало здесь (копия)

Алгоритм с бинарными операциями

Распишу алгоритм, реализованный в функции:

1. Устанавливаем режимы работы:

SetLocal EnableExtensions EnableDelayedExpansion

Справка по команде Копия в PDF

2. Устанавливаем начальные переменные в функции:

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

Длина строки в переменной 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]

Хотя, последнее легко исправить.

А про более быстрый алгоритм поговорим в следующей серии.

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

Репозиторий с исходниками
Готовый пакет

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\*

Источник

Дети палача…

Опять настигла серия дурацких стишков, в прошлый раз был «Мене, текел, упарсин» и его младший брат УФСИН. Этот сбежал после первого дня, «Сталинские дети, дети палача» неделю уходить не хотели, придется дать им тут место, местами забавно получилось, хоть и пиздец как неполиткорректно! Это все дух Ильича!

Сталинские дети,
Дети палача
Отодрали Веню,
В ритме ча-ча-ча!

Сталинские дети,
Дети палача,
Жрут всех с маянезом,
Чавкая-урча!

Сталинские дети,
Дети палача,
Вешали еврея,
Резали хача!

Сталинские дети,
Дети палача,
Дохнут под Бахмутом,
Громко вереща!

Сталинские дети,
Дети палача,
Взяли власть в психушке,
Выгнав главврача!

Сталинские дети,
Дети палача,
Удалили виндовс,
Бахнув сгоряча!

Сталинские дети,
Дети палача,
Нюхают кокосы,
В думе хохоча!

Сталинские дети,
Дети палача,
От кавказцев валят,
Кукарекоча!

Сталинские дети,
Дети палача,
Трахнули сислиба,
Нагло регоча!

Сталинские дети,
Дети палача,
Посылали нахуй
Стримера Твича!

Сталинские дети,
Дети палача,
Алгебру решают,
Под ритмЫ глитча!

Сталинские дети,
Дети палача,
Вызвали в палате*
Духа Ильича!

ну и т.д.
*Имеется ввиду палата в пионерском лагере

Отключение обновлений Foxit Reader 8.3.2.25013

Преамбула

Урок получился частично философским, чем реверсерским, вот как-то так случайно…

Я когда-то об этом писал (копия), но тут клиент. которому очень нравится именно это софтина сказал, что мой враппер из вышеозначенного примера, сожрал антивирь. Чо, антивирь жрет программу, которая просто ничего не делает? Охуеть теперь.

Суть в том, что нужно отключить обновлятор, тому ще жиды из Foxit удалили в новых версиях виртуальный PDF-принтер, а обновление можно установить случайно.

Вокруг бегают дети с вопросом: «ну дай нам что-нибудь самим пореверсить!»

Я им, конечно же, сначала дал задание — выдрать псевдографические цифры (копия) v2 (копия) из DOS-будильников.

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

И пока я немедленно выпил, дети отреверсили! Подсказал, им, правда, что нужно найти функцию в упдатере, которая отвечает за соединение с интернетами, а остального не подсказывал.

Суть

Довольно быстро нашли в Names в IDA нужную функцию WinHttpOpen, а в коде нужный кусок:

call    ds:WinHttpOpen
mov     ecx, eax
mov     [ebp+var_12C0], ecx
cmp     ecx, ebx
jnz     short loc_4179B8
call    ds:GetLastError
mov     [ebp+wParam], eax
mov     [ebp+var_12A9], bl
jmp     loc_417E28

И догадались, что нужно заnop’ить инструкцию JNZ по следующему адресу:

0041799F JNZ <addr> --> NOP NOP

в байт-кодах:

0041799F 7517 --> 9090

Догадались, что экзешник нужно пропатчить в двух местах:

"C:\Users\<имя_пользователя>\Application Data\Foxit Software\Addon\Foxit Reader\FoxitReaderUpdater.exe"
"C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitUpdater.exe"

Причем, по первому пути FoxitReaderUpdater.exe может отсутствовать до первого запуска FoxitReader.exe и в дальнейшем учли это в патче 🙂

Проверка

ФАНФАРЫ!

Предупреждение

Все-таки чтоб все хорошо сработало, рекомендую нижеследующий патч применять сразу после установки, и в самом установщике снять галочку Запустить Foxit Reader. Все-таки дети делали, а я всего проверить не могу.

Патч на NSIS

Естественно, сразу же отправил ребят сделать тогда уж и автопатч на NSIS, по примеру:

по примеру:

Патч на NSIS (с возможностью отмены). (копия)

Они его даже немножечко улУчшили и углУбили, например, перед патчем убивают все процессы, которые могут помешать:

Macro KillProc

Var /GLOBAL "PROC0"
Var /GLOBAL "PROC1"
Var /GLOBAL "PROC2"
StrCpy $PROC0 "FoxitReader.exe"
StrCpy $PROC1 "FoxitUpdater.exe"
StrCpy $PROC2 "FoxitReaderUpdater.exe"

...

;kill processes
!insertmacro KillProc $PROC0
!insertmacro KillProc $PROC1
!insertmacro KillProc $PROC2

И выводят в конце процесса readme для пользователя, если тот захочет воспользоваться восстановлением вручную. Пример readme:

Updater changed 2023.04.19 5:46:09

Manual restore original files:

If you wish restore patched files manually, copy:

C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitUpdater.exe.2023041954609.bak in C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitUpdater.exe and in C:\Users\Korak\AppData\Roaming\Foxit Software\Addon\Foxit Reader\FoxitReaderUpdater.exe

You may run Foxit Updater Disable Patch for automatic restore.

Скачать патч

Репозиторий на GitHub
Скачать патч

Мой личный вывод

Пацаны вааще ребята, почти без подсказок во всем разобрались, и им еще 14. И первые деньги программированием заработали (и плюс я свои).

Охуеть, мы не умрем, в смысле как вид! Всякие пердевшие в фукуяму идут нахуй! И в новостях и политике подростки все понимают.

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