Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Net send


Автор: NoliX 19.2.2006, 20:26
Товарищи, подскажите, каким образом можно можно отлавливать приходящие net send сообщения и блочить их в реальном времен, так как в сокетах (на сколько я понимаю они тут нужны) я не разбираюсь, то желательно примерчик, небольшой (заодно и другим пригодится, в поиске про это ничего нету).

Заранее спасибо

PS отключить службу не предлагать, ибо нету таких прав...

Автор: WolfON 19.2.2006, 23:32
Отправляй
Код

winexec('net send localhost RTFM!!',0);

Автор: Bog d`An 20.2.2006, 05:30
Цитата(WolfON @ 19.2.2006, 23:32 Найти цитируемый пост)
winexec('net send localhost RTFM!!',0);

гыгы smile каждый тикsmile
Да, тема актуальна...
На текущий момент из всего что я перебрал наиболее стабильно работающим остаётся перебор (по таймеру 100..1000мс) всех окон.
Код

function GetWindText(AHandle:THandle):String;
var
  cb:DWord;
begin
  cb:=SendMessage(AHandle,WM_GETTEXTLENGTH,0,0);
  SetLength(Result,cb);
  if cb>0  then
    SendMessage(AHandle,WM_GETTEXT,cb+1,LParam(@Result[1]));
end;

Form1.Timer1Timer
Begin
  //Поиск окна
  AHandle  :=  FindWindow(PChar(#32770),  nil);
  if (AHandle  <>  0) then
  Begin
    if GetWindText(AHandle)='Служба сообщений ' then
      if GetExeNameByProcID(pProcID^)='CSRSS.EXE'then}
      Begin
        //Извлечение текста
        AHandleChild  :=  FindWindowEx(AHandle,  0,  PChar(#49177),  nil);
        if (AHandleChild <> 0) then
          CurStr  :=  GetWindText(AHandleChild);
        //Основная часть

        if CurStr<>''then
        Begin
          if Pos('Сообщение от',CurStr) > 0 then
          Begin
            //PostThreadMessage(AHandle,WM_CLOSE,0,0);
            PostMessage(AHandle,WM_CLOSE,0,0);

          While Pos(#$D+#$A+#$D+#$A,CurStr) > -1 do
            Delete(CurStr,MyPos(#$D+#$A+#$D+#$A,CurStr),2);//Удалить лишние строки

         // CurStr - здесь текст сообщения

         End;
      End;
    End;
  End;
End;
//зы: возможно потребуется подключить ShellAPI или ещё чего....

Что не является красивым.

Люди! Не в лом, наваяйте, плиз, перехват создания окна, конкретно для нетсенда!

Ловушка, к-я перехватывает создание того же блокнота упорно не хочет переделыватся для перехвата нетсенда smile может там как-то по другому действовать надо?

Автор: NoliX 22.2.2006, 18:08
вся штука в том, товарищи, что хочется именно отлавливать эти сообщения на пути к экрану монитора...

Автор: Palladin 22.2.2006, 20:34
Меня заинтересовало такая прога, я попробовал сделать её как здесь написано но лезут ошибки, допустим не получилось сделать так чтоб начинался это процесс после нажатия на кнопку и ещё много других

Автор: Palladin 23.2.2006, 01:13
Может кто выложить полный код проги, которая будет отлавливать нетсенды, и показывать айпи и имя кампа с которого пошёл нетсенд??????
ну или хотябы часть проги

Автор: _hunter 23.2.2006, 11:31
за полным кодом -- в раздел работа. там напишут.
тут только помогают...

Автор: smartov 23.2.2006, 12:21
По хорошему надо вешать hook на это дело. Если ловить окно.
А по человечески - надо ловить собственно говоря сообщение.

Из подсказок на других форумах
"Создаешь сокет, ставишь его в промиск моде, ловишь пакеты нет сенда, вырезаешь сообщение, сохраняешь."

http://www.kuban.ru/forum_new/forum2/arhiv/4912.html
http://delphikingdom.com/asp/answer.asp?IDAnswer=5416

Делаешь mailslot (предварительно остановив службу messenger) и ловишь мессаги

http://www.delphipages.com/threads/thread.cfm?ID=154486&G=154450 (компонент mailslot)

Ну и гугли... гугли...

Автор: Bog d`An 24.2.2006, 04:56
smartov, я конечно извиняюсь, но по ссылкам одни вопросы... и теория не подкреплйнная практикой...

не мог бы ты привести код этой радости?
Цитата(smartov @ 23.2.2006, 12:21 Найти цитируемый пост)
"Создаешь сокет, ставишь его в промиск моде, ловишь пакеты нет сенда, вырезаешь сообщение, сохраняешь."


Автор: smartov 24.2.2006, 14:27
Bog d`An,
Цитата(Bog d`An @ 24.2.2006, 03:56 Найти цитируемый пост)
не мог бы ты привести код этой радости?

Не мог бы smile А может тебе уже полноценную софтину накатать smile Тогда это не тот форум

Цитата(Bog d`An @ 24.2.2006, 03:56 Найти цитируемый пост)
но по ссылкам одни вопросы...

В основном да. Но ясно что можно удобно реализовать через mailslot-s. Ссылу на компонент я кинул. Ты его смотрел?... Вооот....

Ну так вот для ленивых

Как работать с mail slot
http://faq.realcoding.net/quest514.html

Ну и собственно пример получения net send. Только не надо пугаться что сайт китайский (или корейский)
Код то все равно английский.
http://www.delphibbs.com/keylife/iblog_show.asp?xid=2657
Ну и собственно исходники, которые там обьясняются http://www.delphibbs.com/keylife/images/u56277/MailSlot.rar

Автор: Bog d`An 25.2.2006, 08:15
smartov, мда... ленивый ты просто...
ели помнишь на ссылках ругаются что может не прокатить...
компонент закачал... может даже щас поставлю... smile

Автор: smartov 26.2.2006, 11:13
Bog d`An,
Цитата(Bog d`An @ 25.2.2006, 07:15 Найти цитируемый пост)
ленивый ты просто..

