Форум: "Система";
Текущий архив: 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