Главная страница
    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.45 MB
Время: 0.043 c
14-1132258063
Jakudza
2005-11-17 23:07
2005.12.11
Установка Rx7


1-1132152240
VEZ
2005-11-16 17:44
2005.12.11
OnExit всегда


4-1129101198
Vcoder
2005-10-12 11:13
2005.12.11
Активизировать чужое окно


3-1130331984
DmitryA
2005-10-26 17:06
2005.12.11
Как открыть таблицу Visual Foxpro?


14-1132410065
quickblack
2005-11-19 17:21
2005.12.11
Командная строка DOS





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский