Добрый день. Есть программа , которая с помощью функции NtCreateKey создаёт в реестре ветку , в которой создаёт соответственно параметр и записывает в него значение. Изменить значение парметра с помощью regedt32 и regedit естественно не удаётся. Но и программными методами тоже. При открытии этих ключей реестра происходит ошибка C0000034 (STATUS_OBJECT_NAME_NOT_FOUND) . Как решить проблему ?
Хе, началось с этого, закончилось этим, думаю там все расписано (попробуй просто изменить длину ветки в дворде, смещение которого в OBJECT_ATTRIBUTES.object)
Dr.Golova Я что-только не ставил , вплоть до OBJ_FORCE_ACCESS_CHECK . Не помогает. bogrus Я внимательно читал твою статью. Но она не помогла. А вот reg_link не понял. Разъясни подробней , плиз.
bogrus OBJECT_ATTRIBUTES.object Если точнее , то OBJECT_ATTRIBUTES.objectname или ты имеешь ввиду поле OBJECT_ATTRIBUTES.length?
Я тоже, но это не то Да именно его, проверь в юникоде ли текст ветки, и какова его реальная длина (для этого лучше посмотреть как прога его создавала) Код (Text): ;================================================================ align 4 struct OBJECT_ATTRIBUTES .length dd sizeof.OBJECT_ATTRIBUTES .directory dd 0 .object dd [b]sregpath[/b] .attributes dd OBJ_CASE_INSENSITIVE .descriptor dd 0 .service dd 0 ends oa OBJECT_ATTRIBUTES ;================================================================ sregpath dd [b]size[/b] ; sizeof.regpath oregpath dd regpath ; offset regpath regpath [b]du[/b] '\Registry\Machine\SOFTWARE\Proga\Settings'[b],0[/b] ;================================================================ size equ [b]$-regpath[/b] ;================================================================ У меня тут намеренно (с помощью ",0") на 1 символ (2 байта) увеличена длина, на сколько надо у тебя, я не знаю (если в этом дело конечно)
bogrus У меня тут намеренно (с помощью ",0") на 1 увеличена длина, на сколько надо у тебя, я не знаю (если в этом дело конечно) "Есть такая маза"(с)Укуренные. На winternals.com есть статья про создание "нечитаемых" веток реестра при помощи NativeAPI и исходники примера.
Я на С написал. А ты врде бы сказал в статье , что С пока не знаешь Если надо , то напишу на MASM-е и вышлю. ОК ?
Ну ума хватило разобратся в дебагере и чуть исправить сишный код под себя, я делал так: KeyName.Length = wcslen( KeyNameBuffer ) *sizeof(WCHAR)+2;
Кажется вот переделанный код, менявший параметр Код (Text): //==================================================================== =================== #include "reghide.h" WCHAR KeyNameBuffer[] = L"\\Registry\\Machine\\SOFTWARE\\Proga\\TimeLock"; WCHAR HiddenValueNameBuffer[]= L"Licensed"; //==================================================================== =================== void start (void) { HANDLE ntdll; UNICODE_STRING KeyName, ValueName; HANDLE SoftwareKeyHandle; OBJECT_ATTRIBUTES ObjectAttributes; int value=1; ntdll = (void *) GetModuleHandle("ntdll.dll"); NtOpenKey = (void *) GetProcAddress( ntdll, "NtOpenKey" ); NtSetValueKey = (void *) GetProcAddress( ntdll, "NtSetValueKey" ); NtClose = (void *) GetProcAddress( ntdll, "NtClose" ); KeyName.Buffer = KeyNameBuffer; KeyName.Length = wcslen( KeyNameBuffer ) *sizeof(WCHAR)+2; InitializeObjectAttributes( &ObjectAttributes, &KeyName,0x00000040, NULL, NULL ); NtOpenKey( &SoftwareKeyHandle, KEY_ALL_ACCESS, &ObjectAttributes ); ValueName.Buffer = HiddenValueNameBuffer; ValueName.Length = wcslen( HiddenValueNameBuffer ) *sizeof(WCHAR); NtSetValueKey( SoftwareKeyHandle, &ValueName, 0, REG_DWORD,&value,sizeof(DWORD)); NtClose (SoftwareKeyHandle); ExitProcess(0); } //=======================================================================================
Ну тогда поройся на тему ACL (Access Control List) - возможно, там отдельным юзерам выставлено право доступак ключу реестра под названием "фигвам". Только делай это осторожно: человек, который делал это неосторожно, чуть было доступа к NTFS-разделу не лишился.
CyberManiac Доступ у меня полный к этой ветке... bogrus Длину добавил. Без изменений. Разъясни насчёт Registry Link . Что-то я не вьехал. Плиз.
А какую? Можно создать например такие ветки: path du '\Registry\Machine\SOFTWARE\Proga',0 path du '\Registry\Machine\SOFTWARE\Proga',0,0,0 path du '\Registry\Machine\SOFTWARE\Proga',0,0,0,0,0,0,0 Regedit будет показывать три идентичные ветки, но ни одну не сможет открыть, и NtOpenKey не откроет, пока ты не укажешь точную длину ветки, незнаю как её узнать без проги, может перебором
bogrus NtOpenKey не откроет, пока ты не укажешь точную длину ветки, незнаю как её узнать без проги, может перебором Может, NtEnumerateKey?
Да, похоже он подойдет, там есть соотв. поля, но я никогда ним не пользовался з.ы. переборщик в аттаче 1492075319__reglen.asm