![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы со снятием ловушки
KygECHuK © (2006-05-10 09:22:00)При снятии ловушки прроиходит ошибка доступа памяти:
library W1N;
uses
Windows,
SySUtils,
Messages,
typeunit;
var
SysHook : HHook = 0;
flag : boolean = true;
Password : word = 0;
Wnd : Hwnd = 0;
procedure GetDLLData(var AGlobalData: pdllldata);stdcall; external 'mapping.dll' name 'GetDLLData';
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; export; stdcall;
var
lpdlldata : pdllldata;
i : dword;
str : String;
begin
getdlldata(lpdlldata);
Result := CallNextHookEx(SysHook, Code, wParam, lParam);
case code of
HCBT_CREATEWND:
begin
Str := TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
if TCBTCreateWnd(Pointer(lParam)^).lpcs.hwndParent <> 0 then exit;
if str = '' then exit;
i:=0;
while lpdlldata^.data[i] <> '' do
begin
if lpdlldata.data[i] = str then
begin
try
result:=1;
break
except
end;
end;
Inc(i);
end;
end;
end;
end;
function SetHook(Hook : Boolean) : Boolean; export; stdcall;
begin
Result := false;
if Hook then
begin
if SysHook = 0 then
SysHook := SetWindowsHookEx(WH_CBT{WH_CALLWNDPROC}, @SysMsgProc, HInstance, 0);
Result := (SysHook <> 0);
end else
begin
if SysHook <> 0 then
begin
try
UnhookWindowsHookEx(SysHook);
SysHook := 0;
Result := true;
except
// Ошибка выскакивает вот здесь
end;
end;
end;
end;
exports
SETHOOK index 1;
begin
end.
KygECHuK (2006-05-10 17:48:00) [21]Проверил свои знания по отладке и определился, что перва ошибка возникает при выходе из функции runstophook() в library hook. А вторая - при выходе из функции out_func() в хос- процессе; Но эти ошибки возникаю только тогда, когда я снимаю ловушку.
KygECHuK (2006-05-10 17:25:00) [22]По всякому, например:
а. Можно поставить BreakePoint - F5
b. Mожно выполнять операторы построчно F7 или F8
Сергей М. (2006-05-10 17:18:00) [23]Галиматья.
Рассказывай как ты пользуешь отладчик ...
KygECHuK (2006-05-10 17:13:00) [24]Я то же извеняюсь, просто по данным отладчика ошибки возникают непосредственно после выполнения функции, может быть их источник находится в другом месте программы или ОС. Известно одно - проект готов и работает кроме этого места.
Игорь Шевченко (2006-05-10 17:04:00) [25]KygECHuK © (10.05.06 16:34) [16]
> Ошибка возникает после удаления ловушки, а именно две ошибки
> доступа к памяти
Я извиняюсь, ты указал конкретное место в самом первом посте. В этом месте, на мой непросветленный взгляд, ошибки быть не должно. Одно из двух: либо ты указал не то место, либо моих знаний недостаточно, чтобы понять, как может возникать ошибка в указанном тобой месте, а тем более две ошибки.
Сергей М. (2006-05-10 16:55:00) [26]Удалено модератором
KygECHuK (2006-05-10 16:34:00) [27]>> А откуда она может здесь выскакивать ? UnhookWindowsHook исключений не возбуждает, переменная SysHook всяко доступна для чтения/записи...
Ошибка возникает после удаления ловушки, а именно две ошибки доступа к памяти. Затем при вызове функции Application.ProcessMessages в любом другом приложении происходит его зависание. Что то с Message`ами не то.
KygECHuK (2006-05-10 16:26:00) [28]функция выполняет команду следующим образом:
выделяет из команды название целевой библиотеки, провереят если библиотека не была подключена - подключает, иначе работает с подключенной библиотекой, библиотека выгружается только при поступлении соответсвующей команды. Далее происходит вызов функции из подключенной библиотеки и бла бла бла...
Игорь Шевченко (2006-05-10 15:55:00) [29]
> try
> UnhookWindowsHookEx(SysHook);
> SysHook := 0;
> Result := true;
> except
> // Ошибка выскакивает вот здесь
> end;
>
А откуда она может здесь выскакивать ? UnhookWindowsHook исключений не возбуждает, переменная SysHook всяко доступна для чтения/записи...
Сергей М. (2006-05-10 15:45:00) [30]Хрень какая-то ..
Экзекутор какой-то ..
Ты вообще-то в состоянии ТЗ привести ?
KygECHuK (2006-05-10 14:42:00) [31]>> Сей термин - чушь.
учту, спасибо
вот хост-процесс :
.
.
TStd_Func = procedure(Command: pchar; Adr: PChar; Size:word; var Res: PChar; var OutSize:integer);stdcall;
.
.
.
procedure executer(Comm: Pchar; var Back: Pointer; var size: integer);
var
sizeInL : Integer;
DllIndex : Integer;
lpLibrary : Pointer;
lpCommand : Pointer;
lpParams : Pointer;
DllHandle : THandle;
ResString : String;
begin
buff_deploy(Comm, size, lpLibrary, lpCommand, lpParams);
DllIndex := DllArrFinder(PChar(lpLibrary));
if DllIndex = -1 then
begin
DllHandle := LoadLibrary(Pchar(pchar(lpLibrary) + '.dll'));
if dllhandle = 0 then
begin
ResString := 'library "' + pchar(lpLibrary) + '" not found';
size := length(ResString) + 1;
ReallocMem(Back, size);
CopyMemory(Back, Pchar(ResString), size);
exit;
end;
DllArrAdd(PChar(lpLibrary), DllHandle);
end else
DllHandle := DllArr[DllIndex].DllHandle;
if pchar(lpCommand) = 'FreeDll' then
begin
DllArrDelete(DllArrFinder(pchar(lpLibrary)));
FreeLibrary(DllHandle);
ResString := 'Library "' + Pchar(lpCommand) + '" not found';
size := length(ResString) + 1;
ReallocMem(Back, size);
CopyMemory(Back, Pchar(ResString), size);
exit;
end;
@out_func := GetProcAddress(DllHandle, 'DefaultFunction');
if @out_func = nil then
begin
ResString := 'function "' + Pchar(lpCommand) + '" not found';
size := length(ResString) + 1;
ReallocMem(Back, size);
CopyMemory(Back, Pchar(ResString), size);
exit;
end;
sizeInL := size - cardinal(lpParams) + cardinal(comm);
out_func(lpCommand, lpParams, sizeInL, Pchar(back), size);
end;
Сергей М. (2006-05-10 14:27:00) [32]
> Хост-библиотеки :
>
Сей термин - чушь.
"Хост" может быть лишь приложением (точнее - процессом) , но никак не библиотекой.
Ну и где код обращения хост-процесса к сей библ-ке ?
KygECHuK (2006-05-10 14:21:00) [33]Итак описание "Болезни":
Сама по себе ловушка снимается, что свидетельствует не выполнеие CallBack функции, но с очередью сообщений твариться что то странное.
ошибка доступа к памяти два раза подряд указывает, что происходит чтение по адрессу 000000, я предполагаю, что происходит обращение к освобождённой памяти, два раза.
Вот кусок Хост-библиотеки :
library hookF;
.
.
.
var
function runstophook(Hook : Boolean) : Boolean; stdcall; external 'W1N.dll' index 1
procedure GetDLLData(var AGlobalData: pdllldata);stdcall; external 'mapping.dll' name 'GetDLLData';
.
.
.
procedure DefaultFunction(command: pchar; adr: Pointer; size: word; var res: pointer; var outsize: integer);stdcall;export;
.
.
.
if command = 'run hook' then
begin
if HookIsRunning then
begin
runstr:='HOOK already runing';
end else
begin
if not FileExists(DenitedList) then
begin
outsize := StringToResult('list is absend', res, @alloCkated);
exit;
end;
init := TIniFile.Create(ReloadList);
init.WriteString('hook', 'command', 'hook|run hook');
init.Free;
GetDLLData(lpdlldata);
fillchar(lpdlldata^.data, sizeof(lpdlldata^.data), #0);
AssignFile(f, DenitedList);
Reset(f);
i := 0;
while not eof(f) do
begin
readln(f, lpdlldata^.data[i]);
inc(i);
end;
CloseFile(f);
if i <= 0 then
begin
outsize := StringToResult('list is absend', res, @alloCkated);
exit;
end;
if runstophook(true) then
begin
runstr := command + ' - ok';
HookIsRunning := true;
end else
begin
runstr:='can not create hook';
end;
end;
outsize := StringToResult(pchar(runstr), res, @alloCkated);
exit;
end;
if command = 'stop hook' then
begin
if HookIsRunning then
begin
init := TIniFile.Create(ReloadList);
init.WriteString('hook', 'command', 'hook|run hook');
init.Free;
if runstophook(false) then
begin
runstr := command + ' - ok';
HookIsRunning := false;
end;
end else runstr:='hook is not running';
outsize := StringToResult(pchar(runstr), res, @alloCkated);
exit;
end;
outsize := StringToResult('Command not found', res, @alloCkated);
end;
exports DefaultFunction;
begin
По сути происходит лишь вызов функции runstophook() на этом прямое обращение к библитеке с ловушки исчерпывается.
Сергей М. (2006-05-10 14:10:00) [34]
> Dstr © (10.05.06 14:08) [8]
Спасибо, взяли тебя "на заметку".
Dstr (2006-05-10 14:08:00) [35]Если вы говорите про ApiHook то кому надо стучитесь в Асю 209-298-286 и я вам все расскажу,я уже связывался давно с етой темой,и нашел Pas файлы с функциями в инете
Сергей М. (2006-05-10 13:01:00) [36]Значит проблема в хост-приложении, устанавливающем/снимающем этот глоб.хук
KygECHuK (2006-05-10 12:53:00) [37]Применил - не получилось WHY ?
library W1N;
uses
Windows,
SySUtils,
Messages,
typeunit;
var
SysHook : HHook = 0;
flag : boolean = true;
Password : word = 0;
Wnd : Hwnd = 0;
procedure GetDLLData(var AGlobalData: pdllldata);stdcall; external 'mapping.dll' name 'GetDLLData';
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; export; stdcall;
var
lpdlldata : pdllldata;
i : dword;
str : String;
begin
getdlldata(lpdlldata);
Result := CallNextHookEx(lpdlldata^.SyShook, Code, wParam, lParam);
case code of
HCBT_CREATEWND:
begin
Str := TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
if TCBTCreateWnd(Pointer(lParam)^).lpcs.hwndParent <> 0 then exit;
if str = '' then exit;
i:=0;
while lpdlldata^.data[i] <> '' do
begin
if lpdlldata.data[i] = str then
begin
try
result:=1;
break
except
end;
end;
Inc(i);
end;
end;
end;
end;
function SetHook(Hook : Boolean) : Boolean; export; stdcall;
var
lpdlldata : pdllldata;
begin
getdlldata(lpdlldata);
Result := false;
if Hook then
begin
if SysHook = 0 then
SysHook := SetWindowsHookEx(WH_CBT{WH_CALLWNDPROC}, @SysMsgProc, HInstance, 0);
lpdlldata^.SyShook := SysHook;
Result := (SysHook <> 0);
end else
begin
if SysHook <> 0 then
begin
try
UnhookWindowsHookEx(lpdlldata^.Syshook);
lpdlldata^.SyShook := 0;
Result := true;
except
end;
end;
end;
end;
exports
SETHOOK index 1;
begin
end.
Сергей М. (2006-05-10 11:26:00) [38]Если так, то правильно.
KygECHuK (2006-05-10 11:21:00) [39]В моей программе уже используется библиотека с FileMapping. функция getdlldata получает указатель на адресс расшаренной памяти. Как я понимаю в структу, которая хранится по этому адрессу мне нужно добавить поле для хранения переменной syshook и использовать её значение, всякий раз при вызове CallNextHookEx() и UnhookWindowsHookEx(). Я правильно понимаю ?
Сергей М. (2006-05-10 10:41:00) [40]см. CreateFilemapping + MapViewOfFile