Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2012, 22:25   #1
winhttp
Пользователь
 
Регистрация: 29.07.2012
Сообщений: 98
По умолчанию И снова хуки

если я устанавливаю глобальную ловушку, то я передаю функцию, которая должна быть выполнена из длл. но вот встал вопрос : а как в самой программе отследить, что ловушка сработала. ну имею я форму например. зациклить функцию и ждать результата, пока не вернет нужное из длл? так ведь вроде не очень . вот пример накатал:
lib:
Код:
library hook;


uses
  SysUtils,
  Classes;

{$R *.res}

function hook(......): int; stdcall;
begin
{ cдесь выполнение фунции если сработал хук. но мне нужно отследить всё на 
форме , а не сдесь, или послать какие то значения на форму, чтобы код начал
 работать далее }
end;

exports hook;
end.
form
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
  procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
 function hook(.........) stdcall; external 'hook.dll';

implementation

{$R *.dfm}
procedure FormCreate(Sender: TObject);
begin
setwindowshookex(......,hook,...........){установка хука}
{а вот тут вот и надо отследить, сработал ли хук, или нет.
как осуществить? подскажите, как выйти из этой ситуации?}
end;

end.

Последний раз редактировалось winhttp; 22.08.2012 в 22:44.
winhttp вне форума Ответить с цитированием
Старый 22.08.2012, 22:40   #2
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Из приведенного кода мало, что понятно...
А в целом, из dll можно отправить сообщение в нужное окно (например через PostMessage()) и соответственно это окно пусть его обработает...
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 22.08.2012, 22:43   #3
winhttp
Пользователь
 
Регистрация: 29.07.2012
Сообщений: 98
По умолчанию

Цитата:
Сообщение от spamer Посмотреть сообщение
Из приведенного кода мало, что понятно...
А в целом, из dll можно отправить сообщение в нужное окно (например через PostMessage()) и соответственно это окно пусть его обработает...
понял вашу логику. А если свернутое окно будет, и программа будет в трее?ничего?
а если бы программа была консольная например?
еще есть варианты?

Последний раз редактировалось winhttp; 22.08.2012 в 22:50.
winhttp вне форума Ответить с цитированием
Старый 22.08.2012, 23:03   #4
winhttp
Пользователь
 
Регистрация: 29.07.2012
Сообщений: 98
По умолчанию

если из кода мало что понятно.то вот :
имею на форме эдит. мне нужно его заполнить, когда ловушка сработает. чтобы не предлагали быстрые клавиши... - форма свёрнута.
winhttp вне форума Ответить с цитированием
Старый 22.08.2012, 23:32   #5
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Цитата:
Сообщение от winhttp Посмотреть сообщение
понял вашу логику. А если свернутое окно будет, и программа будет в трее?ничего?
а если бы программа была консольная например?
еще есть варианты?
Код:
cbId := GetDlgCtrlId(cbHandle);
SendMessage(cbHandle, CB_SETCURSEL, 2, 0);
SendMessage(MainWndHandle, WM_COMMAND, MakeWParam(cbId, CBN_SELCHANGE), cbHandle);
Цитата:
По поводу ComboBox. Чтобы выполнялись действия, которые происходят при смене элемента, нужно уведомить об этом изменении само родительское окно, в котором расположен ComboBox.
cbId — идентификатор ComboBox'а. Нужен для отправки сообщения WM_COMMAND родительскому окну.
cbHandle — дескриптор окна ComboBox'а.
MainWndHandle — дескриптор родительского окна, в котором находится ComboBox.
Уведомления вполне достаточно, когда выполняю манипуляции целевое окно свернуто, так как мне надо переключится на свою прогу чтобы отослать это все, когда переключаюсь назад уже все разослано по адресатам.
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.

Последний раз редактировалось HellMercenariess; 22.08.2012 в 23:39.
HellMercenariess вне форума Ответить с цитированием
Старый 22.08.2012, 23:51   #6
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Цитата:
Сообщение от winhttp Посмотреть сообщение
если из кода мало что понятно.то вот :
имею на форме эдит. мне нужно его заполнить, когда ловушка сработает. чтобы не предлагали быстрые клавиши... - форма свёрнута.
Без ShareMem можно передавать по одному символу текста или номера клавиш, если надо передавать строки то
http://programmersforum.ru/showthrea...2%F0%EE%EA+dll


Ниже передает ПО ОДНОМУ СИМВОЛУ В Мемо:
Код:
library Prog_hook_dll;

uses
   Windows, Messages, SysUtils;

type
 PHookRec = ^THookRec;
 THookRec = record
   AppHnd: Integer;
   MemoHnd: Integer;
 end;

var
 Hooked: Boolean;
 hKeyHook, hMemo, hMemFile, hApp: HWND;
 PHookRec1: PHookRec;

function KeyHookFunc(Code, VirtualKey, KeyStroke: Integer): LRESULT; stdcall;
var
 KeyState1: TKeyBoardState;
 AryChar: array[0..1] of Char;
 Count: Integer;
