Код (Text): function WSADuplicateSocket( S:TSocket; dwProcessID:DWORD; var ProtocolInfo:TWSAProtocolInfo):Integer; Параметр S задаёт сокет, дескриптор которого нужно скопировать, параметр dwProcessID - идентификатор процесса, для которого предназначена копия. Функция помещает в структуру ProtocolInfo информацию, необходимую для создания копии дескриптора другим процессом. Затем эта структура должна быть каким-то образом передана другому процессу, который передаст её в функцию WSASocket и получит свою копию дескриптора для работы с данным сокетом. Как ее передать эту структуру? пробую так : Код (Text): WSADuplicateSocket(S,apph,WPI); apph:=SendMessage(apph,WM_COPYDATA,GetCurrentProcessId(),LongInt(@WPI)); а получить как?
Вот чего я доcтиг: это в инжектнутой длл Код (Text): var apph, app: HWND; appi:Cardinal; WPI : LPWsaProtocol_InfoA; pcds : CopyDataStruct; begin if Not Sended then Begin appi:=GetProcessId('Simple.exe'); //Моя прога apph:=FindWindow('TSimpleForm',nil); //Окно моей проги app :=FindWindow('Жертва',nil); //Окно жертвы If WSADuplicateSocket(S,appi,WPI) = 0 Then Begin Пытаемся скопировать Socket S - Это точно сокет провепенно! pcds.dwData := 100; // Это вообще не применяется нигде pcds.lpData := @WPI; pcds.cbData := SizeOf(WPI); apph:=SendMessage(apph,WM_COPYDATA,app,LParam(@pcds)); // Отправляем структуру в окно своей программы Sended := True; End; end; result:=SendNextHook(s, Buf, len, flags); //Вернем стандартный обработчик End; Вот теперь код в моем приложении: Код (Text): ... protected procedure ReadMsg(var msg: TWMCopyData); message WM_COPYDATA; ... procedure TSimpleForm.ReadMsg(var msg: TWMCopyData); var apph : Cardinal; PWPI : LPWsaProtocol_InfoA; WPI : PWsaProtocolInfo; SizeOfMem : Int; WSAError : Int; begin SizeOfMem :=Integer((Msg.CopyDataStruct^).cbData); //Значение 4 //GetMem(PWPI,SizeOfMem); //непомогло PWPI := LPWsaProtocol_InfoA((Msg.CopyDataStruct^).lpData); WSAStartup(MAKEWORD(2,2), vwsadata); SocketOfTarget := WSASocket(-1,-1,-1,PWPI,0,WSA_FLAG_OVERLAPPED); WSAError := WSAGetLastError(); // Ошибка 10022 Вероятно из за PWPI end; Ну правда устал уже с этим, подскажите пжлст.
Вобщем, мне эта тема тоже малость поднадоела. Выкладываю тут свои сорцы. Суть немного другая. Задача была создать сокет в одном приложении, а пользоваться в другом. Версия 1.01, а не 2! Итак, что в аттаче: openport - открывает порт и просто слушает сообщения. Когда что-то приходит, оно отображается на экране; server - программа, которая создает сокет, делает паузу через MessageBox, а потом отправляет данные; client - открывает сервер, дублирует хендл сокета себе (хендл я не искал, а жестко прописывал - это было просто для теста), соединяет этот сокет с openport. Все это он делает в момент, пока server ждет нажания ОК в MessageBox'е. Т.е. схема такая: запускаешь OpenPort. Видишь консоль. Потом запускаешь Server. В консоли видишь сообщение о соединении, а у сервера видишь MessageBox. Потом запускаешь Client (в клиенте есть вызов WSACleanup - удали его, иначе будет обрываться соединение). Клиент устанавливает соединение чужим сокетом и завершается. После этого жмешь ОК в MessageBox'е сервера и тот отправляет строку в OpenPort. Эту строку ты увидишь в консоли.
MSoft Код (Text): include \masm32\bin\MSoft\MSoft.inc includelib \masm32\bin\MSoft\MSoft.lib Можно еще выложить ?
Они тебе не нужны. Там банальные kernel.lib и прочее - это как бы заготовка для всех сорцев. Возьми просто кодес, инклуды мои не трогай.
Всем участникам спасибо, разобрался. Есть только одна неприятность: Я получаю копию Хендла, и пытаюсь туда Sendить в этот момент связь между приложениями А и В теряется. Скопировать структуру мне не удалось. Поэтому я все сделал через convertprocesssocket Я все еще в поиске решения...
Вот его и не нужно вызывать. В моем сорце он вызывается - и теряется из-за этого связь. Если ты делаешь так же, тогда все понятно.
Я создал 2 приложения клиент и сервер, попрактиковался на них. Все работает внедряюсь копирую хендл сокета. Из своего приложения Сенд проходит замечательно. Но вот с той программой с которой бьюсь это не проходит. WPE PRO делает это замечательно а у меня опыта не хватает и знаний
У меня появилась идея. Если попробовать перехватить Socket и создать свой а прогремме подсунуть копию. Как думаете пройдет такая мысль?
Код рабочий. Ошибка была при преобразовании строки в буфер данных. Несоответствие длинны буфера )) Вопрос закрыт.