Форум: "Основная";
Текущий архив: 2009.11.15;
Скачать: [xml.tar.bz2];
Внизembedded null ветка реестра Найти похожие ветки
← →
3she1on © (2008-10-15 03:32) [0]Доброго времени суток, господа. Столкнулся с такой проблемой: есть в реестре ветка, содержащая нулевой символ в конце имени (допустим, hkcu\Software\smth* - символом "*" заменен нулевой символ) и необходим код, с помощью которого эту ветку можно будет удалить. Гугл вразумительных ответов не дал (или я не понял его ответов ))) ). Заранее благодарен!
← →
Riply © (2008-10-15 04:38) [1]> [0] 3she1on © (15.10.08 03:32)
> Столкнулся с такой проблемой: есть в реестре ветка, содержащая нулевой символ в конце
> имени (допустим, hkcu\Software\smth* - символом "*" заменен нулевой символ) и необходим код
> с помощью которого эту ветку можно будет удалить
NtCreateKey, NtDeleteKey "спасут Отца Русской Демократии" :)
← →
3she1on © (2008-10-15 12:31) [2]Пре велико много благодарен Вам, Riply! )
← →
3she1on © (2008-10-15 16:41) [3]Ну вот и косяки снова вылезли (. Нашел в сети Си-шный код Руссиновича, адаптированный под Делфи, потом адаптировал его "под себя".
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls;
type
TForm1 = class(TForm)
SpeedButton1: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// DEFINE MISSING CONSTANTS
const
ntdll = "ntdll.dll";
OBJ_CASE_INSENSITIVE = $00000040;
// DEFINE MISSING TYPE DECLARATIONS
type
USHORT = WORD;
NTSTATUS = ULONG;
PVOID = Pointer;
// TRANSLATE MACRO
function NT_SUCCESS(Status: Integer): WordBool;
begin
Result := Status >= 0;
end;
// DEFINE Native API UNICODE STRING
type
TUnicodeString = packed record
Length: USHORT;
MaximumLength: USHORT;
Buffer: PWideChar;
end;
UNICODE_STRING = TUnicodeString;
PUNICODE_STRING = ^UNICODE_STRING;
// DEFINE Native API OBJECT ATTRIBUTES
TObjectAttributes = packed record
Length: ULONG;
RootDirectory: THandle;
ObjectName: PUNICODE_STRING;
Attributes: ULONG;
SecurityDescriptor: PVOID; // Points to type SECURITY_DESCRIPTOR
SecurityQualityOfService: PVOID; // Points to type SECURITY_QUALITY_OF_SERVICE
end;
OBJECT_ATTRIBUTES = TObjectAttributes;
POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES;
// TRANSLATE MACRO
procedure InitializeObjectAttributes(var p: TObjectAttributes; n:
PUNICODE_STRING; a: ULONG; r: THandle; s: PVOID);
begin
p.Length := SizeOf(OBJECT_ATTRIBUTES);
p.RootDirectory := r;
p.Attributes := a;
p.ObjectName := n;
p.SecurityDescriptor := s;
p.SecurityQualityOfService := nil;
end;
// IMPORT NTDLL FUNCTIONS
function NtCreateKey(var KeyHandle: THandle; DesiredAccess: ULONG; var
ObjectAttributes: OBJECT_ATTRIBUTES; TitleIndex: ULONG; Class_:
PUNICODE_STRING; CreateOptions: ULONG; var Disposition: ULONG): NTSTATUS;
stdcall; external ntdll name "NtCreateKey";
function NtSetValueKey(KeyHandle: THandle; ValueName: PUNICODE_STRING;
TitleIndex: ULONG; Type_: ULONG; Data: PVOID; DataSize: ULONG): NTSTATUS;
stdcall; external ntdll name "NtSetValueKey";
function NtDeleteKey(KeyHandle: THandle): NTSTATUS; stdcall; external ntdll
name "NtDeleteKey";
// DEFINE OUR REGISTY STRINGS
const
KeyNameBuffer: AnsiString = "\Registry\User\CurrentUser\Software";
NewKeyNameBuffer: AnsiString = "Shodans Tech";
HiddenKeyNameBuffer: AnsiString = "Can""t touch me!"#0;
HiddenValueNameBuffer: AnsiString = "Hidden Value";
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
KeyName, ValueName: UNICODE_STRING;
SoftwareKeyHandle, SysKeyHandle, HiddenKeyHandle: THandle;
Status: ULONG;
ObjectAttributes: OBJECT_ATTRIBUTES;
Disposition: ULONG;
Buffer: array of WideChar;
begin
//
// Open the Software key
//
SetLength(Buffer, Length(KeyNameBuffer));
MultiByteToWideChar(CP_UTF8, 0, @KeyNameBuffer[1], Length(KeyNameBuffer),
PWideChar(Buffer), Length(Buffer));
KeyName.Buffer := @Buffer[0];
KeyName.Length := Length(KeyNameBuffer) * SizeOf(WideChar);
InitializeObjectAttributes(ObjectAttributes, @KeyName, OBJ_CASE_INSENSITIVE,
0, nil);
Status := NtCreateKey(SoftwareKeyHandle, KEY_ALL_ACCESS, ObjectAttributes, 0,
nil, REG_OPTION_NON_VOLATILE, Disposition);
if not NT_SUCCESS(Status) then
raise Exception.Create("Error: Couldn""t open HKCU\Software");
.........
.........
end.
Интересно, что при значении константыKeyNameBuffer: AnsiString = "\Registry\Machine\Software";
все работает отлично. Но... мне нужно попасть не в HKLM, а в HKCU!
При изменении пути к кусту
KeyNameBuffer: AnsiString = "\Registry\User\CurrentUser\Software";
получаю эксепшн.
← →
3she1on © (2008-10-15 19:51) [4]Вопрос закрыт. Всем спасибо )
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2009.11.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c