Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.032 c
14-1132192872
SPeller
2005-11-17 05:01
2005.12.11
Вторая мировая и роль США в ней


1-1132049770
guru-guru
2005-11-15 13:16
2005.12.11
Окраска ячейки в ListView


11-1111900058
серый мЫш
2005-03-27 09:07
2005.12.11
XLGrid: Редактирование.


3-1130309673
Thor_
2005-10-26 10:54
2005.12.11
Отображение вставки новой записи в DBGrid


4-1129189870
oSa
2005-10-13 11:51
2005.12.11
Очистка поверхности





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