Показать сообщение отдельно
Старый 27.02.2008, 18:27   #4
Новичок
 
Аватар для Ptica
 
Регистрация: 11.02.2008
Сообщений: 24
Сказал Спасибо: 8
Имеет 11 спасибок в 5 сообщенях
Ptica
По умолчанию Re: Межпроцессное взаимодействие без сокетов

Всем превед!!!
Сори за задержку, все оказалось не так просто как вначале казалось :)
Итак начнем ...Реализовано два класса для ассинхронного межпроцессного взаимодействия на основе именованных каналов (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.
__________________
Пустынен мир, и нет конца пустыне,
и рай закрыт, и ни души в аду.

Октавио Пас "Оборванная элегия"
Ptica вне форума   Ответить с цитированием
За это сообщение Ptica нажился спасибкой от: