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 |
|
8/2/23 09:43 am
Slackware: Краткая инструкция по настройке Samba
Ну мало ли.Кто не знает, что это такое. Если говорить по рабоче-крестьянски, инструкция о том, как расшарить в локальную сеть каталог на компьютере с 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 и Network NamespacesSamba прекрасно запускается в сетевом неймспейсе ( копия) если это будет надо. В таком случае, 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: Пример конфига на PastebinЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/08/02/slackware-kratkaya-instruktsiya-po-nastrojke-samba/
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/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/3/23 12:22 am
Совсем простой CrackMe, и как его сломать.
ПреамбулаПопросили показать самый простой пример по реверсингу. Ну ладно, сделал простейшую программу, окно где надо ввести пароль: Ввели правильно, получаем окно одобрямса: Ввели неверно, программа отправляет на повторный ввод с сообщением об ошибке: Если нажать Cancel - программа просто завершится. Сам CrackMe сделан на базе прошлого примера окна типа InputBox ( копия), не стал даже с закрытием "пароля" "звездочками" заморачиваться, говорю же, очень простой CrackMe, естественно, без всякой упаковки и навесных защит. Вообще, пароль можно подсмотреть, открыв экзешник, например, в просмотровщике Far Manager по F3: Прямо как в некоторых старых DOS-программах, где защита от копирования была скорее защитой от дурака, или в форках некоторых приставочных игр под DOS, где таким же образом можно было получить код от уровня. Но мы пойдем другим путем, как завещал великий Ленин! Хотя способ будет не сильно далеким от "подсмотра", чтоб было слегка посложнее и интереснее - не будем пользоваться отладчиком, а воспользуемся дизассемблированием. В отладчике вместо одного шага (простого подсмотра пароля) будет полтора, а так все же веселее. И задача, естественно, модифицировать программу так, чтобы подходил любой пароль. ( Читать далее )Ссылки1. Исходник CrackMe2. Бинарный файл3. Чтоб два раза не вставать: Разница между инструкциями test и cmp Копия в PDFЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/03/03/sovsem-prostoj-crackme-i-kak-ego-slomat/
6/7/22 08:33 am
Консольный hello, world на MASM32. Трактат с подробным разбором, лирическими отступлениями и дополне
ПреамбулаИтак, обещал рассказать, как все-таки написать консольный Hello, world на ассемблере, и выбрал для этого MASM, потому что TASM'овский компилятор довольно давно полумертв, и не умеет из коробки некоторых базовых вещей, например, не умеет указывать подсистему (это изменение одного поля в заголовке PE-файла), в которой должна работать программа под Win32. Подсистем есть несколько, но нас пока интересуют две: WINDOWS и CONSOLE . Первая, для оконных приложений, а вторая - для консольных. Если ОС будет видеть, что приложение консольное, она проверит, открыта ли для него консоль уже (если мы запускаем приложение через cmd , или Far manager, например), и откроет для него консоль, если мы запускаем приложение из оконной среды, щелкая по экзешнику мышкой. Это избавляет нас от геморроя, вручную контролировать консоль, открывать ее, закрывать, освобождать. Хотя, принципиальных ограничений нет - консольное приложение спокойно может открыть, как стандартное диалоговое окно, так и вообще создать полноценную форму, а оконное приложение - открыть консоль. ( Далее под катом... )Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/06/07/konsolnyj-hello-world-na-masm32-traktat-s-podrobnym-razborom-liricheskimi-otstupleniyami-i-dopolneniyami/
5/30/22 10:26 pm
MASM32: .386 .model, STDCALL, что это такое.
Совсем краткое пояснение. Как театр начинается с вешалки, так программа на ассемблере MASM начинается с указания набора инструкций:
.386
Это ассемблеpная диpектива, говоpящая ассемблеpу использовать набоp опеpаций для пpоцессоpа 80386. Вы также можете использовать .486, .586, но самый безопасный выбоp - это указывать .386. Также есть два пpактически идентичных выбоpа для каждого ваpианта CPU. .386/.386p, .486/.486p. Эти "p"-веpсии необходимы только когда ваша пpогpамма использует пpивилигиpованные инстpукции, то есть инстpукции, заpезеpвиpованные пpоцессоpом/опеpационной системой в защищенном pежиме. Они могут быть использованны только в защищенном коде, напpимеp, дpайвеpами. Как пpавило, ваши пpогpаммы будут pаботать в непpивилигиpованном pежиме, так что лучше использовать не-"p" веpсии. (Из мануала Iczelion'а)
.model flat
.model - модель памяти, используемая вашей программой. Для DOS, например, были модели tiny , small , compact , flat , lagre и т.д. - они выбирались в зависимости от типа программы. По ограничениям DOS сегмент кода не мог занимать пространство, больше размера одного сегмента в памяти. Чтоб это обойти, как раз и использовалась сегментация. Tiny и flat могли быть использованы для оригинальных DOS-программ, с расширением .com , которые могли занимать чуть меньше одного сегмента (64 Кб), на код и данные, и представляли собой просто кусок кода вместе с данными, можно сказать RAW-формат исполняемого файла - просто откомпилированный байткод, даже без всякого заголовка. Для EXE формата, код и данные могли занимать несколько сегментов.
В Win32 сегментация памяти не нужна, во-первых, размер адреса 32-битный, что больше, чем в DOS, во-вторых, менеджментом памяти занимается ОС, потому программа видит все нужные ей внешние библиотеки и функции из них, как если бы они были загружены в адресное пространство программы. Таким образом, программа под Win32 изнутри представляет такой себе очень большой .COM-файл, потому используется только одна модель памяти - flat .
.model flat, stdcall
У директивы .model есть несколько важных параметров, самый главный из них, указание на передачу параметров функций (обычно внешних, из DLL, но никто не мешает для своих функций использовать). Его и указываем через запятую (stdcall ).
Есть три способа передачи параметров: - C (си) способ: вызывающая, т.е. наша программа, должна положить в стек нужные параметры, причем, в обратном порядке. Например, если функция описывается так:
SomeFunction (Argument1, Argument2, Argument3)
То на ассемблере она вызывается так:
push Argument3 push Argument2 push Argument1 call SomeFunction
А далее, вызывающая программа должна почистить стэк (по-научному это называется "уравнять"), push уменьшает значение регистра стека на размер операнда (2 или 4 байта), пусть будет 4, тогда получается, что надо увеличить значение стека на 3x4=12 байт.
add SP, 12
C-поpядок полезен, когда вы не знаете, как много паpаметpов будут пеpеданны функции
- PASCAL - это C соглашение наоборот, параметры передаются в прямой последовательности, т.е. первый параметр кладется в стек первым, а со стеком должна разбираться сама вызываемая функция.
- STDCALL - это гибрид C и PASCAL соглашения, параметры передаются в обратном порядке, но со стеком разбирается вызываемая функция.
Win32 использует практически исключительно STDCALL соглашение для своего API, исключая функцию wsprintf() , потому что она не знает, сколько ей будет передано параметров. При ее вызове следует использовать C -соглашение.
Ошибка в windows.inc (MASM)Если вы используете include-файл windows.inc в MASM, и при компиляции происходит ошибка windows.inc(78) : error A2119: language type must be specified , значит, забыли указать параметр stdcall в директиве .model Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/05/30/masm32-386-model-stdcall-chto-eto-takoe/
5/23/22 05:29 am
О формате объектных файлов и библиотек COFF и OMF, и об опасности их смешения.
На рассвете цивилизации ПК и примерно до того времени, когда появились инструменты программирования Microsoft Win32, почти все компиляторы для ПК создавали объектные файлы с использованием стандарта Intel Object Module Format (OMF). Позже Intel представила процессоры 386 и 32-разрядный защищенный режим, после чего они также расширили спецификацию OMF для 32-разрядных систем, что привело к появлению «OMF-386», который стал стандартом для большинства сред защищенного режима ПК. Примерно в это же время исходная группа разработчиков Windows NT также разрабатывала код не только для процессоров Intel, но и для поддержки процессоров других производителей. Команда Microsoft NT выбрала более переносимый формат объектных модулей, известный как Common Object File Format (COFF), производный от официального формата объектного кода для UNIX System V. Объектные модули COFF позже стали стандартом де-факто для всех инструментов разработки Microsoft Win32 и получили преимущество в том, что он намного ближе по формату к переносимым исполняемым файлам (PE) - собственному исполняемому формату для Win32 (компоновщику формата COFF требуется гораздо меньше усилий для создания 32-разрядного EXE или DLL из файла COFF, чем из файла формата OMF).
Помимо объектных файлов форматов OMF и COFF (.obj ), существуют также файлы библиотек форматов OMF и COFF (.lib ). Библиотеки, к счастью, в основном представляют собой просто набор объектных файлов вместе с заголовочной информацией, которая позволяет компоновщику определить, какие объектные файлы из библиотеки использовать. Однако, чтобы усложнить ситуацию, и OMF, и COFF используют одни и те же расширения имен файлов, .obj и .lib , для ссылки на два разных типа форматов файлов объектов и библиотек (из-за этого вы не можете просто посмотреть на расширение имени файла чтобы узнать, является ли объектный модуль или файл библиотеки OMF или COFF).
Проблема со смешиванием объектных файлов и файлов библиотек от разных производителей компиляторов заключается в том, что одни поставщики поддерживают COFF, другие используют OMF, а некоторые могут работать и с тем, и с другим. Borland, например, по-прежнему использует объектные файлы и библиотеки OMF, тогда как 32-разрядные компиляторы Microsoft создают файлы формата COFF. Watcom C/C++ v11.0, по-видимому, предпочитает COFF при компиляции и компоновке приложений Windows, но создает объектные файлы OMF для использования с 32-разрядным DOS-расширителем защищенного режима DOS4GW. Microsoft MASM 6.13 по умолчанию создает файлы OMF, но параметр командной строки /coff указывает компилятору, что он должен создавать объектные файлы COFF.
Когда приходится связывать файлы разных форматов, разные компоновщики делают разные вещи. Например, компоновщик Microsoft Visual C/C++ предназначен для объектных файлов и библиотек формата COFF, но при необходимости попытается преобразовать объектные файлы OMF в файлы COFF. В некоторых случаях это работает, но, к сожалению, Microsoft LINK не поддерживает все типы записей OMF, поэтому во многих ситуациях компоновщик может дать сбой при работе с объектными файлами формата OMF. Кроме того, хотя Microsoft LINK пытается поддерживать объектные файлы OMF, он отказывается обрабатывать любые библиотеки формата OMF. Другие компоновщики, такие как TLINK от Borland, предназначены для объектных файлов OMF и аналогичным образом отказываются работать с объектными или библиотечными файлами формата COFF. Некоторые поставщики расширителей DOS и встраиваемых систем, такие как Phar Lap, предоставляют свои собственные компоновщики, поддерживающие как OMF, так и COFF, что дает вам возможность выбора.
Проблема в том, что смешение OMF и COFF типов объектных файлов и файлов библиотек может привести к хаосу. Вдобавок появляются загадочные сообщения об ошибках от компоновщиков, которые только вносят еще большее непонимание. Если ваш компоновщик не поддерживает определенный формат, вам следует придерживаться рекомендуемого формата объекта и библиотеки для вашего компилятора/компоновщика/платформы и избегать смешивания файлов OMF и COFF.
Перевод: Leha Silent для tolik-punkoff.com Оригинальный текст (англ., TXT) предоставил Jiang Yap из WeChat Копия перевода в TXT
Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/05/23/o-formate-obektnyh-fajlov-i-bibliotek-coff-i-omf-i-ob-opasnosti-ih-smesheniya/
5/23/22 03:02 am
Assembler: проверка условий и переходы (jump)
Небольшая шпаргалка по условным и безусловным переходам.
Безусловный переход: выполняется командой JMP <метка> , может использоваться, как для перехода вперед, пропуская некоторые команды в коде, так и для возврата назад, для повторного выполнения инструкций:
1.
...
какой-то код
...
JMP label1
...
какой-то код
...
label1:
...
другой код
выполняется после срабатывания
инструкции JMP
...
2.
...
какой-то код
...
labelret:
...
какой-то код
...
JMP labelret
Условный переход: Выполняется, если выполнено какое-либо условие, переход осуществляется командой Jxx <метка> , где xx - мнемоника, указывающая на проверяемое условие.
Инструкция CMPИнструкция CMP сравнивает два операнда, в основном вычитая один операнд из другого для сравнения, равны ли операнды или нет, не изменяя целевой или исходный операнд. Инструкция CMP используется вместе с инструкцией условного перехода для принятия решения. CMP изменяет регистр флагов, который потом проверяет соответствующая инструкция условного перехода, и осуществляет (не осуществляет) переход по соответствующему адресу (метке). Синтаксис: CMP целевой_операнд, исходный_операнд CMP сравнивает два числа. В качестве целевого операнда может использоваться значение в регистре или в памяти. Исходный операнд может быть константой ( EQU ), непосредственно числом, значением в регистре или памяти. Так же, оба операнда не могут быть одновременно значениями в памяти. Правильно | Неправильно | Ошибка (MASM) | cmp eax, ecx | MYVALUE1 dd 2 MYVALUE2 dd 5 ... cmp MYVALUE1, MYVALUE2 | invalid instruction operands | cmp eax, 0 | cmp 0, eax | immediate operand not allowed | ERROR_FLAG EQU 16h ... cmp eax, ERROR_FLAG | ERROR_FLAG EQU 16h ... cmp ERROR_FLAG, eax | immediate operand not allowed | MYVALUE dd ? ... cmp eax, MYVALUE | - | - | MYVALUE dd ? ... cmp MYVALUE, eax | - | - | MYVALUE dd ? ... cmp MYVALUE, 0 | MYVALUE dd ? ... cmp 0, MYVALUE | immediate operand not allowed | MYVALUE dd ? ERROR_FLAG EQU 16h ... cmp MYVALUE, ERROR_FLAG | MYVALUE dd ? ERROR_FLAG EQU 16h ... cmp ERROR_FLAG, MYVALUE | immediate operand not allowed | - | cmp 0, 1 | immediate operand not allowed | - | CONST1 equ 1 CONST2 equ 2 ... cmp CONST1, CONST2 | immediate operand not allowed |
Также нужно быть внимательным при сравнении значения в памяти и регистре, если их размерность будет не совпадать, это приведет к ошибке компиляции. Например, при сравнении регистра EAX , имеющего разрядность двойное слово (DWORD) с переменной, разрядность которой установлена, как байтовая ( DB ): ... MYVALUE db 1 ... cmp eax, MYVALUE ... ;Ошибка: invalid instruction operands Условные переходыРезультаты арифметических операции для знаковых чиселИнструкция | Описание | Проверяемые флаги | JE/JZ | Если значения равны/Если значение 0 | ZF | JNE/JNZ | Если значения не равны/Если значение не 0 | ZF | JG/JNLE | Если больше/Если не меньше или равно | OF SF ZF | JGE/JNL | Если больше или равно/Если не меньше | OF SF | JL/JNGE | Если меньше/Если не больше или равно | OF SF | JLE/JNG | Если меньше или равно/Если не больше | OF SF ZF |
Результаты арифметических операции для беззнаковых чисел или логических операций
Инструкция | Описание | Проверяемые флаги | JE/JZ | Если значения равны/Если значение 0 | ZF | JNE/JNZ | Если значения не равны/Если значение не 0 | ZF | JA/JNBE | Если больше/Если не меньше или равно | CF ZF | JAE/JNB | Если больше или равно/Если не меньше | CF | JB/JNAE | Если меньше/Если не больше или равно | CF | JBE/JNA | Если меньше или равно/Если не больше | AF CF |
Прочие инструкции для условных переходовЭти инструкции имеют специальное применение и проверяют значения отдельных флагов во флаговом регистре. Инструкция | Описание | Проверяемые флаги | JXCZ | Если значение в регистре CX равно 0 | Нет | JC | Если произошел перенос в результате арифметической операции | CF | JNC | Перенос не произошел | CF | JO | Произошло переполнение | OF | JNO | Переполнение не произошло | OF | JP/JPE | Число единичных бит четное | PF | JNP/JPO | Число единичных бит нечетное | PF | JS | Число со знаком (отрицательное) | SF | JNS | Число без знака (положительное) | SF |
СсылкиРегистр флагов с описанием значений флагов ( копия) Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/05/23/assembler-proverka-uslovij-i-perehody-jump/
5/4/22 03:14 am
Переключение раскладки на экранной клавиатуре Windows 7
По-прежнему, чиним деньгополдощательные терминалы и всякие прочие АРМ, потому понадобилось, заметка от склероза, чтоб не забыть, да и другим полезно будет.
Вызов экранной клавиатурыРассматриваем способы, как ее вызвать, если доступа к физической клавиатуре нет совсем. 1. ПУСК --> Все программы --> Стандартные --> Специальные возможности --> Экранная клавиатура2. Добираемся мышекликом до экзешника: %windir%\system32\osk.exe Где %windir% - каталог с установленной Windows (обычно C:\Windows ). Если надо вызвать программу с командной строки (для справки), то соответственно, команда: osk Примечание: Экранная клавиатура, как и физическая, поддерживает только раскладки клавиатуры (языки ввода) установленные в системе, т.е., если русский язык, например, в системе не установлен совсем, то и переключиться на наго нельзя. Способ №1Самый простой. Не пользоваться для переключения языка ввода и раскладки экранной клавиатурой, все спокойно можно делать мышью, с помощью значка индикатора клавиатуры в системном трее. Способ №2Щелкаем те же клавиши, которые установлены для переключения клавиатуры в системе, и не задерживаясь, нажимаем ту, с которой начали. Т.е. если переключение клавиатуры настроено на Alt+Shift, то на экранной клавиатуре жмем Alt, потом Shift (или наоборот, сначала Shift потом Alt), а потом возвращаемся к первой клавише, если первой нажимали Alt - нажимаем Alt второй раз, если первый раз нажимали Shift - второй раз нажимаем Shift. Если в системе установлена комбинация Ctrl+Shift, действия аналогичны, только нажимаем соответствующие клавиши на экранной клавиатуре Переключение раскладки: Раскладка переключилась: ТЕЛЕМАРКЕТ! Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/05/04/pereklyuchenie-raskladki-na-ekrannoj-klaviature-windows-7/
5/3/22 05:02 am
Если Windows XP внезапно упала в синий экран на более-менее современном компьютере.
Что делать, и как это порешать. AHCI --> IDE. Инструкция для и по просьбе заводского эникейщика.
ПреамбулаНа многих старых и надежных аппаратах (АРМ станков с ЧПУ, терминалах) вполне может быть установлена Windows XP, свои функции она выполняет, а специализированный софт, например, может не подо что другое не работать. Если вдруг ломается насмерть машина, обычно покупают компьютер, который совместим с XP, но рассчитан на более современную систему. Но при некоторых условиях, совместимые с XP машины, могут все равно отправить при некоторых ситуациях XP в синий экран. Впрочем, восстановить запуск XP в некоторых случаях возможно без переустановки Windows, подправив настройки BIOS (UEFI). ПервопричинаПервое, что надлежит в таком случае проверить, это не слетел ли BIOS АРМ или встроенного компьютера к начальным настройкам. Если это так, то при загрузке на экране может появиться что-то типа: CMOS Checkum error ... Press F1 to Run SETUP ... Крупный вариантВ данном случае сначала следует заменить батарейку CMOS, располагающуюся на материнской плате. Как это сделать для стандартного PC есть, например, в этом видео. Примечание: На некоторых материнских платах батарейка BIOS может оказаться под внешней видеокартой, тогда, перед заменой батарейки, нужно сначала изъять видеокарту из слота. Примечание: Не забываем про ТБ! Все операции с разборкой системного блока и заменой батареи выполняем при отключенном от сети системном блоке! Видел в некоторых видео, что можно так не делать, так вот отключать от сети нужно всегда! Если случайно закоротите контакты, можно получить или BIOS, требующий перепрошивки, или вообще горелую материнку. Электричество, какое маленькое оно бы не казалось, безалаберности не терпит!Причина падения XPЕсли у более новых компьютеров обнулился BIOS/UEFI и возвратился к заводским настройкам, то, скорее всего, произошло переключение режима работы контроллера жесткого диска с IDE-совместимого в AHCI, AHCI в XP поддерживается с большим бубном, потому им обычно никто не заморачивается, если особо не надо, переключают контроллер в режим IDE-совместимости и телемаркет. А вот если контроллер переключится обратно сам, после возврата BIOS к заводским настройкам, то XP упадет в синий экран. Переключение контроллера HDD в режим IDE-совместимости на примере ASUS UEFI BIOS1. Заходим в BIOS, на главной странице выбираем Advanced Mode (или нажимаем клавишу F7) 2. В появившемся окне отвечаем OK: 3. Переходим на вкладку Advanced: 4. Выбираем SATA configuration: 5. Нажимаем ENTER и в появившемся меню выбираем IDE: 6. Сохраняем настройки и перезагружаемся ( F10) ТЕЛЕМАРКЕТ! Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/05/03/esli-windows-xp-vnezapno-upala-v-sinij-ekran-na-bolee-menee-sovremennom-kompyutere/
1/31/22 05:24 am
Inksсape: Текст по окружности.
Пост из серии "Спрашивали - отвечаем". Спросили, а как сделать на рисунке текст по окружности, как например, на этом плакате. Впрочем, тут я довольно неаккуратно допиливал старый плокад, так что можно было и лучше. Так что начнем сначала.
1. Рисуем круги, логотип в круге, если это надо, помещаем надписи сверху и снизу, или только сверху, или только снизу, в зависимости от того, что вы хотите сделать. Подбираем надписям нужный шрифт. Пример:
Крупный вариант скрина( Далее с иллюстрациями под катом )2. Теперь можно отодвинуть и удалить ненужный круг. https://i.imgur.com/92bNi9O.pngТакже можно сделать и с первым кругом, если он не нужен. ФАНФАРЫ! Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/01/31/inkssape-tekst-po-okruzhnosti/
8/20/21 11:41 pm
CMD/BAT, содержит ли переменная число.
ПреамбулаВ BAT-файлах нет типа переменных, тип разрешается в каждом конкретном случае. Впрочем, это так в большинстве командных языков, в линуксовом bash тоже нельзя явно задать тип переменной. При этом, процессор cmd не считает числом: - Числа в системах счисления отличных от десятичной. - Числа с плавающей точкой (действительные, дробные). - Если есть лидирующие нули, например 00150 не распознается как число. Хотя с этим мы поборемся. Числами считаются только целые числа в диапазоне -2147483648..2147483647 . Так как же проверить, число в переменной BAT/CMD-файла или нет? Будем разбираться. Оставим числа в системах счисления, отличных от десятичной, а также дробные числа. Нормальных механизмов работы в BAT/CMD с ними нет, так что и не будем усложнять. Решение1. Включаем расширенный режим ( копия) обработки команд. В Windows, начиная с XP SP2 он включен по умолчанию, но лучше явно прописывать для совместимости: SetLocal EnableExtensions 2. Проверка на пустую переменную. Процессор BAT/CMD считает неинициализированную или пустую переменную пустой, и не задает ей значение 0, если она используется в качестве численной переменной. Так что изначально надо проверять, не пуста ли переменная. В тестовом примере значение передается в параметре командной строки, его и проверим, а потом запишем значение во внутреннюю переменную скрипта: rem test if no or void parameter (variable)
if "%~1" == "" (
echo No arguments. Use "%~n0%~x0 <test pattern>"
exit /b 1
)
set INP=%~1
%~n0%~x0 - при расширенной обработке команд %~n достает из переменной, в данном случае переменной %0 имя файла, %~x расширение с точкой. %0 - переменная, содержащая путь к BAT/CMD-файлу 3. Боремся с лидирующими нолями. Данная команда их удалит: for /f "tokens=* delims=0" %%a in ("%INP%") do set INP=%%a 4. Эта команда сохранит, например 000100 , превратив его в 100 , но удалит 0 или 000... , так что если переменная после операции оказалась пустой, значит она содержала 0 , надо его восстановить, дабы далее избежать ошибок: if "%INP%" == "" ( set INP=0 ) 5. Число или строка. Теперь можно определить, число или строка в переменной, произведя над ней арифметическое действие не изменяющее значение, например, умножение на 1 . Сделать это можно с помощью команды set /a . Остается сравнить полученный результат с оригиналом. Если результат операции не равен оригиналу, то в переменной не число, а строка, т.к. результат арифметической операции над строкой всегда будет равен 0 : rem number or not number
set /a "TINP=INP*1"
if NOT %TINP% == %INP% (
echo Not number!
exit /b 2
)
6. Положительное или отрицательное число. Далее остается только сравнить числа с 0 с помощью оператора IF и операций сравнения: Операнд сравнения | Описание | EQU | Равно | NEQ | Не равно | LSS | Меньше | LEQ | Меньше или равно | GTR | Больше | GEQ | Больше или равно |
rem number type
if %INP% GEQ 0 (
echo Positive integer
exit /b 0
)
if %INP% LSS 0 (
echo Negative integer
exit /b 0
) Скрипт целикомНа GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: http://tolik-punkoff.com/2021/08/17/cmd-bat-soderzhit-li-peremennaya-chislo/
8/1/21 08:33 pm
CMD/BAT, генерация случайных чисел.
Применимо к линейке ОС Windows NT, начиная, как минимум с Windows 2000, x86 и x64 версий[прим. ред.]
Командный процессор Windows (CMD) содержит встроенную переменную %RANDOM% , которую можно использовать для генерации случайных чисел.
%RANDOM% генерирует случайное целое число от 0 до 32767 (включительно).
echo %RANDOM%
Диапазон генерируемых чисел можно уменьшить с помощью небольшого лайфхака, команда SET не только устанавливает значение пользовательских переменных окружения, но и может производить простейшие арифметические операции.
Например, можно сгенерировать случайные числа в диапазоне от 1 до 500 :
@ECHO OFF SET /a _rand=(%RANDOM%*500/32768)+1 ECHO Random number: %_rand%
Если попытаться сгенерировать случайные числа больше чем 32767 , то это приведет к проблемам, хотя с виду все будет работать. Например, если в вышеприведенном коде заменить 500 на 65536 , то это приведет к генерации последовательности "случайных" чисел, которая будет состоять только из нечетных чисел.
Распределение возвращаемых чисел определяется, как диапазоном, так и количеством итераций генерации случайных чисел.
Например, если вы генерируете числа в диапазоне от 1 до 100 то в среднем:
- При генерации 10 чисел, примерно 6% будут дублироваться - При генерации 100 чисел, этот процент вырастет до 63, т.е. 63% сгенерированных чисел будут дубликатами, т.е. совпадать с одним или несколькими из остальных 99 чисел. - Если сгенерировать 1000 чисел, почти все будут дублироваться, т.к. есть только 100 возможных значений.
Случайные и псевдослучайные числаПсевдослучайная последовательность не является истинно случайной и определяется небольшим набором начальных условий. В случае %RANDOM% , начальное значение зависит от текущего времени (системного таймера), когда произошел запуск экземпляра командного процессора. Это может создать проблему, когда проходит примерно одно и то же время перед обращением к переменной %RANDOM% и запуском самого скрипта, одновременно со стартом экземпляра командного процессора. Возвращаемое число будет находиться в небольшом предсказуемом диапазоне. В качестве примера создайте файл numbers.cmd , содержащий следующий код: @Echo off Echo %RANDOM% И запустите его следующим образом: cmd /c numbers.cmd cmd /c numbers.cmd cmd /c numbers.cmd ... Раймонд Чен из MSFT подробно описывает, почему %RANDOM% в cmd.exe не такой уж случайный.Йоханнес Баагё опубликовал сравнение лучших алгоритмов генерации случайных чисел на javascript. Самый быстрый из них - Alea(), копия которого представлена по ссылкам ниже или в источнике. Эта реализация имеет ряд преимуществ: можно генерировать числа большие, чем позволяет %RANDOM% , можно быстро сгенерировать много чисел, можно создавать псевдослучайные последовательности, т.е., результаты станут повторяемы, если вы вызовете скрипт с указанием одного и того же начального числа, т.е сами зададите начальные условия. Впрочем, не стоит использовать эти "случайные числа" для чего-то серьезного, в винде так и нет нормального штатного генератора случайных чисел, и изначально не было. В худшем случае стоит пользоваться библиотеками криптопровайдера, в лучшем - аппаратным генератором. (прим. ред.)Скрипт random.js на PasteBinИсточникПеревел Серёга "PTZSnake jr." Неклюев Специально для Tolik-punkoff.com Редактор: Leha Silent Все права идут нахуй. Это репост с сайта http://tolik-punkoff.com Оригинал: http://tolik-punkoff.com/2021/07/31/cmd-bat-generatsiya-sluchajnyh-chisel/
7/15/21 05:19 am
Включение, отключение и настройка режима гибернации в Windows 7 и выше.
Сон, гибернация, ждущий режим и все все все. Немного терминов и определений.Сон (Windows Vista и выше) или Ждущий режим (Windows XP) - временное завершение работы ОС без выгрузки оперативной памяти в файл и закрытия приложений, т.е. ОС приостанавливает активную работу, снижает нагрузку на процессор, "гасит" ненужную периферию (монитор, жесткие диски, и даже останавливает вентиляторы, один фиг нагрузка на процессор минимальна). Выход из этого режима и возвращение к работе происходит по нажатию клавиш клавиатуры или кнопки питания на системном блоке ATX (они все сейчас ATX), или по прерыванию от мыши (можно изменить в настройках) или модема (у кого есть аналоговый модем? :)) . Минусы этого режима: - При отключении питания все несохраненные данные пропадут, т.к. фактически произойдет отключение питания у работающей машины, просто со сниженным до минимума энергопотреблением. - При использовании внешних средств полного шифрования ОС, например, таких, как VeraCrypt и TrueCrypt, компьютер останется незащищенным до конца. Плюсы: + Быстрый переход и выход из данного режима + Экономия места на системном диске, т.к. ОС не нужно держать на диске файл, размер которого равен размеру оперативной памяти, собственно, для выгрузки в него содержимого оперативной памяти. Гибернация (Windows Vista и выше) или Сон (Windows XP) - завершение работы ОС и компьютера с предварительной выгрузкой оперативной памяти в файл hiberfil.sys с последующим полным отключением питания ПК. При повторном включении, ОС загружает содержимое файла hiberfil.sys обратно в оперативную память и продолжает работу. Минусы: - Требуется дополнительное место на диске. - Если злоумышленнику удастся получить доступ к hiberfil.sys , то возможна атака даже на систему, защищенную TrueCrypt и VeraCrypt (вроде как не всех версий). Пример атаки ( копия) - Более долгое время для перехода в рабочее состояние, по сравнению с режимом сна. Плюсы: + В случае отключения электропитания в режиме гибернации, данные не потеряются. + Если системный диск зашифрован TrueCrypt/VeraCrypt потребуется ввод пароля Гибридный спящий режим (присутствует, начиная с Windows Vista, включен по умолчанию) - сочетание первого и второго режима, электропитание компьютера не отключается полностью, а "гасится" только ненужная периферия, при этом оперативная память сбрасывается в hiberfil.sys . Восстанавливает информацию из оперативной памяти, если во время спящего режима возник сбой питания (да, работает, я проверил). Сочетает плюсы и минусы предыдущих режимов. Включение режима гибернации.Если "Сон" по умолчанию присутствует в меню "Завершение работы", то пункт "Гибернация" приходится включать вручную. 1. Проверяем, включен ли режим гибернации (или гибридный спящий режим), для этого открываем диск C: и смотрим, присутствует ли в корне диска файл hiberfil.sys . Файл является скрытым, потому включаем отображение скрытых файлов (ну или смотрим через Far Manager, например). Если файла нет, как на иллюстрации, значит, режим гибернации полностью отключен. Если файл есть, переходим к пункту 5. 2. Запускаем командную строку от имени администратора ( Пуск --> Все программы --> Стандартные) 3. Выполняем команду: powercfg /h on 4. Перезагружаем компьютер. Файл hiberfil.sys появился. ( Далее под катом... )Полное отключение режима гибернации и гибридного спящего режима.Если необходимо полностью отключить режим гибернации и гибридный спящий режим, а также удалить файл hiberfil.sys : 1. Нужно запустить командную строку в режиме администратора. 2. В командной строке ввести команду: powercfg /h off 3. Параноики могут после этого запустить очистку свободного места на диске в любой программе безопасного удаления файлов, например, в Eraser'е. Почему не происходит переход в спящий режим/режим гибернацииНаиболее частая причина состоит в том, что этому может мешать какая-то программа: - Просто зависшее приложение. - Программа, производящая активные действия с файловой системой (архиватор, архивирующий/разархивирующий файлы, файловый менеджер, копирующий файл). - Программы, способные запретить переход в спящий режим/режим гибернации: будильники, таймеры, торрент-клиенты, "качалки", и даже некоторые вирусы и скрытые майнеры. Это репост с сайта http://tolik-punkoff.com Оригинал: http://tolik-punkoff.com/2021/07/14/vklyuchenie-otklyuchenie-i-nastrojka-rezhima-gibernatsii-v-windows-7-i-vyshe/
10/29/20 02:30 am
Отключение спящего режима на Android
Начальство попросило сделать секретарше отдельные настольные часы, чо, нашел старый смартфон с 5 стоковым андроидом и дохлым радиомодулем, т.е. не связи, не вайфая, как раз годен только часы отображать. Была проблема с тем, что телефон засыпал, соответственно, переставал часы показывать.
Как вылечить нашел здесь Копия в PDF
Заодно уж, как зайти в режим разработчика Копия в PDF
Это репост с сайта http://tolik-punkoff.com Оригинал: http://tolik-punkoff.com/2020/10/28/otklyuchenie-spyashhego-rezhima-na-android/
8/8/20 04:49 am
Обновление своего плагина для Firefox
ПреамбулаВ прошлом году писал заметку Делаем свое расширение для Firefox ( копия), теперь краткая инструкция, как его обновить, если внесены изменения. Загрузка обновления на сайт дополнений1. Правим код, не забываем изменить номер версии в manifest.json , добавляем нужные файлы, упаковываем в ZIP-архив, переименовываем файл в *.xpi 2. Идем на https://addons.mozilla.org/ru/developers, жмем большую кнопку Отправить или управлять расширениями, логинимся. 3. Жмем в верхнем меню Мои дополнения, проваливаемся сюда: . Жмем Новая версия. 4. Загружаем файл дополнения кнопкой Выбрать файл...У меня проверка прошла с первого раза. 5. Далее попадаем сюда: Нас спрашивают, не использовали ли мы обфускаторы кода. Мы не использовали, если была использована библиотека jquery-?.?.?.min.js , чей код ужат, чтоб занимал меньше места - ничего страшного, Мозилла автоматом определяет, что используется известная версия библиотеки. Жмем Продолжить, попадаем на страничку, где можно ввести описание изменений (видно всем пользователям) и комментарий для проверяющих. Одобрение, видимо из-за небольших изменений в дополнении, пришло практически моментально, похоже, в автоматическом режиме. Это репост с сайта http://tolik-punkoff.com Оригинал: http://tolik-punkoff.com/2020/08/07/obnovlenie-svoego-plagina-dlya-firefox/
1/22/20 12:49 am
Записать вывод awk в несколько переменных bash
Или как раскидать результат работы awk по нескольким переменным.
ПреамбулаПредположим, у нас есть некоторая таблица в виде файла CSV с набором полей, например таких Login,FullName,Phone,Room,WorkTime и разделителем полей , (запятая): verb666,Misha Verbitsky,+415314499922,42,11:00-16:00 ktvs421,Vasiliy Kotov,+415314499966,77a,00:00-06:00 dkldn89,Dmitry Kaledin,+415314499949,65b,22:00-00:00 vfurry1,Veniamin Furman,+415314499900,99,12:20-19:25 tpunk56,Tolik Punkoff,+415314499911,59,00:00-11:00 Нужно вытащить из нее некоторые данные, и далее как-либо обработать. Вытащить данные можно с помощью awk , используя оператор print , но возникает вопрос, как передать данные обратно в bash. Предположим, что заголовок удален, в файле остались только данные. awk и evalВ bash есть встроенная команда eval , преобразующая переданную ей строку в команду или набор команд оболочки, и запускающая ее на выполнение. Этим и воспользуемся. 1. Организуем цикл, в котором будем производить обработку данных: IFS_=$IFS IFS=$'\n' for TMPSTRING in $(cat "demotable.txt") do #тут будет код done IFS=$IFS_ Перед циклом я подправил переменную $IFS содержащую глобальные разделители, в нее, в частности, "смотрят" операторы циклов, чтобы определить, где начинается следующий элемент. По умолчанию переменная $IFS содержит пробел, табуляцию и перевод строки, но поскольку у нас есть данные с пробелом, то это не подходит, цикл будет работать неверно. Потому сохраняем старое значение во временную переменную, устанавливаем новое значение в перевод строки ( \n ). После цикла возвращаем значение на место. В цикле организуем разбор данных: echo "$TMPSTRING"|awk -F "," '{print "LOGIN=" $1; print "FULLNAME=" $2 print "PHONE=" $3; print "ROOM=" $4; print "WORKTIME=" $5 }' Если запустить скрипт сейчас, то он выведет следующее: LOGIN=verb666 FULLNAME=Misha Verbitsky PHONE=+415314499922 ROOM=42 WORKTIME=11:00-16:00 Т.е. уже похоже на присваивание значений переменным bash, но есть проблема. Если мы сейчас скормим вывод awk eval 'у, то получим ошибку, например такую: ./awk2vars01: line 8: Verbitsky: command not found А если бы и не получили, то в переменных могла бы оказаться всякая ерунда, строки необходимо экранировать кавычками. awk print и вывод кавычкиКавычки для оператора print awk являются служебными символами, в двойные кавычки берутся строковые литералы, т.е. те строки, которые нужно вывести без изменений, как например, "LOGIN=" в коде выше, а в одинарные - вся программа awk . Экранирование ( \" или \' ) в операторе print приведет к ошибке. Решение - завести внутреннюю переменную awk , содержащую кавычку, и печатать ее в нужном месте: echo "$TMPSTRING"|sed -e 's~'\''~~g'|awk -F "," '{print "LOGIN=" sq $1 sq;
print "FULLNAME=" sq $2 sq; print "PHONE=" sq $3 sq; print"ROOM=" sq $4 sq;
print "WORKTIME=" sq $5 sq}' sq="'"
Поскольку данные строки далее будут переданы в eval и обработаны как команды оболочки, то необходимо позаботиться о безопасности, и использовать только одинарные кавычки, а также удалять одинарные кавычки из входных строк, при передаче их awk: Об опасности использования eval в bash-скриптах. КопияВывод: LOGIN='verb666' FULLNAME='Misha Verbitsky' PHONE='+415314499922' ROOM='42' Теперь можно обернуть все это в eval , чтобы раскидать результат работы awk по переменным. eval $(echo "$TMPSTRING"|sed -e 's~'\''~~g'|awk -F "," '{print "LOGIN=" sq $1 sq;
print "FULLNAME=" sq $2 sq; print "PHONE=" sq $3 sq;
print"ROOM=" sq $4 sq;
print "WORKTIME=" sq $5 sq}' sq="'")
В демо-скрипте я просто вывожу данные на консоль, в реальном скрипте, что понятно, можно делать обработку данных в переменных bash. echo "Login: $LOGIN" echo "Full name: $FULLNAME" echo "Phone: $PHONE" echo "Room: $ROOM" echo "Work time: $WORKTIME" Вывод: Login: verb666 Full name: Misha Verbitsky Phone: +415314499922 Room: 42 Work time: 11:00-16:00 ... Скрипты полностью можно посмотреть на GitHub( Немного об оптимизации )Это репост с сайта http://tolik-punkoff.com Оригинал: http://tolik-punkoff.com/2020/01/21/zapisat-vyvod-awk-v-neskolko-peremennyh-bash/
|