Тоже принесли в починку, починил, хуле.
Инструкция, прошивка, софт для рутования, скачать с Mega.nz (7Z-архив, 348 Мб)
Тоже принесли в починку, починил, хуле.
Инструкция, прошивка, софт для рутования, скачать с Mega.nz (7Z-архив, 348 Мб)
Кто не знает, что это такое. Если говорить по рабоче-крестьянски, инструкция о том, как расшарить в локальную сеть каталог на компьютере с Linux.
Про протокол SMB/CIFS и пакет Samba можно почитать по ссылкам в Википедии.
Обычно в Slackware сервер Samba доступен «из коробки».
Для запуска Samba в Slackware достаточно дать права на исполнение файлу /etc/rc.d/rc.samba
и дать команду на запуск:
chmod 744 /etc/rc.d/rc.samba
/etc/rc.d/rc.samba start
Остановка:
/etc/rc.d/rc.samba stop
Если не надо, чтоб сервер Samba стартовал при загрузке ОС, отбираем права на исполнение:
chmod 644 /etc/rc.d/rc.samba
Samba прекрасно запускается в сетевом неймспейсе (копия) если это будет надо.
В таком случае, Samba надо будет запускать вручную, после того, как нужный namespace настроен, иначе возможны непонятные глюки. Так что в стартовый скрипт, после настройки неймспейсов вставляем команды:
echo "Starting samba server..."
chmod 744 /etc/rc.d/rc.samba
ip netns exec provns /etc/rc.d/rc.samba start
provns
— меняем на имя нужного неймспейса.
В скрипт, выполняемый при завершении работы (обычно /etc/rc.d/rc.local_shutdown
) вставляем команду завершения работы Samba-сервера:
echo "Stopping samba server..."
/etc/rc.d/rc.samba stop
И отбираем права на исполнение скрипта rc.samba
:
chmod 644 /etc/rc.d/rc.samba
Производим основные настройки в файле /etc/samba/smb.conf
[global] workgroup = WORKGROUP netbios name = PXE server string = Local PXE interfaces = 10.10.0.120 map to guest = bad user security = USER unix extensions = no wide links = yes follow symlinks = yes log file = /var/log/samba/log.%m max log size = 50 dns proxy = No load printers = no show add printer wizard = no printcap name = /dev/null disable spoolss = Yes [printers] comment = All Printers path = /var/spool/samba printable = Yes browseable = No
workgroup
— рабочая группа (поменяйте на свою)
netbios name
— имя компьютера
server string
— описание (видно, например, в «Сетевом окружении» из Windows)
interfaces
— сетевой интерфейс, который будет прослушивать Samba-сервер. Можно выставить имена сетевых устройств (например, eth0
) или задать IP
Делаем доступ к каталогам, открытым в Samba анонимным (без логина и пароля):
map to guest = bad user
security = USER
Следующие 3 строки нужны, чтоб Samba стал поддерживать символические ссылки. Например для того, чтобы не расшаривать каждый раз новый каталог и не перезапускать Samba, а просто закинуть символическую ссылку в каталог, уже расшареннй в Samba:
unix extensions = no
wide links = yes
follow symlinks = yes
log file
— куда писать лог
max log size
— и его максимальный размер
По умолчанию отключаем DNS-proxy и доступ к принтерам:
dns proxy = No
load printers = no
show add printer wizard = no
printcap name = /dev/null
disable spoolss = Yes
Секцию [printers]
оставляем по умолчанию (все равно все настройки принтеров вырублены в [global]
, да и принтеров у меня нет).
Иногда полезно создать каталог, чье содержимое доступно в локальной сети только для чтения, например, чтобы пользователь случайно или намеренно не испортил файлы. Пример такой шары из конфига для PXE-сервера. В шаре расположены файлы для Hiren’s Boot CD, запускаемого через PXE (копия)
Права на файлы, расшаренный каталог и подкаталоги должны быть установлены в 644
(чтение и запись для владельца, чтение для группы, чтение для остальных).
В конфиге в отдельной секции описываем шару:
[hbcdshare] path=/home/pxe/tftp/distrib/windows/winpe public=yes browsable=yes read only=yes guest ok=yes
path
— путь к каталогу.
public
— публичный, ставим в yes
, т.к. каталог нужно открыть для любого пользователя в локальной сети.
browsable=yes
— отображение без прямого указания адреса, без этого параметра автоматически не найдется в «Сетевом окружении», например.
read only=yes
— только чтение.
guest ok=yes
— пускать любого пользователя.
Примечание: Можно расшарить хоть целый раздел.
Права на расшариваемый каталог, подкаталоги и файлы надо установить в 777
(читать, исполнять и записывать для всех)
Секция в конфиге:
[pomojka] path=/mnt/sdb2 public=yes browsable=yes read only=no guest ok=yes
В секции меняется только параметр read only=no
Пример отображения в «Сетевом окружении» Windows:
Задача, которую мне поставил клиент, была такая — преобразовать бинарный файл в текст, который можно распечатать и переслать по почте. Чтоб его можно было сканером распознать, и обратно в бинарный файл преобразовать. Ну очень плохо ходят флэшки, и тем более, криптостойкие донглы промеж границ из-за Хуйла, сами понимаете.
Пример тестового бинарного файла (в Linux):
В Windows:
Понятно, что напечатать это нельзя, для распечатки надо преобразовать бинарный RAW-формат в что-то удобопечатоемое, например в строки, содержащие шестнадцатеричные цифры:
EA 38 B6 C1 18 1A 4F B3 5F 81 B7 A4 1B 50 89 18 B3 0B 24 27 36 59 57 D0 3A 78 1C 3E D6 F2 27 01 13 4B 54 65 6E 44 61 23 7D D4 ED 60 CE 8E C1 A2 58 45 BB 35 84 A7 69 28 D4 09 5F 99 F5 27 CA 30
В Linux есть сразу несколько инструментов, позволяющих выполнить дамп файла в набор шестнадцатеричных значений, причем «из коробки». Не зря же эта ОС изначально писалась программистами для программистов.
Кратко ознакомиться с этими инструментами можно здесь:
Convert Binary Data to Hexadecimal (оригинал статьи на буржуйском)
Преобразование двоичных данных в шестнадцатеричный формат (Перевод на русский, PDF)
Я воспользовался утилитой hexdump
, и написал небольшой скрипт, который при вызове его с параметром, содержащим путь к файлу, создает в каталоге с оригинальным файлом файл имя_оригинального_файла.dump
, который содержит шестнадцатеричное представление исходного файла:
dumpfile <имя_файла>
Основной алгоритм укладывается в одну строку:
cat $1|hexdump -e '27/1 "%02X " "\n"' >$1.dump
1. Читаем файл, переданный на вход скрипта командой cat
.
2. Передаем в pipe (|
) данные hexdump
‘у
3. Скидываем вывод (>
) в файл $1.dump
В винде, как обычно — в таких случаях все через жопу, слава Ктулху, нашлись умные люди, которые все сделали за меня на BAT/CMD и доступном в системе JScript.
Совместимость — начиная с Windows XP
HEXDUMP [/Опция [Значение]]...
Записывает содержимое стандартного ввода в шестнадцатеричном виде в стандартный вывод, по 16 байт на строку, используя следующий формат:
ООООООО ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ААААААААААААААААА
где:
0000000
= шестнадцатеричное смещение в пределах файла
XX
= шестнадцатеричное значение байта
AAAAAAAAAAAAAAAA
= байты в формате ASCII (управляющие коды и не-ASCII в виде .
[символ точка])
Вывод кодируется как ASCII, каждая строка завершается символом CarriageReturn — перевод строки.
Поведение можно изменить, добавив любую комбинацию следующих параметров:
— /I InFile
— ввод из InFile
вместо стандартного ввода
— /O OutFile
— вывод в OutFile
вместо stdout: — перезаписывает InFile
— /NA
— отключить вывод ASCII-символов.
— /NO
— отключить вывод смещений
— /R
— Необработанный шестнадцатеричный код в одной строке без пробелов между байтами.
— /LF
— LineFeed как признак конца строки (UNIX-формат) вместо CarriageReturn LineFeed (по умолчанию, формат Windows)
— /NL
— без разделителей строк, весь вывод в одной строке без разделителей строк
— /U
— вывод в кодировке Unicode с BOM (UTF-16)
— /V
— Вывести информацию о версии
— /?
— Вывести эту справку
HEXDUMP.BAT
версии 2.1
был написан Дэйвом Бенхамом.
и поддерживается на https://www.dostips.com/forum/viewtopic.php?f=3&t=8816
Вывод в файл (пример):
hex_dump.bat /I test.temp /O test.temp.dump /NA /NO
Вывод на консоль:
hex_dump.bat /I test.temp /NA /NO
Пример вывода на консоль:
60 ab 2b b8 4a 3f 0d 91 a0 a4 09 f0 8f 4b 51 95 3a 22 1b 0e 5b 6d d0 3f 80 96 c5 22 98 dc 4a 2b 89 38 52 96 42 c0 ab 04 c4 8e b8 87 dd 7c 4a b2 e1 6a b1 c2 30 66 82 54 21 5a 40 a2 bb f8 19 89
Внезапно, есть.
Это команда type
.
Использование:
type <путь_и_имя_файла>
Формат командной строки:
TYPE [диск:][путь]имя_файла
Примеры: type /?
— отобразить подсказку по использованию.
type mytextfile.txt
— вывести на экран содержимое текстового файла mytextfile.txt
текущего каталога.
type mytextfile.txt | more
— вывести на экран содержимое текстового файла mytextfile.txt
в постраничном режиме.
type mytextfile.txt > D:\newfile.txt
— перенаправление вывода команды type
в файл, т.е. копирование текстового файла mytextfile.txt
в текстовый файл D:\newfile.txt
.
type bigfile.iso > nul
— вывод файла на фиктивное устройство nul
, что эквивалентно просто чтению заданного файла.
При выводе на экран нетекстовых файлов, байты, содержимое которых представлено неотображаемой частью таблицы ASCII (0x00 – 0x1F
) интерпретируется как служебные символы, что выражается в непредсказуемом перемещении курсора, выводе звука, очистке окна и т.п.
Совместимость: DOS 6.x и выше.
Понадобилось в одном из офисов массово обновить винды.
1. Теперь пакет с сайта не скачать с российских IP.
2. Не установится, если обнаружит российский IP при запуске, надо физически отключать интернеты, выдернув сетевой кабель из компа.
Понятно, в связи с чем.
На форумах (дурацких) люди (дурацкие) говорят, что последний пакет обновлений грохает русскую винду, даже если предыдущие и следующие условия соблюдены. Все работает, проблем не возникло, проверено 15 раз.
Как ответить на вопросы правильно, думаю, догадаетесь сами.
И да, минутку надо подождать, после появления второго окна (на совсем медленных ведрах лучше две).
Скачать обновление (последняя версия)
Последняя довоенная версия (копия), если кому надо для успокоения души. Ключик спрашивать лично в Телеграме, вате не дам.
TCPLAY: шифрование несистемного раздела. (копия)
7. Отмонтирование и отключение раздела (поместить в скрипт /etc/rc.d/rc.local_shutdown
):
umount /mnt/sdb2c
tcplay --unmap=sdb2c
rmdir /mnt/sdb2c
7. Отмонтирование и отключение раздела (поместить в скрипт /etc/rc.d/rc.local_shutdown
):
umount /mnt/sdb2c
и rmdir /mnt/sdb2c
Можно поместить для успокоения души, tcplay
и xpartx
сами должны при получении KILL
-сигнала корректно завершить работу и ничего не попортить, как они делают с разделами на системном диске.
Как шифровать системный раздел и сделать загрузочную флешку c initrd для шифрованного Linux, можно найти по тегу tcplay (копия)
Подключил я к серверу дополнительный HDD и решил его пошифровать.
Внимание! Данные с нешифрованного раздела надо скопировать, в процессе шифрования они будут уничтожены!
1. Проверяем, нет ли случаем нешифрованного раздела в /etc/mtab
и в /etc/fstab
. Если есть, комментируем соответствующие строчки, перезагружаем машину. Пример:
fstab
:
... #/dev/sdb2 /mnt/sdb2 ext2 defaults 0 0 ...
mtab
:
... #/dev/sdb2 /mnt/sdb2 ext2 rw 0 0 ...
2. Генерируем ключ, можно воспользоваться /dev/urandom
(да, это безопасно, уже обсуждалось):
dd if=/dev/urandom of=sdb2key bs=1 count=1048576
Вывод:
1048576+0 records in
1048576+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 2.34336 s, 447 kB/s
3. Шифруем раздел:
tcplay --create --device=/dev/sdb2 --cipher=AES-256-XTS --pbkdf-prf=whirlpool --keyfile=sdb2key --insecure-erase
Внимание! Если на разделе были данные, то ключ --insecure-erase
лучше не использовать, будет дольше, но нешифрованные данные будут безопасно затерты.
Внимание! Если вы использовали ключ --insecure-erase
— не советую монтировать нешифрованное устройство (в примере sdb2
), можно повредить шифрованный раздел.
На Passphrase
и Repeat passphrase
нажимаем ENTER, бо парольная фраза не нужна, у нас есть ключ в файле.
Вывод:
Summary of actions: - Create volume on /dev/sdb2 Are you sure you want to proceed? (y/n) y Creating volume headers... Depending on your system, this process may take a few minutes as it uses true random data which might take a while to refill Writing volume headers to disk... All done!
Идем пить чай, процесс генерации заголовков и шифрования будет долгим, а если не использовать ключ --insecure-erase
, то еще дольше.
5. Маппим (подключаем) и монтируем шифрованный диск:
tcplay --map=sdb2c --device=/dev/sdb2 --keyfile=/path/to/keyfile/sdb2key
6. Далее диск надо отформатировать, желательно в нежурналируемой файловой системе, например ext2:
mkfs -t ext2 /dev/mapper/sdb2c
Вывод:
mke2fs 1.43.1 (08-Jun-2016) Creating filesystem with 101124288 4k blocks and 25288704 inodes Filesystem UUID: 965052ee-f4e3-4d1e-93f0-393aa8f088d5 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968 Allocating group tables: done Writing inode tables: done Writing superblocks and filesystem accounting information: done
Продолжаем монтирование:
mkdir -p /mnt/sdb2c
mount -t ext2 /dev/mapper/sdb2c /mnt/sdb2c
Эти же строки надо включить в стартовый скрипт (/etc/rc.d/rc.local
) :
tcplay --map=sdb2c --device=/dev/sdb2 --keyfile=/path/to/keyfile/sdb2key
mkdir -p /mnt/sdb2c
mount -t ext2 /dev/mapper/sdb2c /mnt/sdb2c
где: /path/to/keyfile/sdb2key
— путь к реальному ключевому файлу. Файл(-ы) от других разделов вполне можно хранить на системном разделе, если тот зашифрован.
7. Отмонтирование и отключение раздела (поместить в скрипт /etc/rc.d/rc.local_shutdown
):
umount /mnt/sdb2c
и rmdir /mnt/sdb2c
Можно поместить для успокоения души, tcplay
и xpartx
сами должны при получении KILL
-сигнала корректно завершить работу и ничего не попортить, как они делают с разделами на системном диске
ФАНФАРЫ!
Внимание! Так делать не рекомендуется всеми официальными источниками, но если очень надо, то можно. Используйте на свой страх, риск и хвост!
Если, при клонировании репозитория (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 config --global http.sslVerify "false"
Выполнять надо от root
.
После этого git не будет проверять валидность сертификатов из любых источников.
git config --global http.sslVerify "true"
Т.е. если такой баг только на каком-то одном сайте, то можно выключить, скачать и снова включить. Но помните, это глобальный параметр. Не включите обратно, так и будет игнорировать сертификаты.
Пост для бэкапа, вдруг если что искать потом буду.
Скачать (исходники и готовый пакет для Slackware) version 3.42.0 с Mega.nz
На самом деле, оказалось довольно простой задачей.
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 строки.
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;
Понадобилось подготовить оборудование к отключению в определенное время (отключение электричества от энергокомпании), оборудование разное, под Linux и Windows, сейчас расскажу про Linux.
Проще всего воспользоваться Cron.
Конфигурационный файл Cron не рекомендуется редактировать вручную, тому ще файл один, для всех пользователей, но утилита crontab
его аккуратно собирает, разбирает, и подсовывает собственно планировщику (cron
). Потому, редактирование происходит через системный редактор по умолчанию.
В Slackware системным редактором по умолчанию является неудобный vim
, вот инструкция, как заменить его на что-то более удобоваримое:
Slackware: замена основного (системного) консольного редактора на нормальный. (копия)
Задача, это, собственно, задача — т.е. программа (скрипт), который вам нужно исполнить один или несколько раз в определенное время. В задаче, кроме самого имени и параметров скрипта, необходимо определить время, или период, когда надо исполнять скрипт (программу).
Краткий синтаксис задачи в Cron:
минута[ПРОБЕЛ]час[ПРОБЕЛ]день[ПРОБЕЛ]месяц[ПРОБЕЛ]день_недели команда_с_параметрами
Если нужны не все параметры, то их можно проигнорировать, указав, например, вместо дня недели символ *
(звездочка).
Например, мне нужно отключить оборудование в 12.00 11 марта:
Можно добавлять строки комментариев, начинающиеся с #
.
# Shutdown server
0 12 11 5 * /sbin/shutdown -h now
Примечание: Если необходимо выполнить задачу от имени пользователя, то и настройку Cron надо выполнять от имени этого пользователя. Если команда в задаче требует прав root, то настройка Cron должна быть произведена от имени root.
crontab -l
Корректный запуск редактирования конфигурационного файла Cron осуществляется командой:
crontab -e
Настройка Cron от Losst (копия в PDF)
ЗЫ. Проверил, все работает.
Понадобилось кое-чего поднастроить в 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
в пользовательском(их) каталоге(ах).
1. Нажать ESC 1 раз (иногда дважды)
2. Если не вносили изменений, надо ввести :q
(двоеточие и q
)
3. Если успели что-то напортить :q!
(двоеточие q
и восклицательный знак), vim
закроется, не сохранив файл.
Из пользовательского набора символов:
1. Заглавная, строчная латиница, цифры.
2. Заглавная латиница, цифры.
3. Строчная латиница, цифры.
4. Заглавная, строчная латиница.
P1:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
P2:='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
P3:='abcdefghijklmnopqrstuvwxyz0123456789';
P4:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
Про shred в версии под винды, рассказывал здесь (копия)
И рассказал там про фатальный недостаток утилиты, затирая и удаляя файл она никак не меняет его имени, потому, если вы shred
‘ом удалили файл, например, с именем Путин бомба взрыв чеченцы.doc
, содержимое файла затрется, а название останется. Сделал обертку в виде BAT-файла, чтобы сей недостаток устранить:
Самый простой способ, это просто использовать переменную %RANDOM%
, например, в таком виде:
%TEMP%\%RANDOM%.%RANDOM%
Вариант сгенерированного имени:
C:\Windows\Temp\20422.19028
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%
в винде.
Продолжение. Начало здесь (копия)
Распишу алгоритм, реализованный в функции:
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
). Все свел в таблицу:
Определение длины строки штатными средствами CMD/BAT тот еще геморрой, но понадобилось, потому расскажу про несколько способов. В этом выпуске самый простой.
Команда 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
Вывод на экран для строк:
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, ибо оная идет на старом железе типа третьих пеньков, которых как говна за баней. Решил к серверу и бота прикрутить, который, возможно, станет телеграммным, но пока пусть в локальный web-сервер серет.
Чтоб потестить бота, надо было бредогенератор, т.е. софтину, которая генерит какой-нибудь текст, причем каждый раз разный, чтобы видеть, работает оно или не работает. Просто текстовый файл с «Спецоперацией и русским миром» не подойдет, как и софтина, которая генерит «Съешь этих мягких французских булок»… N строк
Плюс, я планирую расширение оповещений не только в Телеграм, но и на мобилу, даже кнопочную, даже Nokia 3310, так что нужен бредогенератор, умеющий только в латиницу.
Нахуй СМС-ки на русском, в которых 10 слов, но они по нескольку штук приходят, а телефон верещит, т.к. русские буквы в кодировке СМС занимают 2 байта вместо одного.
Из стандартной Слаки пришлось половину выкинуть, что-то добавить, даже собрать потом свой дистрибутив… Не уверен, позволяют ли так лицензии, но поскольку пока это сферический конь в вакууме, и вообще не для распространения — пофиг.
Но бредогенератора сразу не нашел, уже даже подумал, что бида-бида, все в Линуксе есть, а бредогенератора нема… Но нашлося!
+ Генерит тексты в стиле стихов Библии из латинских символов, данные берет из /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, это не вызовет большого баттхерта и забана, так что перекладываю.
Такая маленькая заметочка от склероза, бо в поскакале пишу очень редко, а тут нарвался с 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 удалили в новых версиях виртуальный 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 (с возможностью отмены). (копия)
Они его даже немножечко улУчшили и углУбили, например, перед патчем убивают все процессы, которые могут помешать:
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. И первые деньги программированием заработали (и плюс я свои).
Охуеть, мы не умрем, в смысле как вид! Всякие пердевшие в фукуяму идут нахуй! И в новостях и политике подростки все понимают.
Синтаксис:
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