Чужой SOCKET

Тема в разделе "WASM.NETWORKS", создана пользователем John_T, 21 июл 2009.

  1. John_T

    John_T New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    26
    Код (Text):
    1. function WSADuplicateSocket(
    2.     S:TSocket;
    3.     dwProcessID:DWORD;
    4.     var ProtocolInfo:TWSAProtocolInfo):Integer;
    Параметр S задаёт сокет, дескриптор которого нужно скопировать, параметр dwProcessID - идентификатор процесса, для которого предназначена копия. Функция помещает в структуру ProtocolInfo информацию, необходимую для создания копии дескриптора другим процессом. Затем эта структура должна быть каким-то образом передана другому процессу, который передаст её в функцию WSASocket и получит свою копию дескриптора для работы с данным сокетом.

    Как ее передать эту структуру?
    пробую так :
    Код (Text):
    1.     WSADuplicateSocket(S,apph,WPI);
    2.     apph:=SendMessage(apph,WM_COPYDATA,GetCurrentProcessId(),LongInt(@WPI));
    а получить как?
     
  2. John_T

    John_T New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    26
    Вот чего я доcтиг:
    это в инжектнутой длл
    Код (Text):
    1. var
    2.   apph, app: HWND;
    3.   appi:Cardinal;
    4.   WPI : LPWsaProtocol_InfoA;
    5.   pcds : CopyDataStruct;
    6. begin
    7. if Not Sended then Begin
    8.     appi:=GetProcessId('Simple.exe');        //Моя прога
    9.     apph:=FindWindow('TSimpleForm',nil); //Окно моей проги
    10.     app :=FindWindow('Жертва',nil);        //Окно жертвы
    11.     If WSADuplicateSocket(S,appi,WPI) = 0 Then Begin Пытаемся скопировать Socket S - Это точно сокет провепенно!
    12.       pcds.dwData := 100;  // Это вообще не применяется нигде
    13.       pcds.lpData := @WPI;
    14.       pcds.cbData := SizeOf(WPI);
    15.       apph:=SendMessage(apph,WM_COPYDATA,app,LParam(@pcds)); // Отправляем структуру в окно своей программы
    16.       Sended := True;
    17.     End;
    18.   end;
    19.   result:=SendNextHook(s, Buf, len, flags); //Вернем стандартный обработчик
    20. End;
    Вот теперь код в моем приложении:
    Код (Text):
    1. ...
    2. protected
    3.     procedure ReadMsg(var msg: TWMCopyData); message WM_COPYDATA;
    4. ...
    5. procedure TSimpleForm.ReadMsg(var msg: TWMCopyData);
    6. var
    7. apph : Cardinal;
    8. PWPI : LPWsaProtocol_InfoA;
    9. WPI : PWsaProtocolInfo;
    10. SizeOfMem : Int;
    11. WSAError : Int;
    12. begin
    13.  
    14.   SizeOfMem :=Integer((Msg.CopyDataStruct^).cbData); //Значение 4
    15.  
    16.   //GetMem(PWPI,SizeOfMem);  //непомогло
    17.   PWPI := LPWsaProtocol_InfoA((Msg.CopyDataStruct^).lpData);
    18.  
    19.   WSAStartup(MAKEWORD(2,2), vwsadata);
    20.   SocketOfTarget := WSASocket(-1,-1,-1,PWPI,0,WSA_FLAG_OVERLAPPED);
    21.   WSAError := WSAGetLastError(); // Ошибка 10022 Вероятно из за PWPI
    22. end;
    Ну правда устал уже с этим, подскажите пжлст.
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Вобщем, мне эта тема тоже малость поднадоела. Выкладываю тут свои сорцы. Суть немного другая. Задача была создать сокет в одном приложении, а пользоваться в другом. Версия 1.01, а не 2!

    Итак, что в аттаче:
    openport - открывает порт и просто слушает сообщения. Когда что-то приходит, оно отображается на экране;
    server - программа, которая создает сокет, делает паузу через MessageBox, а потом отправляет данные;
    client - открывает сервер, дублирует хендл сокета себе (хендл я не искал, а жестко прописывал - это было просто для теста), соединяет этот сокет с openport. Все это он делает в момент, пока server ждет нажания ОК в MessageBox'е.

    Т.е. схема такая: запускаешь OpenPort. Видишь консоль. Потом запускаешь Server. В консоли видишь сообщение о соединении, а у сервера видишь MessageBox. Потом запускаешь Client (в клиенте есть вызов WSACleanup - удали его, иначе будет обрываться соединение). Клиент устанавливает соединение чужим сокетом и завершается. После этого жмешь ОК в MessageBox'е сервера и тот отправляет строку в OpenPort. Эту строку ты увидишь в консоли.
     
  4. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    MSoft

    Код (Text):
    1. include \masm32\bin\MSoft\MSoft.inc
    2. includelib \masm32\bin\MSoft\MSoft.lib
    Можно еще выложить ?
     
  5. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Они тебе не нужны. Там банальные kernel.lib и прочее - это как бы заготовка для всех сорцев. Возьми просто кодес, инклуды мои не трогай.
     
  6. John_T

    John_T New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    26
    Всем участникам спасибо, разобрался.
    Есть только одна неприятность:
    Я получаю копию Хендла, и пытаюсь туда Sendить в этот момент связь между приложениями А и В теряется.
    Скопировать структуру мне не удалось. Поэтому я все сделал через convertprocesssocket

    Я все еще в поиске решения...
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    WSACleanup вызываешь? Учти, я предупреждал
     
  8. John_T

    John_T New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    26
    Объясни для чего?
     
  9. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Вот его и не нужно вызывать. В моем сорце он вызывается - и теряется из-за этого связь. Если ты делаешь так же, тогда все понятно.
     
  10. John_T

    John_T New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    26
    Нет я так не делаю
     
  11. John_T

    John_T New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    26
    Я создал 2 приложения клиент и сервер, попрактиковался на них. Все работает внедряюсь копирую хендл сокета. Из своего приложения Сенд проходит замечательно. Но вот с той программой с которой бьюсь это не проходит. WPE PRO делает это замечательно а у меня опыта не хватает и знаний :dntknw:
     
  12. John_T

    John_T New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    26
    Я даже пробовал делать Send из инжектированной DLL
    Всеравно обрыв связи
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Ну выход тут только один - сходить к священнику :)
     
  14. John_T

    John_T New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    26
    У меня появилась идея.
    Если попробовать перехватить Socket и создать свой а прогремме подсунуть копию.
    Как думаете пройдет такая мысль?
     
  15. John_T

    John_T New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    26
    Код рабочий. Ошибка была при преобразовании строки в буфер данных. Несоответствие длинны буфера ))
    Вопрос закрыт.
     
  16. lobzik

    lobzik New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2009
    Сообщения:
    34
    Можно посмотреть на код ?