Итак, обещал рассказать, как все-таки написать консольный Hello, world на ассемблере, и выбрал для этого MASM, потому что TASM’овский компилятор довольно давно полумертв, и не умеет из коробки некоторых базовых вещей, например, не умеет указывать подсистему (это изменение одного поля в заголовке PE-файла), в которой должна работать программа под Win32. Подсистем есть несколько, но нас пока интересуют две: WINDOWS
и CONSOLE
. Первая, для оконных приложений, а вторая — для консольных. Если ОС будет видеть, что приложение консольное, она проверит, открыта ли для него консоль уже (если мы запускаем приложение через cmd
, или Far manager, например), и откроет для него консоль, если мы запускаем приложение из оконной среды, щелкая по экзешнику мышкой. Это избавляет нас от геморроя, вручную контролировать консоль, открывать ее, закрывать, освобождать. Хотя, принципиальных ограничений нет — консольное приложение спокойно может открыть, как стандартное диалоговое окно, так и вообще создать полноценную форму, а оконное приложение — открыть консоль.
Далее под катом…
Tag Archives: manuals
Типы данных в ассемблере
Кто не понял из лекции, вот вполне себе годная шпаргалка: Типы данных в ассемблере
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
-соглашение.
Если вы используете include-файл windows.inc
в MASM, и при компиляции происходит ошибка windows.inc(78) : error A2119: language type must be specified
, значит, забыли указать параметр stdcall
в директиве .model
О формате объектных файлов и библиотек 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
Assembler: проверка условий и переходы (jump)
Небольшая шпаргалка по условным и безусловным переходам.
Безусловный переход: выполняется командой JMP <метка>
, может использоваться, как для перехода вперед, пропуская некоторые команды в коде, так и для возврата назад, для повторного выполнения инструкций:
1.
... какой-то код ... JMP label1 ... какой-то код ... label1: ... другой код выполняется после срабатывания инструкции JMP ...
2.
... какой-то код ... labelret: ... какой-то код ... JMP labelret
Условный переход: Выполняется, если выполнено какое-либо условие, переход осуществляется командой Jxx <метка>
, где xx
— мнемоника, указывающая на проверяемое условие.
Инструкция 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 |
Ссылки
Writing Win32 programs in assembly language using TASM
Переключение раскладки на экранной клавиатуре Windows 7
По-прежнему, чиним деньгополдощательные терминалы и всякие прочие АРМ, потому понадобилось, заметка от склероза, чтоб не забыть, да и другим полезно будет.
Рассматриваем способы, как ее вызвать, если доступа к физической клавиатуре нет совсем.
1. ПУСК —> Все программы —> Стандартные —> Специальные возможности —> Экранная клавиатура
2. Добираемся мышекликом до экзешника: %windir%\system32\osk.exe
Где %windir%
— каталог с установленной Windows (обычно C:\Windows
).
Если надо вызвать программу с командной строки (для справки), то соответственно, команда: osk
Примечание: Экранная клавиатура, как и физическая, поддерживает только раскладки клавиатуры (языки ввода) установленные в системе, т.е., если русский язык, например, в системе не установлен совсем, то и переключиться на наго нельзя.
Самый простой. Не пользоваться для переключения языка ввода и раскладки экранной клавиатурой, все спокойно можно делать мышью, с помощью значка индикатора клавиатуры в системном трее.

Щелкаем те же клавиши, которые установлены для переключения клавиатуры в системе, и не задерживаясь, нажимаем ту, с которой начали. Т.е. если переключение клавиатуры настроено на Alt+Shift, то на экранной клавиатуре жмем Alt, потом Shift (или наоборот, сначала Shift потом Alt), а потом возвращаемся к первой клавише, если первой нажимали Alt — нажимаем Alt второй раз, если первый раз нажимали Shift — второй раз нажимаем Shift.
Если в системе установлена комбинация Ctrl+Shift, действия аналогичны, только нажимаем соответствующие клавиши на экранной клавиатуре
Переключение раскладки:

Раскладка переключилась:

ТЕЛЕМАРКЕТ!
Если 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, требующий перепрошивки, или вообще горелую материнку. Электричество, какое маленькое оно бы не казалось, безалаберности не терпит!
Если у более новых компьютеров обнулился BIOS/UEFI и возвратился к заводским настройкам, то, скорее всего, произошло переключение режима работы контроллера жесткого диска с IDE-совместимого в AHCI, AHCI в XP поддерживается с большим бубном, потому им обычно никто не заморачивается, если особо не надо, переключают контроллер в режим IDE-совместимости и телемаркет. А вот если контроллер переключится обратно сам, после возврата BIOS к заводским настройкам, то XP упадет в синий экран.
1. Заходим в BIOS, на главной странице выбираем Advanced Mode (или нажимаем клавишу F7)

2. В появившемся окне отвечаем OK:

3. Переходим на вкладку Advanced:

4. Выбираем SATA configuration:

5. Нажимаем ENTER и в появившемся меню выбираем IDE:

6. Сохраняем настройки и перезагружаемся (F10)
ТЕЛЕМАРКЕТ!
Inksсape: Текст по окружности.
Пост из серии «Спрашивали — отвечаем». Спросили, а как сделать на рисунке текст по окружности, как например, на этом плакате. Впрочем, тут я довольно неаккуратно допиливал старый плокад, так что можно было и лучше. Так что начнем сначала.
1. Рисуем круги, логотип в круге, если это надо, помещаем надписи сверху и снизу, или только сверху, или только снизу, в зависимости от того, что вы хотите сделать. Подбираем надписям нужный шрифт.
Пример:

Крупный вариант скрина
Далее с иллюстрациями под катом
2. Теперь можно отодвинуть и удалить ненужный круг.

https://i.imgur.com/92bNi9O.png
Также можно сделать и с первым кругом, если он не нужен.
ФАНФАРЫ!
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 )
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
Все права идут нахуй.
Включение, отключение и настройка режима гибернации в 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’е.
Наиболее частая причина состоит в том, что этому может мешать какая-то программа:
— Просто зависшее приложение.
— Программа, производящая активные действия с файловой системой (архиватор, архивирующий/разархивирующий файлы, файловый менеджер, копирующий файл).
— Программы, способные запретить переход в спящий режим/режим гибернации: будильники, таймеры, торрент-клиенты, «качалки», и даже некоторые вирусы и скрытые майнеры.
Отключение спящего режима на Android
Начальство попросило сделать секретарше отдельные настольные часы, чо, нашел старый смартфон с 5 стоковым андроидом и дохлым радиомодулем, т.е. не связи, не вайфая, как раз годен только часы отображать. Была проблема с тем, что телефон засыпал, соответственно, переставал часы показывать.
Как вылечить нашел здесь Копия в PDF
Заодно уж, как зайти в режим разработчика Копия в PDF
Sony Vegas. Два видео в одном кадре. Отображение двух видео одновременно. Видеоинструкция.
Обновление своего плагина для Firefox
В прошлом году писал заметку Делаем свое расширение для Firefox (копия), теперь краткая инструкция, как его обновить, если внесены изменения.
1. Правим код, не забываем изменить номер версии в manifest.json
, добавляем нужные файлы, упаковываем в ZIP-архив, переименовываем файл в *.xpi
2. Идем на https://addons.mozilla.org/ru/developers, жмем большую кнопку Отправить или управлять расширениями, логинимся.
3. Жмем в верхнем меню Мои дополнения, проваливаемся сюда:

Жмем Новая версия.
4. Загружаем файл дополнения кнопкой Выбрать файл…

У меня проверка прошла с первого раза.
5. Далее попадаем сюда:

Нас спрашивают, не использовали ли мы обфускаторы кода. Мы не использовали, если была использована библиотека jquery-?.?.?.min.js
, чей код ужат, чтоб занимал меньше места — ничего страшного, Мозилла автоматом определяет, что используется известная версия библиотеки. Жмем Продолжить, попадаем на страничку, где можно ввести описание изменений (видно всем пользователям) и комментарий для проверяющих.