begin
 Result:=0;
 if Code=HC_NOREMOVE
 then Exit;
 Result:=CallNextHookEx(hKeyHook, Code, VirtualKey, KeyStroke);
 if Code<0
 then Exit;
 if Code=HC_ACTION
 then
  begin
   if ((KeyStroke and (1 shl 30))<>0)
   then
    if not IsWindow(hMemo)
    then
     begin
      // I moved the OpenFileMapping up here so it would not be opened
      // unless the app the DLL is attatched to gets some Key messages
      hMemFile:=OpenFileMapping(FILE_MAP_WRITE, False, 'Global7v9k');
      PHookRec1:=MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0);
      if PHookRec1<>nil
      then
       begin
        hMemo:=PHookRec1.MemoHnd;
        hApp:=PHookRec1.AppHnd;
       end;
      end;
    if ((KeyStroke and (1 shl 30))<>0)
    then
     begin
      GetKeyboardState(KeyState1);
      Count:=ToAscii(VirtualKey, KeyStroke, KeyState1, AryChar, 0);
      if Count=1
      then
       begin
        SendMessage(hMemo, WM_CHAR, Ord(AryChar[0]), 0);
        // I included 2 ways to get the Charaters, a Memo Hnadle and
        // a WM_USER+1678 message to the program
        PostMessage(hApp, WM_USER + 1678, Ord(AryChar[0]), 0);
       end;
     end;
  end;
end;

function StartHook(MemoHandle, AppHandle: HWND): Byte; export;
begin
 Result:=0;
 if Hooked
 then
  begin
   Result:=1;
   Exit;
  end;
 if not IsWindow(MemoHandle)
 then
  begin
   Result:=4;
   Exit;
  end;
 hKeyHook:=SetWindowsHookEx(WH_KEYBOARD, KeyHookFunc, hInstance, 0);
 if hKeyHook>0
 then
  begin
   // you need to use a mapped file because this DLL attatches to every app
   // that gets windows messages when it's hooked, and you can't get info except
   // through a Globally avaiable Mapped file
   hMemFile:=CreateFileMapping($FFFFFFFF, // $FFFFFFFF gets a page memory file
     nil,              // no security attributes
     PAGE_READWRITE,   // read/write access
     0,                // size: high 32-bits
     SizeOf(THookRec), // size: low 32-bits
     'Global7v9k');    // name of map object
   PHookRec1:=MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0);
   hMemo:=MemoHandle;
   PHookRec1.MemoHnd:=MemoHandle;
   hApp:=AppHandle;
   PHookRec1.AppHnd:=AppHandle;
   // set the Memo and App handles to the mapped file
   Hooked:=true;
  end
 else Result:=2;
end;

function StopHook: Boolean; export;
begin
 if PHookRec1<>nil
 then
  begin
   UnmapViewOfFile(PHookRec1);
   CloseHandle(hMemFile);
   PHookRec1:=nil;
  end;
 if Hooked
 then Result:=UnhookWindowsHookEx(hKeyHook)
 else Result:=true;
 Hooked:=false;
end;

procedure EntryProc(dwReason: DWORD);
begin
 if (dwReason=Dll_Process_Detach)
 then
  begin
   if PHookRec1<>nil
   then
    begin
     UnmapViewOfFile(PHookRec1);
     CloseHandle(hMemFile);
    end;
   UnhookWindowsHookEx(hKeyHook);
  end;
end;

exports StartHook, StopHook;

begin
 PHookRec1:=nil;
 Hooked:=False;
 hKeyHook:=0;
 hMemo:=0;
 DLLProc:=@EntryProc;
 EntryProc(Dll_Process_Attach);
end.
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума Ответить с цитированием
Старый 24.08.2012, 00:00   #7
winhttp
Пользователь
 
Регистрация: 29.07.2012
Сообщений: 98
По умолчанию

Спасибо за ответ. а как быть , если допустим обьект невидимый? как ему передать значение?
winhttp вне форума Ответить с цитированием
Старый 24.08.2012, 23:19   #8
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

А вы вирусами не занимаетесь-?Я вод пишу один, взял исходник пробую доработать,там механизмы сравнения сигнатур PE - файлов, заголовка, -4-х проверочных бит и метки MZ,ошибка видио при получении адресса kernel32 по адресу 000000h в системе методом SEH-вызова цепочки обработчиков исключений, последний обработчик исключений, рспологается по адресу 000000h, адрес kernel32 в системе. Для доступа к функциям используется сложения адреса VBA со значением в в таблице image bases, то есть VA=VBA+база, что я делаю не так

Последний раз редактировалось djonatan98; 24.08.2012 в 23:31.
djonatan98 вне форума Ответить с цитированием
Старый 25.08.2012, 11:35   #9
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

лезете в чужую тему
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хуки в Windows Corbide Общие вопросы Delphi 0 05.07.2012 23:12
Хуки в C# kostaNew C# (си шарп) 1 19.08.2011 23:30
хуки Dimarik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 27 09.08.2011 09:50
И снова хуки... Как узнать нажата ли CTRL? TwiX Общие вопросы Delphi 1 20.05.2010 23:29
MDIChild снова и снова... Siber_Dec Общие вопросы Delphi 2 13.12.2009 03:24