Всем превед!!!
Сори за задержку, все оказалось не так просто как вначале казалось :)
Итак начнем ...Реализовано два класса для ассинхронного межпроцессного взаимодействия на основе именованных каналов (named pipes):
Клиент -
http://ifolder.ru/5502535
Сервер -
http://ifolder.ru/5502506
Дабы не порождать ненужный никому флуд про вирусы :crazy: выкладываю все в исходниках.
Среда разработки BDS 2006, тестилось все на WinXP, сразу скажу на Win98 работать скорее всего небудет.
Для чего это все задумывалось:
На некоторых серверах "хитрые" админы реализуют последующую шифрацию/дешифрацию трафика после его отсылки клиентом, т.е. перехватывают функции recv и send библиотеки ws2_32.dll, а так как наша задача состоит в том чтобы этими данными манипулировать это не есть хорошо. Чтобы не разбираться в ихних "замутах" можно поступить следующим образом: перехватываем recv/send и перенаправляем трафик по именнованным каналам в наше приложение. Т.о. мы отказываемся от сокетов (с которыми могли наворотить х.з. шо) и не делаем подмену адресов как реализовано допустим в том же l2phx (что в принципе можно далее проконтролировать), пользуясь случаем xKor респект тебе и уважуха :)
Теперь вкратце о том как все реализовано...
Классы клиента и сервера несут в себе по два дуплексных именованных канала (сервер 2*колво клиентов) один для вставки в функцию recv другой соответственно в send. Канал клиента берет данные из recv отдает их на обработку серверу (см. пример функции packetprocessor) и возвращает переданные сервером данные в La2. Канал сервера полностью аналогично но для функции send. Код сколько было сил откомментировал, так что если заинтересовало, имхо разберетесь. Пользуйтесь на здоровье!!!
З.Ы. сообщения о глюках приветствуются :twisted:
Добавлено спустя 1 день 4 часа 15 минут 55 секунд:
А вот примерчик inject.dll с использованием моих компонентов
Не тестил!!! Просто попробовал откомпилить... так что просто примерчик))
Код:
library inject;
uses
windows,
L2ipcClient in 'L2ipcClient.pas';
const
INVALID_SOCKET = -1;
PAGE_EXECUTE_READWRITE = $40;
type
DWORD = LongWord;
var
SendNextHook:function (s:integer;buf:DWORD;len:integer;flags:integer):integer; stdcall;
RecvNextHook:function (s:integer;buf:DWORD;len:integer;flags:integer):integer; stdcall;
UsingSocketRecv:integer=INVALID_SOCKET;
UsingFlagsRecv:integer=0;
UsingSocketSend:integer=INVALID_SOCKET;
UsingFlagsSend:integer=0;
MyThreadId:THandle;
SendBuffer:array [0..$FFF0] of byte;
RecvBuffer:array [0..$FFF0] of byte;
La2IPCcommClient:TLa2IPCcommClient;
function SendHookProc (s:integer;buf:DWORD;len:integer;flags:integer):integer; stdcall;forward;
function RecvHookProc (s:integer;buf:DWORD;len:integer;flags:integer):integer; stdcall;forward;
function SendHookProc (s:integer;buf:DWORD;len:integer;flags:integer):integer; stdcall;
var pck:string;
OldProtect: dword;
bufadr:pointer;
begin
UsingSocketSend:=s;
UsingFlagsSend:=flags;
setlength(pck,len);
bufadr:=pointer(buf);
VirtualProtect(bufadr, len, PAGE_EXECUTE_READWRITE, OldProtect);
CopyMemory(@pck[1],bufadr,len);
VirtualProtect(bufadr, len, OldProtect, OldProtect);
La2IPCcommClient.SendtoServer(pck);
result:=len;
end;
function RecvHookProc (s:integer;buf:DWORD;len:integer;flags:integer):integer; stdcall;
var pck:string;
OldProtect: dword;
bufadr:pointer;
begin
UsingSocketRecv:=s;
UsingFlagsRecv:=flags;
bufadr:=pointer(buf);
pck:=La2IPCcommClient.ReadfromServer;
if pck<>'' then begin
VirtualProtect(bufadr, length(pck), PAGE_EXECUTE_READWRITE, OldProtect);
CopyMemory(bufadr,@pck[1],length(pck));
VirtualProtect(bufadr, length(pck), OldProtect, OldProtect);
end;
result:=length(pck);
end;
procedure ReadWriteThread(La2IPCClient:pointer);
var
pcks,pckr:string;
len:integer;
La2IPCl:TLa2IPCcommClient;
begin
La2IPCl:=La2IPCClient;
while True do
begin
if UsingSocketRecv<>INVALID_SOCKET then
begin
len:=RecvNextHook(UsingSocketRecv,dword(@RecvBuffer),$FFF0,UsingFlagsRecv);
setlength(pckr,len);
Copymemory(@pckr[1],@RecvBuffer,len);
La2IPCl.SendtoClient(pckr);
end;
if UsingSocketSend<>INVALID_SOCKET then
begin
pcks:=La2IPCl.ReadfromClient;
if pcks<>'' then
begin
Copymemory(@SendBuffer,@pcks[1],length(pcks));
SendNextHook(UsingSocketSend,dword(@SendBuffer),length(pcks),UsingFlagsSend);
end;
end;
end;
end;
begin
La2IPCcommClient:=TLa2IPCcommClient.Create;
//HookProc('ws2_32.dll', 'recv', @RecvHookProc, @RecvNextHook);
//HookProc('ws2_32.dll', 'send', @SendHookProc, @SendNextHook);
//запускаем вспомогательный поток и передаем ему указатель на обьект TLa2IPCcommClient
BeginThread(nil, 0, @ReadWriteThread, pointer(La2IPCcommClient), 0, MyThreadId);
end.