Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.15;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
15-1252764985
@!!ex
2009-09-12 18:16
2009.11.15
Как урезать установленную Windows XP?


8-1200128892
Starik
2008-01-12 12:08
2009.11.15
Отрисовка битмапа на битмапе


4-1221216201
Riply
2008-09-12 14:43
2009.11.15
Работа с памятью в Kernel-mode.


2-1254304088
Venus
2009-09-30 13:48
2009.11.15
Отправка е-маил (рассылка)


15-1252931163
нуб
2009-09-14 16:26
2009.11.15
HDD ежесекундно тревожат.