General Paul Lee Project
О... Новости Статьи Софт Кнопки Форум Написать
73144998
General Paul Lee Project

Не стесняйтесь обращаться с проблемами по реестру. Постараюсь помочь с восстановлением, экспортом, отвечу на интересующие вопросы.
Отсюда можно написать письмо (прямо с сайта), или пошлите сообщение по icq (так быстрее).

Восстановление реестра - Отсутствует корневой ключ
После окончания работы Registry Checker'а в логах видим следующую картину:

ChkNtHdr.log
NTUSER.DAT
=[header]======================================================================
 signature      - correct
 version        - 3 (NT/2K/XP)
 rootkey offset - 00000020h (32) is wrong. (00001020: 00000FE0)
 data size      - 00322000h (3284992)
 check sum      - correct
Warning: Sequence1 and Sequence2 <> 1. Updated.
Warning: timestamp is not null. Updated.

... skip ...

ChkNtBlk.log
NTUSER.DAT
=[datablocks]==================================================================
---------------------------
 Address  Del   Size   Type
--------- --- -------- ----

... skip ...

MaxSize   00040000h
MinSize   00000008h
MaxFree   00001C70h
TotalFree 00041D90h
TotalUsed 002DC550h
*** WARNING *** Root key was not found.

ChkNtLnk.log
NTUSER.DAT
=[links]=======================================================================

... skip ...

00007020:  nk (00001080: 00000000) ^security is wrong
000070A8:  nk (00001020: 00000FE0) ^parent is wrong (may be lost record)
000070A8:  nk (00001080: 00000000) ^security is wrong
00007620:  nk (00001020: 00000FE0) ^parent is wrong (may be lost record)
00007620:  nk (00001080: 00000000) ^security is wrong
00007730:  nk (00001080: 00000000) ^security is wrong

... skip ...

*** following blocks can be restored
00001348 nk cnt:00000026h MaxLen:00000070h ind1:00002FE8h
00001080 sk cnt:000001E1h MaxLen:00000138h ind1:000381C0h ind2:00066110h
000011B8 nk cnt:00000001h MaxLen:00000060h ind1:00014428h
00001020 nk cnt:00000009h MaxLen:00000060h may be root!
00001218 sk cnt:0000000Bh MaxLen:00000130h ind1:0025EE18h ind2:000393E8h
000013B8 nk cnt:00000000h MaxLen:00000108h ind1:0011BDF0h
000014C0 nk cnt:00000000h MaxLen:00000110h ind1:0011BDF0h
000015D0 nk cnt:00000000h MaxLen:00000108h ind1:0011BDF0h
000016D8 nk cnt:00000000h MaxLen:00000100h ind1:0011BDF0h
000017D8 nk cnt:00000000h MaxLen:00000140h ind1:0011BDF0h
00001918 nk cnt:00000000h MaxLen:000000D8h ind1:0011BDF0h
000019F0 nk cnt:00000000h MaxLen:00000110h ind1:0011BDF0h
00001B00 nk cnt:00000000h MaxLen:00000100h ind1:0011BDF0h
00001C60 nk cnt:00000000h MaxLen:000000C0h ind1:0011BDF0h
00001D20 nk cnt:00000000h MaxLen:00000100h ind1:0011BDF0h
00001E20 nk cnt:00000000h MaxLen:000000E8h ind1:0011BDF0h
00001F08 nk cnt:00000000h MaxLen:00000460h ind1:0011BDF0h
00001C00 nk cnt:00000000h MaxLen:00000060h ind1:0011BDF0h

Т.е., явно потерян корневой ключ. Визуально, сегмент, в котором, по всей видимости, он должен находиться, пуст (забит нулями; это до проверки, после проверки - dword 4). В списке блоков для восстановления видим запись с адресом 1020h, помеченную как возможный корневой ключ - на нее есть ссылки, как на родителя (9 штук), ни один из индексов ключей на нее не ссылается, адрес совпадает с адресом корневого ключа из заголовка (20h). Максимальный размер - 60h байт, поскольку по адресу 1080h обнаружен удаленный блок защиты.

Восстановим корневой ключ вручную с помощью какого-либо шестнадцатеричного редактора (например, HIEW или BIEW). Для этого нам сначала потребуется сначала прикинуть значения всех полей (см. Справочник). Не забываем, что все адреса указываются относительно начала данных (физический адрес = логический адрес + 1000h).

Блок ключа
00hdwordразмер блокаFFFFFFA8h(-58h) должен быть кратен 4; поскольку блок используемый, то значение должно быть отрицательным; вычисляем последним
04hword( nk ) - сигнатура6B6Eh
06hwordфлаг2Chкорневой ключ и юникоды не используем
08hqwordвремя создания0любое значение (можно из другого ключа)
10hdwordне известно0
14hdwordуказатель на родителяFFFFFFFFhкорневой ключ не должен иметь ссылки на родителя
18hdwordколичество потомков0Ah(см. последний лог; в нем указано 9 найденных ссылающихся потомков, но в индексе указано на одного больше - он потерян, и может быть восстановлен)
1Chdwordнеизвестно0
20hdwordуказатель на индекс по потомкам13428hнаходим индекс, который ссылается на потомков (lf, lh, li); проверяем, нет ли для него корневых индексов (ri); если индекс не найден, то его надо создать самим; в данном случае индекс найден по физическому адресу 14428h
24hdwordнеизвестно0
28hdwordколичество параметров0поскольку, параметры не имееют ссылки на владельца и найти их нет возможности
2Chdwordуказатель на индекс по параметрамFFFFFFFFh
30hdwordуказатель на блок защиты80hобычно корневой ключ ссылается на блок защиты следующий непосредственно за ним; в данном случае этот блок защиты отсутствует (см. лог - 1080h); можно использовать любой другой блок защиты
34hdwordуказатель на имя классаFFFFFFFFhаналогично параметрам, к тому же имя класса обычно находится сразу за блоком ключа, и скорее всего удалено
38hdwordнеизвестно0
3Chdwordнеизвестно0
40hdwordнеизвестно0
44hdwordнеизвестно0
48hdwordнеизвестно0
4Chwordразмер имени ключа8(имя не в юникоде)
4Ehwordразмер имени класса0
50hимя ключа.Default(поставим это значение, подсмотрев в другой файл ntuser.dat)

Т.о., получаем следующий набор байт, характеризующих наш корневой ключ:
0000001020: A8 FF FF FF 6E 6B 2C 00 | F0 FB 18 64 45 9C C2 01    nk
0000001030: 00 00 00 00 FF FF FF FF | 0A 00 00 00 00 00 00 00
0000001040: 28 34 01 00 00 00 00 00 | 00 00 00 00 FF FF FF FF
0000001050: 80 00 00 00 FF FF FF FF | 00 00 00 00 00 00 00 00
0000001060: 00 00 00 00 00 00 00 00 | 00 00 00 00 08 00 00 00
0000001070: 2E 44 65 66 61 75 6C 74 |                          .Default

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