Одобрение, видимо из-за небольших изменений в дополнении, пришло практически моментально, похоже, в автоматическом режиме.
Записать вывод 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.
Предположим, что заголовок удален, в файле остались только данные.
В 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
Установка и настройка I2P в Slackware Linux

I2P это такая скрытая пиринговая сеть, подробнее можно узнать в Википедии или на официальном сайте. В отличии от TOR, она обеспечивает не анонимный доступ в Интернет, а доступ к собственным ресурсам (сайтам, файлообменникам и т.д.), скрытым из обычной сети. Гейты в «большой» Интернет в ней есть, но они кривые, косые и пользоваться ими не рекомендуется. Расскажу, как ее установить и настроить на Slackware, заодно разрешив пользователям из локальной сети также получать к ней доступ.
Клиент сети написан на Java, потому ее надо сначала установить. На официальном сайте есть рекомендации о необходимой версии:
Java Runtime Version 7 or higher. (Oracle, OpenJDK, or IcedTea Java Version 7 or 8 recommended.
Сама установка довольно проста:
1. Идем, например сюда
2. Скачиваем jdk-8u162-i586-2gds.txz
3. Устанавливаем стандартным образом:
installpkg jdk-8u162-i586-2gds.txz
4. Добавляем в автозагрузку (если вы не сделали отдельного скрипта для запуска сервера, то /etc/rc.d/rc.local
) пути к java:
echo "Add JAVA paths..."
export JAVA_HOME=/usr/lib/java
export MANPATH="${MANPATH}:${JAVA_HOME}/man"
export PATH="${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin"
5. Перезагружаем машину.
6. Вводим в консоли команду java
без параметров. Если все было сделано правильно, то вы должны увидеть вывод краткой справки по параметрам java.
Понятно, что операции с пользователями надо делать под root
или с sudo
.
1. Создаем отдельную группу для I2P:
groupadd i2pgrp
2. Создаем интерактивного (пока, потом мы вырубим ему всю интерактивность) пользователя, например i2psrv
:
useradd -g i2pgrp -m -d /home/i2psrv -s /bin/bash i2psrv
где:
-g i2pgrp
— группа пользователя (i2pgrp
)
-m
— создать домашний каталог
-d /home/i2psrv
— путь к домашнему каталогу (/home/i2psrv
)
-s /bin/bash
— установить пользователю оболочку, в данном случае фиктивную (/bin/bash
)
i2psrv
— имя пользователя
3. Задаем ему пароль:
passwd i2psrv
В интерактивном режиме повторяем пароль 2 раза, о сложности можно не беспокоиться — все равно потом отключим.
1. Скачиваем установщик для Linux с официального сайта
2. Копируем в директорию пользователя (/home/i2psrv
) и меняем владельца файла:
chown i2psrv:i2pgrp i2pinstall_0.9.44.jar
3. Логинимся под новым пользователем.
4. Запускаем установку (через консоль):
java -jar i2pinstall_0.9.44.jar -console
5. Приводят возможность выбрать язык:
Select your language
0 [x] eng
1 [ ] bra
2 [ ] cat
3 [ ] ces
...
Оставляем английский (нажимая ENTER).
6. Далее предлагают продолжить установку:
Нажимаем 1 [ENTER]
7. Опять лицензия и всякая хрень:
Нажимаем 1 [ENTER]
8. Выбор пути для установки. Поскольку устанавливаем в каталоге нового пользователя, пусть так и делает — нажимаем [ENTER]
9. Далее нажимаем O
и [ENTER] (в прошлых версиях было меньше гемора и подтверждений, а сейчас словно анкету в ментовку работать заполняешь 🙂
10. Еще раз предлагают подтвердить, что все ОК (1 и [ENTER])
11. Наконец, тебе говорят, что все ОК:
====================
Installation started
Framework: 5.1.3-84aaf (IzPack)
Platform: linux,version=4.4.14-smp,arch=x86,symbolicName=null,javaVersion=1.8.0_232
[ Starting to unpack ]
[ Processing package: Base (1/1) ]
[ Unpacking finished ]
Installation finished
On most systems, I2P can be started with:
/home/i2psrv/i2p/i2prouter start
If I2P does not start, please try:
/home/i2psrv/i2p/runplain.sh
12. Тебе говорят, что все совсем ОК:
Installation was successful
Application installed on /home/i2psrv/i2p
[ Writing the uninstaller data ... ]
[ Console installation done ]
Если вы намерены использовать I2P только на локальном компьютере, этот шаг можно пропустить.
1. Идем в файл /home/i2psrv/i2p/i2ptunnel.config
, предварительно его куда-нибудь скопировав, и меняем в нем все 127.0.0.1
на адрес нашего компьютера в локальной сети (например на 192.168.0.20
, см. адрес вашего компьютера), таким образом все сервисы I2P будут доступны с любой машины в локальной сети.
2. В том же файле смотрим порты, если где-то у нас какой-то порт для чего-то занят, например на том же порту уже висит HTTP или TOR-proxy, смело меняем порт.
I2P — порядочный сервис, и сам умеет переключать пользователя, под которым запускается. Некоторые даже рекомендуют завести двух пользователей, одного для запуска, другого для установки I2P, но мы, ради экономии времени, делать этого не будем — и запуск и установка будут под одним пользователем. Тем не менее, необходимо отредактировать скрипт i2prouter
(в /home/ip2srv/i2p
):
1. Ищем строку, содержащую RUN_AS_USER=
2. Раскомментируем ее (удаляем #
в начале строки).
3. Дописываем после знака =
имя пользователя (в этом примере «i2psrv"
).
Отслеживание статуса соединения с сетью I2P, ошибки и основные настройки доступны через Web-интерфейс, который запускается на локальной машине на порту 7657
, но если физического доступа к той машине, на которой установлен I2P нет (или лень), то можно управлять ей и с любого компьютера локальной сети.
Внимание! Это не очень одобряется официальными инструкциями. По идее можно сделать безопасный SSL-туннель, как это описывалось в одной из старых инструкций. Но я опишу самый простой вариант, просто поменяю конфиг.
Заходим в clients.config
(/home/i2psrv/i2p
), предварительно сделав бэкап.
И опять меняем 127.0.0.1
на 192.168.0.20
, т.е. меняем адрес машины, по которому должна появиться консоль.
Далее меняем clientApp.4.startOnLoad=true
на clientApp.4.startOnLoad=false
, т.к. на сервере нет смысла открывать панель управления после старта I2P.
Дальнейшая настройка под катом
Переходим по адресу http://i2p-projekt.i2p

I2P довольно медленная сеть и работает с некоторыми перебоями, так что если вместо сайта вы увидите надпись «Сайт недоступен. Возможно, сайт отключен, сеть перегружена или ваш маршрутизатор недостаточно интегрирован с другими пирами. Вы можете повторить операцию.«, то действительно, скорее всего, операцию нужно повторить.
На самом деле интерактивный доступ к системе для пользователя i2psrv
был нужен только на этапе установки сервиса I2P, и я оставлял его до конца настройки на случай, если I2P понадобится переустановить. Теперь консоль пользователю i2psrv
более не нужна. Отключаем:
Редактируем (под root
‘ом) файл /etc/passwd
.
Находим в этом файле строку, начинающуюся с имени пользователя (i2psrv
) и в конце строки меняем /bin/bash
на /bin/false
.
Сохраняем файл.
Остались нераскрытыми темы подписок (как добавлять I2P-сайты неизвестные вашему маршрутизатору I2P), интересные I2P-сайты, другие сервисы I2P, кроме WWW. Может быть когда-нибудь вернусь к этому вопросу, а пока рекомендую детально ознакомиться с документацией на сайте https://geti2p.net/, http://i2p-projekt.i2p и в консоли I2P.
Установка Linux и шифрование ее и всего содержимого жесткого диска. Часть IV
Этап #19
Восстановление системы на зашифрованный диск. Форматирование разделов
Сначала, как и на этапе 18, необходимо получить доступ к зашифрованному жесткому диску
tcplay --map=cryp_sdb --device=/dev/sdb --keyfile=/path/to/key/file
Далее, с помощью утилиты kpartx
, доступ к разделам на жестком диске
kpartx -av /dev/mapper/cryp_sdb
где:
Опция a
– подключить разделы, содержащиеся на зашифрованном устройстве
Опция v
– отобразить, какие разделы были подключены.
/dev/mapper/cryp_sdb –
подключенный с помощью tcplay
зашифрованный диск.
Далее форматируем разделы. Главный:
mkfs –t ext2 /dev/mapper/cryp_sdb1
Дополнительный:
mkfs –t ext2 /dev/mapper/cryp_sdb5
И раздел подкачки:
mkswap /dev/mapper/cryp_sdb6
Отключаем подключенные разделы:
kpartx –dv /dev/mapper/cryp_sdb
Отключаем зашифрованный жесткий диск:
tcplay --unmap=cryp_sdb
Перезагружаемся обратно в консоль тестового initrd
Этап #20
Восстановление системы на зашифрованный диск. Восстановление файлов из ранее созданных бэкапов.
Как и в предыдущем этапе, сначала получаем доступ к зашифрованному жесткому диску:
tcplay --map=cryp_sdb --device=/dev/sdb --keyfile=/path/to/key/file
И его разделам:
kpartx -av /dev/mapper/cryp_sdb
Предположим, что бэкапы системы были сохранены на первый FAT32 раздел флешки sda1
и находятся по следующим путям:
/mnt/sdb1/bak/system.tar.gz
и /mnt/sdb1/bak/home.tar.gz
Создаем точку монтирования для флешки (если не создана):
mkdir /mnt/sdb1
И монтируем ее (если не примонтирована)
mount –t vfat /dev/sdb1 /mnt/sdb1
Создаем точки монтирования для разделов жесткого диска:
mkdir /mnt/sda1
mkdir /mnt/sda5
Внимание! Точки монтирования для жестких дисков должны называться также, как назывались при создании бэкапов!
Монтируем разделы:
mount –t ext2 /dev/mapper/cryp_sdb1 /mnt/sda1
mount –t ext2 /dev/mapper/cryp_sdb5 /mnt/sda5
Распаковываем архивы:
tar –xvf /mnt/sda1/bak/home.tar.gz –C /
tar –xvf /mnt/sda1/bak/system.tar.gz –C /
где:
Опция x
– распаковать архив
Опция v
– отображать имена распаковываемых файлов
Опция f
– архив находится в файле (а не направлен со STDIN)
/mnt/sda1/bak/home.tar.gz
– путь к файлу архива
–C
– указывает, в какой каталог распаковать архив (сам каталог указывается через пробел, и в данном случае это корень, т.е. /
).
Скопируем заранее исправленные fstab
и mtab,
предположим, они были сохранены в первый раздел загрузочной флешки, в каталог tabs
и данный раздел смонтирован:
cp /mnt/sdb1/tabs/fstab /mnt/sda1/etc/fstab
cp /mnt/sdb1/tabs/fstab /mnt/sda1/etc/mtab
После копирования файлов отмонтируем разделы:
umount /mnt/sda1
umount /mnt/sda5
Отключаем подключенные разделы:
kpartx –dv /dev/mapper/cryp_sdb
Отключаем зашифрованный жесткий диск:
tcplay --unmap=cryp_sdb
Перезагружаемся уже с рабочим initrd.
Поздравляю! Если система успешно загрузилась с рабочим initrd, значит, задача выполнена!
После успешной загрузки можно подправить конфиг GRUB, так, чтоб сразу загружалась система с рабочим initrd.
Установка Linux и шифрование ее и всего содержимого жесткого диска. Часть III
Этап #16
Подготовка конфигурационных файлов и рабочего initrd
На этом этапе первым делом определимся, под каким именем мы будем обращаться к нашему зашифрованному жесткому диску. Это имя будет использоваться в команде map утилиты tcplay. Для примера здесь и далее я буду использовать имя cryp_sdb
.
Далее необходимо скопировать в отдельный каталог на загрузочной флешке (для примера пусть будет cfg) файлы /etc/fstab
и /etc/mtab
из основной ОС и отредактировать их, заменив /dev/sdaX
на /dev/mapper/cryp_sdbX
. Где X – номер конкретного раздела на жестком диске.
Далее под катом
Установка Linux и шифрование ее и всего содержимого жесткого диска. Часть II
Этап #11.
Добавление tcplay в образ initrd.
Для этого создаем какой-нибудь временный каталог и распаковываем туда из пакета (tc-play-2.0-i486-1.tgz
в моем случае) полученного на этапе 8 файлы (дальнейшие пути внутри пакета)
usr/lib/libtcplay.so.2.0
Я просто воспользовался
usr/sbin/tcplay
mc
, зашел им в архив и нужное скопировал клавишей F5 в /tmp/tc-play
, mc
сам вызвал архиватор и распаковал все за меня.
Далее, выходим из архива и копируем во временный каталог (ну чтоб все нужные файлы были в одном месте и мы не запутались) файл
/lib/libdevmapper.so.1.02
(если при создании initrd
, вы пользовались опцией –L
, то эта библиотека уже на месте)
Теперь из временного каталога (да, можно было и сразу) скопируем файлы
libtcplay.so.2.0
в
libdevmapper.so.1.02
/boot/initrd-tree/lib
(каталог библиотек файловой системы initrd)
а файл
tcplay
в /boot/initrd-tree/bin
Также tcplay во время своей работы, а конкретно подключения зашифрованных разделов вызывает из каталога /usr/sbin
программу dmsetup
. Соответственно, необходимо положить dmsetup
в /boot/initrd-tree/usr/sbin
Чтобы dmsetup работал правильно, ему необходим каталог /dev/mapper, его тоже надо создать
mkdir /boot/initrd-tree/dev/mapper
Далее выходим из каталога initrd-tree, удаляем из директории /boot ранее созданный initrd.gz и запускаем mkinitrd без параметров, далее примонтируем нашу загрузочную флешку, заменяем файл /mnt/sda2/absolute/initrd.gz на пересозданный initrd.gz, перезагружаем компьютер и выбираем созданный на этапе 8 пункт для тестирования initrd.gz
Если все сделано правильно, то в конце загрузки будет выведено сообщение «Hello, world!» и приглашение оболочки, в котором мы введем команду tcplay
. Программа должна выдать краткую справку по своим параметрам. После чего вводим команду exit
и загружаемся в основную ОС.
Этап #12.
Генерация ключа для шифрования.
Для генерации ключа можно взять данные из /dev/urandom
.
Если было несколько перезагрузок основной ОС и ОС некоторое время работала, то это должно быть довольно надежно. Хотя при написании данной статьи я и сомневался в этом, но мои сомнения были развеяны более опытными специалистами 🙂
Можно также воспользоваться генератором ключевых файлов, входящим в комплект Windows или Linux-версии Truecrypt, в таком случае следует использовать версию 7.1a, последнюю на момент закрытия проекта Truecrypt, скачать каковую можно, например отсюда.
Можно воспользоваться сторонними генераторами случайных высокоэнтропийных последовательностей, а можно взять (как и при использовании Truecrypt) любой файл, первый мегабайт которого и будет использован в качестве ключевого файла.
Нежелательно в последнем случае использовать в качестве такого файла какой-нибудь стандартный системный файл или фотографию вашего кота, понятно, что при получении доступа к жесткому диску, злоумышленник сможет его без особого геморроя подобрать.
Вот команда для генерации ключа с помощью /dev/random
– стандартного устройства для получения псевдослучайных последовательностей
dd if=/dev/random of=/путь/к/файлу/имя_файла bs=1 count=256
Команда dd
подробно описана, например, здесь