Текущий архив: 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.45 MB
Время: 0.043 c