Создание ключей Реестра, в имени которых содержится так называемый нулевой символ (NULL-символ), то есть символ с кодом равным нулю. Мужики помогите разобраться с этой проблемой .386 .model flat,stdcall option casemap:none include \masm32\include\ntdll.inc includelib \masm32\lib\ntdll.lib .const .data? szSubKey db "\Registry\Machine\SOFTWARE\мой раздел",0 .data .code start: local hKey:HANDLE local dwDispositionWORD invoke ZwCreateKey, addr hKey, KEY_WRITE, (?????), 0, NULL, REG_OPTION_VOLATILE, addr dwDisposition или кто может с помочь с параметрами,структурами этой функции
.data skey db 'SOFTWARE\MyKey',0 .code ... regset proc LOCAL hKey : dword invoke RegCreateKeyEx,HKEY_LOCAL_MACHINE,ADDR skey,0,0,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,0,ADDR hKey,0 regset endp
Дело в том что нужна именно функция ZwCreateKey(ntdll.inc),так как ключи созданные этой функцией не возможно удалить простыми редакторами реестра(например Regedit) Причина, по которой ключи данного типа следует относить к категории "мусорных", заключается в том, что к данным ключам не удается получить полноценного доступа ни из одной обычной программы (что означает то, что эти ключи - скрытые ключи). Нулевые символы будут заменяться (на экране монитора, а не в Реестре!) специальной условной последовательностью обычных символов, "|0|". Резервные копии ключей, в которых присутствуют нулевые символы, практически бесполезны. Восстановить исходное содержимое Реестра с помощью импорта таких ключей невозможно. И причина этого вполне понятна: редактор Реестра также, как и подавляющее большинство других программ для работы с Реестром, просто не умеет работать со нулевыми ключами. Но все же существование такого REG-файла имеет для нас некоторый смысл, позволяя с его помощью по крайней мере детально изучить данные, хранящиеся в таком NULL-ключе. И для того чтобы удалить эти ключи нужна ZwCreateKey или ZwOpenKey что бы потом применить ZwDeleteKey А на эти функции не могу найти параметры и структуры Заранее благодарен
NTSTATUS ZwCreateKey( OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG TitleIndex, IN PUNICODE_STRING Class OPTIONAL, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL ); ObjectAttributes - указатель на OBJECT_ATTRIBUTES, обычно создается с помощью InitializeObjectAttributes, но если вызывать не из системного контекста, то при вызове функции надо указать атрибут OBJ_KERNEL_HANDLE. Сама структура: typedef struct _OBJECT_ATTRIBUTES { ULONG Length; HANDLE RootDirectory; PUNICODE_STRING ObjectName; ULONG Attributes; PVOID SecurityDescriptor; PVOID SecurityQualityOfService;} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES; TitleIndex - для драйверов ставим 0 Class - указатель на Юникод (а куда ж без него) строку с именем класса ключа (о!) Disposition - указывает на переменную, куды будет занесно REG_CREATED_NEW_KEY, если создан новый ключ, или REG_OPENED_EXISTING_KEY - если такое уже проходили. В том что написал - сам ничего не понял. Тупо взято с Майкрософтовского сайта. Там при желании поподробнее можно посмотреть. А вообще г..гл рулит. P.S. на закуску http://www.osronline.com/DDKx/kmarch/k111_4omq.htm Да и тут вроде промелькнуло http://wasm.ru/print.php?article=drvw2k10
yuri бред какойто, во первых если так и есть смысл от такого ключа? во вторы юзермодные функции это всеголишь оболочки для драйверных, и если юзермод не читает то и Zw. Nt. тоже не прочтёт, если параметр SZ(Null Terminated String) то ни о каких нулях и речи не может идти, другое дело бинарные данные, и воабще если интересно как работают именно Zw( а в NTDLL они тоже самое что и NT, это в r0 они различаются) то читай http://wasm.ru/article.php?article=drvw2k10
Если это бред то каким способом написана эта прога? И сможешь в этом ключе с помощью Regedit найти (HIDDEN VALUE)
.386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\gdi32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc include \masm32\include\advapi32.inc include \masm32\include\w2k\ntdll.inc include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntddk.inc include \masm32\Macros\Strings.mac includelib \masm32\lib\ntdll.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\advapi32.lib .const CCOUNTED_UNICODE_STRING "\\Registry\\Machine\\Software\\Мой раздел ", g_usMachineKeyName0, 4 CCOUNTED_UNICODE_STRING "Моя папка" , g_usValueName, 4 .data? WndProc pro local oa:OBJECT_ATTRIBUTES local dwDispositionWORD local hKey:HANDLE lea ecx, oa InitializeObjectAttributes ecx, offset g_usMachineKeyName0, OBJ_CASE_INSENSITIVE, NULL, NULL invoke ZwCreateKey, addr hKey,KEY_ALL_ACCESS, addr oa, ???????,offset g_usMachineClassName,REG_OPTION_NON_VOLATILE, addr dwDisposition invoke ZwSetValueKey, hKey, addr g_usValueName, 0, REG_SZ,addr g_wszStringData, sizeof g_wszStringData invoke ZwClose, hKey WndProc endp Мужики мож подскажите что здесь не правильно чтоб создать этот ключ с нулевым символом .Заранее благодарен
TitleIndex Device and intermediate drivers set this parameter to zero. ABCetc правда уже это написал yuri Поставь себе ДДК что ли.
Спасибо кто помогал ,"скрытый "ключ создаётся,но мне нужен раздел HKEY_CURRENT_USER а точнее (HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved\{111-2222-333}) CCOUNTED_UNICODE_STRING "HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved\{111-2222-333} ", g_usMachineKeyName0,4 При компиляции MASM ругается что очень сложный параметр Мож кто подскажет как это сделать правильно
offtop: Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\New Key #1] "New Value #1"=hex(f): ?
Как я понял для раздела HKEY_LOCAL_MACHINE нужно "\Registry\Machine" для HKEY_USER нужно "\Registry\User" как записать имя раздела HKEY_CURRENT_USER - "\????\???\" CCOUNTED_UNICODE_STRING "\????\???\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved\{111-2222-333}" Semiono можно поконкретнее что то я вас не очень то понял
.386 .model flat,stdcall option casemap:none include \masm32\include\w2k\ntdll.inc include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntddk.inc include \masm32\Macros\Strings.mac includelib \masm32\lib\ntdll.lib .const CCOUNTED_UNICODE_STRING "\\Registry\User"\\Software\\Microsoft", g_usMachineKeyName, 4 .data? WndProc pro local oa:OBJECT_ATTRIBUTES local dwDispositionWORD local hKey:HANDLE lea ecx, oa InitializeObjectAttributes ecx, offset g_usMachineKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL invoke ZwCreateKey, addr hKey,KEY_ALL_ACCESS, addr oa, 0,0,REG_OPTION_NON_VOLATILE, addr dwDisposition invoke ZwClose, hKey WndProc endp Мужики подскажите каким способом можно "засунуть" в CCOUNTED_UNICODE_STRING это длинное название раздела "\\Registry\User"\\Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved \\Мой раздел " Как я понял в CCOUNTED_UNICODE_STRING маленький лимит на символы Заранее благодарен
ну определи как обычную строку, а потом вызови RtlAnsiStringToUnicodeString или тупо RegStr dw '\','\',R','e','g',.......,0