Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];

Вниз

Как отловить попытку или факт изменения реестра.   Найти похожие ветки 

 
Rolex   (2003-04-19 10:54) [0]

Как отловить попытку или факт изменения реестра.


 
Ihor Osov'yak   (2003-04-19 11:05) [1]

www.sysinternals.com

RegMonitor. Как сие дело работает - не интересовался. Учитывая специфику сайта - можно предположить, что они вешают фильтр-драйвер. На вскидку еще одна идея - перехват апишных функций, работающих с реестром... Ну еще - отыскать утилиту, которая уже делает это - и посмотреть, чего она там импортирует, может какая-то мысль и появится ..


 
Scorp   (2003-04-21 18:30) [2]

Значит так: я сам недавно интересовался подобной информацией. Оказывается, что так просто сделать это низя. RegMon - тулзень, оторая этим и занимается, когда-то на сайте www.sysinternals.com были исходники, теперь - только рисунок-схема работы. Работает это зараза только под админом путем подмены драйвера системных вызовов. Вот на этом все мои мечты и "приехали", - не хочу я копатся в DDK. Иной способ - подмена user32.dll, kernel32.dll (слышал об таком), только вот как это реализовать - понятия не имею, а вообще на мой взгляд - это глупость. Так что если не через дрова, то наверное никак :-(


 
Alex Konshin   (2003-04-23 08:28) [3]

У меня есть адаптация драйвера от sysinternals под Delphi, то есть, его можно загрузить и использовать из Delphi.
http://home.earthlink.net/~akonshin/files/RegMon.pas
То есть у меня есть реализация практически того самого RegMon на Delphi с использованием их драйвера. Это было в порядке помощи и как бы было бы не очень этично опубликовывать этот без его согласия. Ну а сам header чисто мой, так что могу без угрызения совести опубликовать его.


 
Alex Konshin   (2003-04-23 08:29) [4]

А это кусок кода его использует (тоже мое, так что никого обидеть не должен):

//-------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var
driverPath : String;
DrvFilePath : String;
systemRoot : Array [0..MAX_PATH] of Char;
error, nb : Dword;
begin
ShowTimeMode := stmElapsedTime;
CaptureLog := True;
{$ifdef debug}
Debug("%.4x Main.TForm1.FormCreate: ",[GetCurrentThreadId]);
{$endif}
try
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
DriverName := SYS_NAME;
// read driver start type to see if boot-logging is enabled
with TRegistry.Create do
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKey("System\CurrentControlSet\Services\Regmon", False) then
try
BootLog := ReadInteger("Start") <> SERVICE_DEMAND_START;
finally
CloseKey;
end;
finally
Free;
end;


if GetEnvironmentVariable("SYSTEMROOT", @systemRoot, sizeof(systemRoot)) = 0 then
raise ERegMonError.Create("Could not resolve SYSTEMROOT environment variable");

driverPath := systemRoot + "\system32\drivers\"+ SYS_FILE;

{$ifdef debug}
Debug("Main.TForm1.FormCreate: driverPath=%s",[driverPath]);
{$endif}
if not LoadDeviceDriver(SYS_NAME, PChar(driverPath), DevHandle, error) then
begin
DrvFilePath := ExtractFilePath(ParamStr(0))+SYS_FILE;
{$ifdef debug}
Debug("Main.TForm1.FormCreate: DrvFilePath=%s",[DrvFilePath]);
{$endif}
if not CopyFile( PChar(DrvFilePath), PChar(driverPath), FALSE ) then
raise ERegMonError.Create("Unable to copy "+DrvFilePath+" to "+driverPath);

SetFileAttributes( PChar(driverPath), FILE_ATTRIBUTE_NORMAL );

if not LoadDeviceDriver( SYS_NAME, PChar(driverPath), DevHandle, error ) then
begin
UnloadDeviceDriver( SYS_NAME );
if not LoadDeviceDriver( SYS_NAME, PChar(driverPath), DevHandle, error ) then
begin
DeleteFile( driverPath );
raise ERegMonError.Create("Error("+IntToStr(error)+") loading "+DrvFilePath+" : "#13#10+SysErrorMessage(error));
end;
end;
end;

end
else
begin
// Win9x
DriverName := VXD_NAME;
DevHandle := CreateFile( PChar(VXD_FILE), 0, 0, nil,
0, FILE_FLAG_OVERLAPPED and
FILE_FLAG_DELETE_ON_CLOSE,
0 );
if DevHandle = INVALID_HANDLE_VALUE then
raise ERegMonError.Create(VXD_FILE+" is not installed properly:"#13#10+SysErrorMessage(GetLastError));
end;

{$ifdef debug}
Debug("Main.TForm1.FormCreate: DevHandle=%.8x",[DevHandle]);
{$endif}

// Correct driver version?
if not DeviceIoControl(DevHandle,
IOCTL_REGMON_VERSION,
nil,
0,
@RegMonVersion,
sizeof(Dword),
nb,
nil) then
raise ERegMonError.Create("Couldn""t access device driver:"#13#10+SysErrorMessage(GetLastError));

if RegMonVersion<>REGMON_VERSION then
raise ERegMonError.Create("Regmon located a driver with the wrong version ("+IntToStr(RegMonVersion)+")."#13#10
+"If you just installed a new version you must reboot before you are able to use it.");


GetMem(pStatBuffer,LOGBUFSIZE);

if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
// determine performance counter frequency
QueryPerformanceFrequency( PerfFrequency );
end;

except
on E:ERegMonError do
begin
Windows.MessageBox(Application.Handle,PChar(E.Message),"Error",
MB_OK or MB_ICONERROR or MB_DEFBUTTON1 or MB_SETFOREGROUND or MB_TASKMODAL or MB_TOPMOST);
Application.Terminate;
end;
on E:Exception do
begin
Windows.MessageBox(Application.Handle,PChar(E.ClassName+": "+E.Message),"Error",
MB_OK or MB_ICONERROR or MB_DEFBUTTON1 or MB_SETFOREGROUND or MB_TASKMODAL or MB_TOPMOST);
Application.Terminate;
end;
end;

end;


 
Alex Konshin   (2003-04-23 08:30) [5]


//-------------------------------------------------------------
procedure TForm1.FormShow(Sender: TObject);
const
aTabStopsTime : Array [0..6] of Integer = (20,80,155,200,560,610,660);
aTabStopsNoTime : Array [0..5] of Integer = (20,95,140,500,550,600);
var n : DWORD;
begin

// Устанавливаем табуляцию в ListBox
if ShowTimeMode=stmNone then
SendMessage( ListBox1.Handle, LB_SetTabStops, 5, LongInt(@aTabStopsNoTime) )
else
SendMessage( ListBox1.Handle, LB_SetTabStops, 6, LongInt(@aTabStopsTime) );

try
// FillChar(FilterDefinition,SizeOf(FilterDefinition),#0);
with FilterDefinition do
begin
// includefilter[0] := #0;
StrCopy( includefilter, "*" );
// для реальных фильтров делай так:
// StrLCopy( includefilter, "*", sizeof(includefilter)-1 );
// excludefilter[0] := #0; // очищаем
logsuccess := True;
logerror := True;
logreads := True;
logwrites := True;
logaux := True;
end;

//Установка фильтра (что подглядывать будем...
if not DeviceIoControl(DevHandle,
IOCTL_REGMON_SETFILTER,
@FilterDefinition,
sizeof(FilterDefinition),
nil,
0,
n,
nil ) then
raise ERegMonError.Create("Error on IOCTL_REGMON_SETFILTER:"#13#10+SysErrorMessage(GetLastError));

// Have driver zero information
if not DeviceIoControl(DevHandle, IOCTL_REGMON_ZEROSTATS, nil, 0, nil, 0, n, nil ) then
raise ERegMonError.Create("Error on IOCTL_REGMON_ZEROSTATS:"#13#10+SysErrorMessage(GetLastError));

// Have driver turn on hooks
if CaptureLog then
begin
//Подсматриваем
if not DeviceIoControl( DevHandle, IOCTL_REGMON_HOOK, nil, 0, nil, 0, n, nil ) then
raise ERegMonError.Create("Error on IOCTL_REGMON_HOOK:"#13#10+SysErrorMessage(GetLastError));
Timer1.Enabled := True;
{$ifdef debug}
Debug("Main.TForm1.FormCreate: CaptureLog ON",[]);
{$endif}
end
else
begin
//Не подсматриваем
if not DeviceIoControl(DevHandle, IOCTL_REGMON_UNHOOK, nil, 0, nil, 0, n, nil ) then
raise ERegMonError.Create("Error on IOCTL_REGMON_UNHOOK:"#13#10+SysErrorMessage(GetLastError));
Timer1.Enabled := False;
end;

except
on E:ERegMonError do
begin
Windows.MessageBox(Application.Handle,PChar(E.Message),"Error",
MB_OK or MB_ICONERROR or MB_DEFBUTTON1 or MB_SETFOREGROUND or MB_TASKMODAL or MB_TOPMOST);
Application.Terminate;
end;
on E:Exception do
begin
Windows.MessageBox(Application.Handle,PChar(E.ClassName+": "+E.Message),"Error",
MB_OK or MB_ICONERROR or MB_DEFBUTTON1 or MB_SETFOREGROUND or MB_TASKMODAL or MB_TOPMOST);
Application.Terminate;
end;
end;

end;
//-------------------------------------------------------------
procedure TForm1.FormDestroy(Sender: TObject);
begin
Timer1.Enabled := False;
if (DevHandle<>0)and(DevHandle<>INVALID_HANDLE_VALUE) then
CloseHandle(DevHandle);
if DriverName<>"" then UnloadDeviceDriver( PChar(DriverName) );
if pStatBuffer<>nil then FreeMem(pStatBuffer);
end;


 
Alex Konshin   (2003-04-23 08:33) [6]

Короче, кому это действительно надо - разберется.



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
14-7687
Vlad Oshin
2003-06-17 10:05
2003.07.03
Задачка :)


14-7672
Palladin
2003-06-16 21:57
2003.07.03
подскажите ссылку на


14-7593
Leo^Sun
2003-06-14 13:10
2003.07.03
Вывод на экран больших чисел


14-7601
XobBIT
2003-06-17 23:24
2003.07.03
Мастера подскажите аналог IIS или Apache


6-7574
GTS
2003-04-28 13:31
2003.07.03
webbrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский