Главная Новые темы Список тем Задать вопрос Поиск  
Oткрытая львовская Группа Пользователей Unix

Форум "Delphi"


Паскаль, Делфи


 #0 Чехонте 07.09.06 18:13:02 - 08.09.06 01:41:31

кого достал radmin на работе?



меня вот тоже...
заставило начальство поставить, и еще скрыть иконку на факт присутствия подключения.

собственно, проект:
program RADMINDETECT;

uses
  Windows,
  Messages,
  WinSock;

resourcestring
_0=':: Фатальная ошибка ::';
_1=':: Инфо ::';
_2='Не удалось зарегистрировать класс окна.';
_3='Не удалось создать главное окно программы.';
_4='{ED526154-8DD8-4CDF-B553-F1036BE63D­E9}';
_5='Программа уже запущена.';
_6='HotKeys не зарегистрированы.';
_7='Ошибка инициализации WinSock';
_8='Ошибка связывания структуры с сокетом';
_9='Ошибка изменения/получения режима ввода/вывода сокета';

type
  PTMibTCPRow = ^TMibTCPRow;
  TMibTCPRow = packed record
    dwState: DWORD;
    dwLocalAddr: DWORD;
    dwLocalPort: DWORD;
    dwRemoteAddr: DWORD;
    dwRemotePort: DWORD;
  end;

  PTMibTCPTable = ^TMibTCPTable;
  TMibTCPTable = packed record
    dwNumEntries: DWORD;
    Table: array[0..0] of TMibTCPRow;
  end;
  
var
  {WSData: TWSAData;
  sServerListen: TSocket;
  localaddr: TSockAddrIn;
  ulBlock: LongInt;}

  Size: DWORD;
  TCPTable: PTMibTCPTable;
  I: DWORD;

  th1:cardinal;
  h1:integer;

  Mutex: THandle;
  _WndClass: TWNDClassEx;
  AMessage: TMsg;
  hWindow: HWND;
  KeyID,d1,d2: ATOM;
  //номер предыдущего desktop-а
  PrevDsk: integer;
  //номер текущего desktop-а
  CurrentDsk: integer;
  //список все desktop-ов и их окон верхнего уровня
  DESKTOPS: array [0..1,0..50] of HWND;

  //три системных окна которые не подлежат изменениям
  DskWindow1, DskWindow2, DskWindow3: HWND;

  //счетчик окон верхнего уровня для текущего desktop-а
  HWNDCNT: integer;

//procedure RDetect;stdcall;

function GetTcpTable(pTCPTable: PTMibTCPTable; var pDWSize: DWORD;
    bOrder: BOOL): DWORD; stdcall; external 'IPHLPAPI.DLL';

//procedure RDetect;stdcall;

function EnumWindowsProc(Wnd: HWND; Param: lParam): bool; stdcall;
begin
  if (Wnd<>DskWindow1) and (Wnd<>DskWindow2) and (Wnd<>DskWindow3) then
  if IsWindowVisible(Wnd) then
  begin
    DESKTOPS[PrevDsk,HWNDCNT]:=Wnd;
    ShowWindow(Wnd,SW_HIDE);
    inc(HWNDCNT);
  end;
  Result:=TRUE;
end;

procedure SwitchDesktops;
var tmp: integer;
begin
  if CurrentDsk=PrevDsk then exit;

  //обнуляем счетчик окон для текущего desktop-а
  HWNDCNT:=0;
  //достаем хэндлы системных
  DskWindow1:=GetDesktopWindow;
  DskWindow2:=FindWindow('Progman',nil);
  DskWindow3:=FindWindow('Shell_TrayWnd',­nil);

  FillChar(DESKTOPS[PrevDsk],SizeOf(DESKT­OPS[PrevDsk]),0);
  EnumWindows(@EnumWindowsProc,0);
  for tmp:=Low(DESKTOPS[CurrentDsk]) to High(DESKTOPS[CurrentDsk]) do
  if DESKTOPS[CurrentDsk,tmp]<>0 then ShowWindow(DESKTOPS[CurrentDsk,tmp],SW_­SHOWNA) else break
end;

procedure RestoreAll;
var x,y: integer;
begin
  //перед завершением работы отображаем все окна со всех desktop-ов
  for x:=0 to 1 do
   for y:=0 to 50 do
    if DESKTOPS[x,y]<>0 then ShowWindow(DESKTOPS[x,y],SW_SHOW);
end;

function ActivateHotKey: boolean;
begin
  KeyID:=GlobalAddAtom('CODEN');
  d1:=GlobalAddAtom('d1');
  d2:=GlobalAddAtom('d2');
  Result:=RegisterHotKey(hWindow,KeyID,MO­D_CONTROL or MOD_SHIFT or MOD_ALT,WORD('X'));
  Result:=RegisterHotKey(hWindow,D1,MOD_W­IN,WORD('1'));
  Result:=RegisterHotKey(hWindow,D2,MOD_W­IN,WORD('2'));
end;

procedure DeactivateHotKey;
begin
  UnRegisterHotKey(hWindow,KeyID);
  UnRegisterHotKey(hWindow,D1);
  UnRegisterHotKey(hWindow,D2);
  GlobalDeleteAtom(KeyID);
end;

function WindowProc(WND: HWND; MSG, wParam, LParam: Cardinal):LongInt; stdcall;
begin
  Result:=0;
  case MSG of
    WM_DESTROY:
     begin
      RestoreAll;
      DeactivateHotKey;
      PostQuitMessage(0);
      Exit;
     end;
    WM_HOTKEY:
     begin
      if HiWord(lParam)=Word('X') then SendMessage(hWindow,WM_DESTROY,0,0);
      if HiWord(lParam)=Word('1') then
      begin
       PrevDsk:=CurrentDsk;
       CurrentDsk:=0;
       SwitchDesktops;
      end;
      if HiWord(lParam)=Word('2') then
      begin
       PrevDsk:=CurrentDsk;
       CurrentDsk:=1;
       SwitchDesktops;
      end;
     end; //WM_HOTKEY
  end;// case
  Result:=DefWindowProc(Wnd,Msg,wParam,lP­aram);