Я ЕЩЕ И ЛЕНИВЫЙ?! smile Фигасе камрад.
Ну работай тогда далее сам.
Я тебе выискал кучу ответов + исходник вроде как работающий, и я еще и ленивый. Хоть бы спасибо сказал.
Если б ты попытался хоть заюзать их а потом говорил, а так еще и "может не проканать" а может и винда упасть и вообще все что угодно. Так ты проверь сначала!
Ленивый мли.... ну-ну smile


M
Girder
Давайте жить мирно :)

Автор: NoliX 1.3.2006, 11:32
а вопрос так и не решился..

Автор: Bog d`An 2.3.2006, 08:32
smartov, СПАСИБО.
Цитата(smartov @ 26.2.2006, 11:13 Найти цитируемый пост)
Ну работай тогда далее сам.
отмазался smile ню-ню... а ещё говоришь что не ленивый smile
smartov, я ещё ленивее smile до сих пор не открыл делфю smile
Цитата(smartov @ 23.2.2006, 12:21 Найти цитируемый пост)
По хорошему надо вешать hook на это дело. Если ловить окно.

дык вроде ж везде говорят (и я сам пробовал) что hook на отлов создания окна не работает.

NoliX, да... не решился...



Автор: smartov 2.3.2006, 12:09
Bog d`An,
Цитата(Bog d`An @ 2.3.2006, 07:32 Найти цитируемый пост)
что hook на отлов создания окна не работает.

Работает
RTFM!

Автор: Bog d`An 2.3.2006, 16:56
для нетсенда не работает smile

зы: не смог добится от маилслот приёма сообщений. Хотя китайский майслот отправляет сообщения.
тот который в зипе - вообще не может найти в себе класс smile какого?

Автор: smartov 3.3.2006, 17:39
Bog d`An,
Цитата(Bog d`An @ 2.3.2006, 15:56 Найти цитируемый пост)
для нетсенда не работает

А там разве не окно а misterious headers какой-то? Нормальное окно.

Код

function SetWindowsHookEx(idHook: integer; lpfn: TFNHookProc; hmod: HINST; dwThreadID: DWORD): HHOOK; stdcall; 

idHook: описывает тип устанавливаемой ловушки. Данный параметр может принимать одно из следующих значений:

WH_CALLWNDPROC
Фильтр процедуры окна. Функция-фильтр ловушки вызывается, когда процедуре окна посылается сообщение. Windows вызывает этот хук при каждом вызове функции SendMessage.
WH_SHELL
Фильтр приложения оболочки. Функция-фильтр ловушки вызывается, когда создаются и разрушаются окна верхнего уровня или когда приложению-оболочке требуется стать активным.
и много много другого полезного можно прочитать http://www.delphimaster.ru/articles/hooks/
Удачного эРТээФэМа smile

Автор: Sunvas 18.3.2006, 08:50
Вот у меня где-то валялся какой-то старый код. Может кому чем и поможет. Плюс в том, что можно менять имя отправителя, а минус в том, что работает только из Win NT...
Код

implementation 

var
  hLib: THandle = 0;
  NetMessageBufferSend: function(servername: LPCWSTR; msgname: LPCWSTR;
    fromname: LPCWSTR; buf: PBYTE; buflen: DWORD): DWORD; stdcall = nil;
/////////////////////

procedure Tform1.btnSendClick(Sender: TObject);
var
  ToNameBuffer,fromNameBuffer, TextBuffer: PWideChar;
  ToNameLen,fromNameLen, TextLen, RetVal: DWORD;
begin
  if (hLib > 0) and Assigned(NetMessageBufferSend) then
  begin
    ToNameLen := Length({кому отправляем типа строка});
    ToNameBuffer := AllocMem((ToNameLen + 1) * SizeOf(WideChar));
    fromNameLen := Length({от кого отправляем типа строка});
    fromNameBuffer := AllocMem((fromNameLen + 1) * SizeOf(WideChar));
    try
      StringToWideChar({кому отправляем типа строка}, ToNameBuffer, ToNameLen + 1);
      StringToWideChar({от кого отправляем типа строка}, fromNameBuffer, fromNameLen + 1);
       TextLen := Length({Строку, которую отправляем});
      TextBuffer := AllocMem((TextLen + 1) * SizeOf(WideChar));
      try
        StringToWideChar(Text.Text, TextBuffer, TextLen + 1);
        RetVal := NetMessageBufferSend(nil, ToNameBuffer,fromNameBuffer,
                                       PByte(TextBuffer),
                                       (TextLen + 1) * SizeOf(WideChar));
        if RetVal > 0 then
         //showmessage('');
         // raise Exception.Create(SysErrorMessage(RetVal))
        else
         //* Close;
      finally
        FreeMem(TextBuffer);
      end;
    finally
      FreeMem(ToNameBuffer);
    end;
  end;
end;
//////И в конце юнита пишем
initialization
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    hLib := LoadLibrary('netapi32.dll');
    if hLib > 0 then
      @NetMessageBufferSend := GetProcAddress(hLib, 'NetMessageBufferSend');
  end;
finalization
  if hlib > 0 then
    FreeLibrary(hLib);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)