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

Вниз

EAccessViolation при обращении к полю класса   Найти похожие ветки 

 
The One ©   (2005-11-25 21:20) [0]

Здравствуйте.
Пишу “обертку класса”, призванного устанавливать хук на некоторые АПИ-функции, работающие с реестром. Вот его кусок:

TRegApiHook = class
 private
    FAdrRegOpenKey: pointer;
    FOldRegOpenKey: OldCode;
    FJmpRegOpenKey: far_jmp;
    FCurrProc,FCurrProcID:cardinal;
    FOpenRootKey,FOpenSubKey:string;
    FBeforeModifyAll: TBeforeModifyAllEvent;
 protected
    function GetOpenKeyPath:string;
 public
    procedure StopThreads;
    procedure SetHook;
    procedure RunThreads;
    property CurrProc:cardinal read FCurrProc write FCurrProc;
    property CurrProcID:cardinal read FCurrProcID write FCurrProcID;
    property BeforeModifyAll: TBeforeModifyAllEvent read FBeforeModifyAll write FBeforeModifyAll;
    function RAHOpenKeyEx(hKey: HKEY; lpSubKey: LPCTSTR; ulOptions: DWORD;
             samDesired: REGSAM; var phkResult: HKEY):integer;
    constructor Create;
 end;

function TRegApiHook.RAHOpenKeyEx(hKey: HKEY; lpSubKey: LPCTSTR; ulOptions: DWORD;
                       samDesired: REGSAM; var phkResult: HKEY): integer;
var Writen:cardinal;
begin
if Assigned(FBeforeModifyAll) then //здесь вылетает EAccessViolation
       FBeforeModifyAll(self, rtOpenKey);
case hKey of
HKEY_CLASSES_ROOT:FOpenRootKey:="HKEY_CLASSES_ROOT";
HKEY_CURRENT_USER:FOpenRootKey:="HKEY_CURRENT_USER";  HKEY_LOCAL_MACHINE:FOpenRootKey:="HKEY_LOCAL_MACHINE";  HKEY_USERS:FOpenRootKey:="HKEY_USERS";
end;
FOpenSubKey:=lpSubKey;
WriteProcessMemory(CurrProc,FAdrRegOpenKey,@FOldRegOpenKey,SizeOf(OldCode),Writen);
result := RegOpenKeyEx(hKey, lpSubKey,ulOptions,samDesired,phkResult);
WriteProcessMemory(CurrProc, FAdrRegOpenKey, @FJmpRegOpenKey, SizeOf(far_jmp), Writen);
end;

Метод RAHOpenKeyEx (*) вызывается из регулярной функции, адрес которой подменяет собой адрес АПИ-функции RegOpenKeyEx. Т.е. проще говоря, вместо RegOpenKeyEx выполняется метод (*).

Ошибка EAccessViolation возникает при любой попытке обратиться к полю класса TRegApiHook из обозначенного метода.

Замечу, что абсолютно аналогичной схеме я отлавливаю и обрабатываю еще функции RegSetValue, RegCreateKey, RegDeleteKey, RegDeleteValue. Никаких ошибок при этом не замечено. Ума не приложу в чем здесь проблема.

Далее привожу конструктор класса, в котором собственно и выполняется установка ловушек:

constructor TRegApiHook.Create;
begin
 inherited;
CurrProc := GetCurrentProcess;
CurrProcID:=GetCurrentProcessId;
//получение адреса процедур
FAdrRegOpenKey:= GetProcAddress(GetModuleHandle("advapi32.dll"),"RegOpenKeyExA");
//инициализация структуры перехвата
FJmpRegOpenKey.PuhsOp:= $68;
FJmpRegOpenKey.PushArg:=@NewRegOpenKeyEx;
FJmpRegOpenKey.RetOp:=$C3;

ReadProcessMemory(CurrProc, FAdrRegOpenKey,@FOldRegOpenKey,SizeOf(OldCode),bw);
//записываем новое начало
WriteProcessMemory(CurrProc, FAdrRegOpenKey, @FJmpRegOpenKey, SizeOf(far_jmp), Writen);
end;

И регулярная функция, которой передается управление при возникновении оригинальной АПИ:

function NewRegOpenKeyEx(
 hKey: HKEY;
 lpSubKey: LPCTSTR;
 ulOptions: DWORD;
 samDesired: REGSAM;
 var phkResult: HKEY
):integer; stdcall;
begin
//RAH1 – объект класса TRegApiHook
 result:=RAH1.RAHOpenKeyEx(hKey,lpSubKey,ulOptions,samDesired,phkResult);
end;


 
The One ©   (2005-11-25 23:13) [1]

Проблемма решена. Сорри за флуд.



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

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.038 c
3-1130411409
diwww
2005-10-27 15:10
2005.12.11
Получить позицию первой выводимой записи в DBGrid-е


14-1131663499
chainik86
2005-11-11 01:58
2005.12.11
Где можно взять бесплатный GLScene?


3-1130312080
oleggar
2005-10-26 11:34
2005.12.11
Clipper indexing


2-1132337212
Sysanin
2005-11-18 21:06
2005.12.11
Закрытие программы


4-1128801147
Orange
2005-10-08 23:52
2005.12.11
функция CreateFile завершается неудачей.