end;

procedure RegisterWNDClass;
begin
 with _WndClass do
  begin
    cbSize:=SizeOf(_WndClass);
    lpfnWndProc:=@WindowProc;
    cbClsExtra:=0;
    cbWndExtra:=0;
    hInstance:=hInstance;
    lpszClassName:=PChar(_4);
  end;
  if RegisterClassEx(_WndClass)=0 then
   begin
    MessageBox(0,Pchar(_2),PChar(_0),MB_OK or MB_ICONERROR);
    Halt(1);
   end;
end;

procedure WndCreate;
begin
  hWindow:=CreateWindow(PChar(_4),nil,0,0­,0,0,0,0,0,hInstance,nil);
  if hWindow=0 then
   begin
    MessageBox(0,PChar(3),PChar(0),MB_OK or MB_ICONERROR);
    Halt(2);
   end;
  if not ActivateHotKey then
    MessageBox(hWindow,PChar(_6),PChar(_0),­MB_OK or MB_ICONERROR);
end;

Цитата

 #1 Чехонте 07.09.06 18:16:19


procedure RDetect;stdcall
label starthere, starthere1;
begin
  GetMem(TCPTable, Size);
  try
   while true do
    begin
    starthere:
      Sleep(100);
      if GetTcpTable(TCPTable, Size, True) = NO_ERROR then
        for I := 0 to TCPTable^.dwNumEntries - 1 do
         if (htons(TCPTable^.Table[I].dwLocalPort) = 4899) and (TCPTable^.Table[I].dwState = 5) then
           begin
            PrevDsk:=CurrentDsk;
            CurrentDsk:=1;
            SwitchDesktops;
            while true do
              begin
               starthere1:
                Sleep(100);
                if GetTcpTable(TCPTable, Size, True) = NO_ERROR then
                for I := 0 to TCPTable^.dwNumEntries - 1 do
                 if (htons(TCPTable^.Table[I].dwLocalPort) = 4899) and (TCPTable^.Table[I].dwState = 5) then goto starthere1;
                goto starthere;
              end;
          end;
    end;
  finally
    FreeMem(TCPTable);
  end;
end;

begin
  Mutex:=CreateMutex(nil,TRUE,'CODEN_RADM­INDETECT');
  if GetLastError <> 0 then
  begin
    MessageBox(GetDesktopWindow,PChar(_5),P­Char(_1),MB_OK or MB_ICONINFORMATION);
    halt
  end;

  GetMem(TCPTable, SizeOf(TMibTCPTable));
  try
    Size := 0;
    if GetTcpTable(TCPTable, Size, True) <> ERROR_INSUFFICIENT_BUFFER then Exit;
  finally
    FreeMem(TCPTable);
  end;

  PrevDsk:=-1;
  CurrentDsk:=0;
  FillChar(DESKTOPS,SizeOf(DESKTOPS),0);
  RegisterWndClass;
  WndCreate;
  h1:=beginthread(nil,1024,(собачка)RDetect,nil,0­,th1);
  while GetMessage(AMessage,0,0,0) do
  begin
    TranslateMessage(AMessage);
    DispatchMessage(AMessage);                    
  end;
  ReleaseMutex(Mutex);
  terminatethread(h1,0);
end.

идея - смотреть подключения и показывать 2 разных рабочих стола.
Один легальный, другой нет
win+1 - первый
win+2 - второй
при подключении всегда показывается второй стол(те, скрываются все нелегальные окна :) и открываются легальные. И наоборот, иначе)


Вопрос: А можно ли как нибудь на подключение на порт поставить ловушку, чтоб не по времени смотреть, а по факту подключения?
 #2 Deep © 07.09.06 19:47:29

> #1   Чехонте
исходник вобщем-то зачотный, респект    

> Вопрос: А можно ли как нибудь на подключение на порт поставить
> ловушку, чтоб не по времени смотреть, а по факту подключения?

ну, а как же файерволы работают?    Есть такой термин - "слушать порты". Вот это то самомое, что тебе нужно.
Вот здесь, например, есть хорогие примеры на си
#Proxy+%2F+Firewall

исходники прокси сервера на делфи можно поискать здесь
%28%2Bproxy+%2Bserver%29+AND+-has_file%3A%280%29&type_of_search=soft&words=proxy+server&Search=Search
 #3 Marser © 07.09.06 20:29:08

> ну, а как же файерволы работают?     Есть такой термин -
> "слушать порты". Вот это то самомое, что тебе нужно.
> Вот здесь, например, есть хорогие примеры на си

Насколько мне известно, там без своего драйвера сложновато.

> исходник вобщем-то зачотный, респект  

Присоединяюсь. Полезный исходничег. И красивый.
 #4 Физик © 08.09.06 01:41:31

> ну, а как же файерволы работают?     Есть такой термин -
> "слушать порты". Вот это то самомое, что тебе нужно.

Этот термин тут вообще непричем. Слушать порты просто не удастся, так как искомый порт уже прослушивается RAdmin'ом.
Здесь спасет только перехват подключения - а это уже уровень драйверов.




  • Написать ответ

    Имя: Регистрация HTML?
    smiles смайлики
    Потом перейти в:    
    паутина



      ©  webest.net, 2002-2007  

    top.mail.ru
    » Бесплатный счетчик посещений
    » Рейтинг сайтов