PDA

Просмотр полной версии : Межпроцессное взаимодействие без сокетов


Ptica
13.02.2008, 14:48
Ситуация такая: в некоторой защите от ботов используется перехват send и recv из ws2_32.dll c последующей шифрацией. В голову нипришло ничего умнее как поставить хуки на эти функции ( а-ля inject.dll) и таким образом получить трафик до его криптования.
Теперь вот нужна идея каким образом можно устроить обмен данными между моим "инжектом" и каким либо внешним приложением не используя сокеты. Может у кого есть примеры использования каналов(pipes) или DDE или что другое что можно приспособить для этих целей.
З.Ы. среда программирования желательно Delphi

xkor
13.02.2008, 16:14
http://delphikingdom.com/asp/nets.asp?ItemID=1 (http://delphikingdom.com/asp/nets.asp?ItemID=1) - тут много статей по этому поводу...

Ptica
14.02.2008, 12:18
Спасиб за ответ :)
Ресурс действительно интересный, инфы море, вариантов вагон ... так что покачто голове каша :crazy:
Как немного в себя приду отпишусь тута, думаю многим былобы интересно ....

Ptica
27.02.2008, 18:27
Всем превед!!!
Сори за задержку, все оказалось не так просто как вначале казалось :)
Итак начнем ...Реализовано два класса для ассинхронного межпроцессного взаимодействия на основе именованных каналов (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):in teger; stdcall;
RecvNextHook:function (s:integer;buf:DWORD;len:integer;flags:integer):in teger; 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):in teger; stdcall;forward;
function RecvHookProc (s:integer;buf:DWORD;len:integer;flags:integer):in teger; stdcall;forward;



function SendHookProc (s:integer;buf:DWORD;len:integer;flags:integer):in teger; 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):in teger; 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(@RecvBuffe r),$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),le ngth(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.

NLObP
16.10.2008, 12:18
Файлы на ifolder потерли. Большая прозьба, перезалейте...

Смотри первое сообщение.

Argot
18.10.2008, 10:39
Если сильно не заморачиваться то защита от этого приема всего 4 строчки асемблерного кода ))

Приводить код не буду.
Но суть при вызове функции. Получаем стек и из него получаем адрес от куда нас вызвали. Потом проверям адрес какому адресному пространсву пренадлежит и уже потом выполнять соотведствующие действия ))