Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 13.02.2008, 14:48   #1
Новичок
 
Аватар для Ptica
 
Регистрация: 11.02.2008
Сообщений: 24
Сказал Спасибо: 8
Имеет 11 спасибок в 5 сообщенях
Ptica
Радость Межпроцессное взаимодействие без сокетов

Ситуация такая: в некоторой защите от ботов используется перехват send и recv из ws2_32.dll c последующей шифрацией. В голову нипришло ничего умнее как поставить хуки на эти функции ( а-ля inject.dll) и таким образом получить трафик до его криптования.
Теперь вот нужна идея каким образом можно устроить обмен данными между моим "инжектом" и каким либо внешним приложением не используя сокеты. Может у кого есть примеры использования каналов(pipes) или DDE или что другое что можно приспособить для этих целей.
З.Ы. среда программирования желательно Delphi
Вложения
Тип файла: zip Client.zip (6.4 Кб, 97 просмотров)
Тип файла: zip Server.zip (7.9 Кб, 86 просмотров)
__________________
Пустынен мир, и нет конца пустыне,
и рай закрыт, и ни души в аду.

Октавио Пас "Оборванная элегия"

Последний раз редактировалось NLObP, 02.10.2008 в 21:54.
Ptica вне форума   Ответить с цитированием
За это сообщение Ptica нажился 2 спасибками от:
Старый 13.02.2008, 16:14   #2
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

http://delphikingdom.com/asp/nets.asp?ItemID=1 - тут много статей по этому поводу...
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 14.02.2008, 12:18   #3
Новичок
 
Аватар для Ptica
 
Регистрация: 11.02.2008
Сообщений: 24
Сказал Спасибо: 8
Имеет 11 спасибок в 5 сообщенях
Ptica
По умолчанию Re: Межпроцессное взаимодействие без сокетов

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

Октавио Пас "Оборванная элегия"
Ptica вне форума   Ответить с цитированием
Старый 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 нажился спасибкой от:
Старый 16.10.2008, 12:18   #5
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию

Цитата:
Сообщение от Гость2009 Посмотреть сообщение
Файлы на ifolder потерли. Большая прозьба, перезалейте...
Смотри первое сообщение.
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


NLObP вне форума   Ответить с цитированием
За это сообщение NLObP нажился спасибкой от:
Старый 18.10.2008, 10:39   #6
Пользователь
 
Регистрация: 10.10.2007
Сообщений: 39
Сказал Спасибо: 0
Имеет 7 спасибок в 5 сообщенях
Argot
По умолчанию

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

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

Последний раз редактировалось Argot, 18.10.2008 в 10:46.
Argot вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 20:29.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!