Главная страница
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.031 c
1-1131684367
Er
2005-11-11 07:46
2005.12.11
Выделение компонентов


14-1132310173
12DFBDD
2005-11-18 13:36
2005.12.11
Java memory leak


2-1133129941
Eksell
2005-11-28 01:19
2005.12.11
Help


6-1125493756
Alex870
2005-08-31 17:09
2005.12.11
idTCPServer и idTCPClient


4-1129093499
SANEK_10289
2005-10-12 09:04
2005.12.11
Где в реестре взять имя пользователя?