Серверная (www.it-simple.ru)

Редактирование реестра Windows из Linux


Монтирование Windows-реестра в Linux (http://www.opennet.ru/tips/2735_windows_registry_mount_fuse.shtml)
© Сергей Трубин (http://www.opennet.ru/~%F3%C5%D2%C7%C5%CA%20%F4%D2%D5%C2%C9%CE)


В рамках проекта HIVEXFS (https://github.com/strubin/hivexfs) подготовлен FUSE-модуль для монтирования реестра Windows к любому каталогу и дальнейшей работы с реестром как с древовидной ФС. На данный момент HIVEXFS уже используется в Dr.Web LiveCD (http://www.freedrweb.com/livecd), на котором найденные реестры монтируются посредством autofs в каталог /reg.

Каталоги соответствуют разделам реестра, файлы — параметрам, содержимое файла — значению соответствующего параметра. Параметр по умолчанию обозначается файлом "@", тип параметра определяется через расширенные атрибуты файла (http://linux.die.net/man/5/attr). Значения параметров, имеющие типы REG_SZ, REG_EXPAND_SZ, REG_LINK REG_DWORD или REG_QWORD, автоматически конвертируется в текст (UTF-8) и обратно.

Для монтирования реестра используется утилита hivexfs. В качестве первого аргумента указывается точка монтирования windows-диска, второй аргумент — пустой каталог:

sudo hivexfs /mnt/windows /mnt/registry

Примеры использования:

Создадим параметр NEW_VALUE типа REG_SZ:

echo qwerty > NEW_VALUE

Посмотрим реальное содержимое:

attr -qg value NEW_VALUE |hexdump -C
00000000 71 00 77 00 65 00 72 00 74 00 79 00 0a 00 00 00 |q.w.e.r.t.y.....|

Как видим это строка в кодировке UTF-16LE, в конце завершается двумя нулями.

Преобразуем в тип REG_DWORD:

attr -s type -V reg_dword NEW_VALUE
attr_set: Недопустимый аргумент
Could not set "type" for NEW_VALUE

Выдана ошибка, так как строка в число не переводится, попробуем снова:

echo 12345 > NEW_VALUE
Attribute "type" set to a 9 byte value for NEW_VALUE : reg_dword

attr -g type NEW_VALUE
Attribute "type" had a 9 byte value for NEW_VALUE : REG_DWORD

attr -g size NEW_VALUE
Attribute "size" had a 1 byte value for NEW_VALUE : 4

cat NEW_VALUE
12345

Поддерживаемые операции:

Посмотреть доступный список типов параметра:

attr -l [value]

Посмотреть тип параметра можно командой:

getfattr -n user.type [value]

или

attr -g type [value]

Реальный размер параметра:

getfattr -n user.size [value]

или

attr -g size [value]

Реальное побайтное содержимое параметра:

getfattr --only-values -n user.value [value]

или

attr -qg value [value]

Копировать лучше командой ln (link), тогда копируются все атрибуты параметра.
Команда cp использует вызовы read и write, которые строковые и числовые ключи перекодируют на лету, в UTF-8 и обратно. Так что cp — это весьма накладно + он ничего не знает о типе параметра. Рекурсивно скопировать раздел можно командой

cp -Rl [path1] [path2]

По умолчанию создаётся тип REG_SZ, если параметр модифицируется, то его тип не меняется. Сменить тип параметра можно командой:

setfattr -n user.type -v [new_type] [value]

или

attr -s type -V [new_type] [value]

Модификация типа возможна для параметров: REG_SZ, REG_EXPAND_SZ, REG_LINK, REG_BINARY, REG_DWORD, REG_QWORD. В случае невозможности модификации типа — возвращается ошибка.

Если что-то сделали не так, то отменить изменения можно убив процесс hivexfs, тогда демонтирования не будет и изменения в силу не вступят.

Есть ограничение: невозможно создать раздел или параметр с именем, содержащим национальные символы.