
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.80.4.147] |
![]() |
|
Сообщ.
#1
,
|
|
|
Добрый день. Пытаюсь перехватить вызов recv в своей программе из браузер IE. Но иногда происходит падение приложения. Никак не могу разобраться в чём же ошибка. Помогите пожалуйста. Проект прикрепил.
Прикреплённый файл ![]() |
![]() |
Сообщ.
#2
,
|
|
Причина в процедуре SpliceLockJmp, не смотря на то что VirtualProtect выполняется успешно, атрибуты защиты иногда возвращаются обратно (из-за одновременного вызова функций из разных нитей) и инструкция lock xchg word ptr [ecx], ax выполняется с ошибкой. На этом моменте я кстати заострял внимание в статье - не внимательно читаешь.
Исправить достаточно просто. ![]() ![]() function InterceptedSend(S:Cardinal;var Buf;Len:Integer;flags:integer):integer;stdcall; type TSend = function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; var _send: TSend; begin // SpliceLockJmp(HotPathSpliceRec[P_SEND].FuncAddr, HotPathSpliceRec[P_SEND].LockJmp); // Result := send(s,buf,len,flags); // SpliceLockJmp(HotPathSpliceRec[P_SEND].FuncAddr, LOCK_JMP_OPKODE); @_send := PAnsiChar(HotPathSpliceRec[P_SEND].FuncAddr) + 2; Result := _send(s,buf,len,flags); end; function InterceptedRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; type TRecv = function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; var _recv: TRecv; begin // SpliceLockJmp(HotPathSpliceRec[P_RECV].FuncAddr, HotPathSpliceRec[P_RECV].LockJmp); // Result := recv(s, Buf, len, flags); // SpliceLockJmp(HotPathSpliceRec[P_RECV].FuncAddr, LOCK_JMP_OPKODE); @_recv := PAnsiChar(HotPathSpliceRec[P_RECV].FuncAddr) + 2; Result := _recv(s, Buf, len, flags); end; Здесь не производится снятие перехватчика, а сразу идет вызов на саму функцию. ЗЫ: а вообще хотел этот подход на вторую часть статьи оставить, не думал что кто-то наткнется ![]() |