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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2011, 14:53   #11
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Спасибо, буду дальше крутить=)
Dimarik вне форума Ответить с цитированием
Старый 29.07.2011, 21:04   #12
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
Лампочка

Я все сделал как ты написал в примере. Только у меня функция обработки хуков почему-то не вызывается. В отладчике не смог проследить как происходит вызов функции, обрабатывающей хуки из функции invoke SetWindowsHookEx,WH_CBT,eax,ebx,0
Для того чтобы было четко видно как происходит обработка, я решил вывести MessageBox, но почему-то он не был выведен.
Вложения
Тип файла: zip хуки+.zip (405.6 Кб, 9 просмотров)
Dimarik вне форума Ответить с цитированием
Старый 30.07.2011, 20:59   #13
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

вот написал более простой аналог. Задача - при появлении нового окна вывести MessageBox.
Главный файл (exe)
Код:
.686
.model flat, stdcall
option casemap :none; теперь MASM32 начнёт различать регистры
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
include \masm32\include\user32.inc
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\bin\hook_dll.lib
.data
	strDllName			BYTE			"e2.dll",0
	FunctionName_hookF  DB				"hook_",0
	hLib				DD				?;хэндл библиотеки
	FunctionName_hookF_addr  DD				?
	.code
Start:
WinMain proc  hInstance : HINSTANCE, hPrevInstance : HINSTANCE, lpcmdLine : BYTE, nCmdShow : DWORD
	
		invoke LoadLibrary, addr strDllName
		or EAX, EAX;проверка на ошибку
			jz Error_label
		mov hLib, EAX
		
		invoke GetProcAddress, hLib, offset FunctionName_hookF
		or EAX, EAX;проверка на ошибку
			jz Error_label
		mov FunctionName_hookF_addr, EAX
		
		;устанавливаем хуки
		invoke SetWindowsHookEx, WH_CBT, FunctionName_hookF_addr, hLib, 0
		or EAX, EAX;проверка на ошибку
			jz Error_label
		
Error_label:
		invoke FreeLibrary, hLib
		call ExitProcess
		ret 13
	WinMain endp
	
end Start
dll-ка
Код:
.686
.model flat, stdcall

option casemap :none; теперь MASM32 начнёт различать регистры
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\user32.inc
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib;здесь содержатся функции уравления памятью, приложениями, ресурсами, файлами и т.д.
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib

.data
hWindowHook		HHOOK		0
mess_1			  DB				"hook_",0
.code
hook_ proto : DWORD, : WPARAM, : LPARAM

DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
	mov  eax,TRUE
	ret 12
	DllEntry Endp
	
	;обработка хуков
	 hook_ proc nCode:DWORD, wParam:WPARAM, lParam:LPARAM 
	 invoke MessageBox, 0, offset mess_1, offset mess_1, 1
	 invoke CallNextHookEx, hWindowHook,nCode,wParam,lParam
		ExitProc:
	hook_ endp
end DllEntry
dll-ку Линковал так:
link /section:.bss,S /DLL /SUBSYSTEM:WINDOWS /debug /DEF:DLLSkeleton.def/LIBPATH:c:\masm32\lib DLLSkeleton.obj

Последний раз редактировалось Dimarik; 30.07.2011 в 21:04.
Dimarik вне форума Ответить с цитированием
Старый 30.07.2011, 21:00   #14
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

никаких ошибок нет, но при открытии новых окон MessageBox не вылетает
Dimarik вне форума Ответить с цитированием
Старый 31.07.2011, 18:34   #15
|{ot
Форумчанин
 
Аватар для |{ot
 
Регистрация: 09.03.2008
Сообщений: 127
Лампочка

У тебя функция hook_ некорректна. Вот:
Код:
hook_ proc nCode:DWORD, wParam:WPARAM, lParam:LPARAM 

  invoke MessageBox, 0, addr mess_1, addr mess_1, 0

  invoke CallNextHookEx, 0, nCode, wParam, lParam
ret
hook_ endp
Не советую MessageBox там конечно писать.. но один раз можно
|{ot вне форума Ответить с цитированием
Старый 31.07.2011, 20:37   #16
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
Восклицание

переделал.
у меня даже хоть и очень криво, но иногда начал работать.
Во-первых, почему-то, когда в отладчике выполняю трассировку, при нажатии только на F8, начинает виснуть на
call GetProcAddress
Однако, если же в самом начале сделаешь точку останова на
call [FunctionName_hook_set_F_addr]
и нажмёшь F9, тогда всё работает нормально. А если после этой точки останова нажмёшь F9? то появится этот MessageBox.
Однако, если зайдёшь внутри функции
call [FunctionName_hook_set_F_addr]
с помощью F7 и затем нажмёшь F9 - никакого MessageBox не выйдет и произойдёт точка останова. Принт скрин приложил во вложениях.
И ещё одна проблема. Самая непонятная: при запуске программы без отладчика, никакого MessageBox не вылезет и программа просто завершит свою работу и выйдет.
Может быть я как-то не так скопилировал всё?
я основной модуль компилировал так:
Код:
ml /c /coff /Zi e1.asm
link /subsystem:windows /debug e1.obj
dll-ку так:
Код:
ml /c /coff /Zi e2.asm
link /section:.bss,S /dll /subsystem:windows /debug /def:e2.def /libpath:c:/masm32/lib e2.obj
вот код основного файла ехе

Код:
.686
.model flat, stdcall
option casemap :none; теперь MASM32 начнёт различать регистры
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
include \masm32\include\user32.inc
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\bin\e2.lib
 
.data
        strDllName                                              BYTE                    "e2.dll",0
        FunctionName_hookF                      DB                              "hook_",0
        FunctionName_hook_set_F                 DB                              "hook_set_",0
        hLib                                                    DD                              ?;хэндл библиотеки
        FunctionName_hook_set_F_addr    DD                              ?
        
.code
Start:
WinMain proc  hInstance : HINSTANCE, hPrevInstance : HINSTANCE, lpcmdLine : BYTE, nCmdShow : DWORD
        
                invoke LoadLibrary, addr strDllName
                or EAX, EAX;проверка на ошибку
                        jz Error_label
                mov hLib, EAX
                
                invoke GetProcAddress, hLib, offset FunctionName_hook_set_F
                or EAX, EAX;проверка на ошибку
                        jz Error_label
                mov FunctionName_hook_set_F_addr, EAX;загружаем адрес вызова функции
                
                ;устанавливаем хуки
                call [FunctionName_hook_set_F_addr]
                or EAX, EAX;проверка на ошибку
                        jz Error_label
                
Error_label:
                invoke FreeLibrary, hLib
                call ExitProcess
                ret 13
        WinMain endp
        
end Start
вот код dll-ки

Код:
.686
.model flat, stdcall
 
option casemap :none; теперь MASM32 начнёт различать регистры
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\user32.inc
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib;здесь содержатся функции уравления памятью, приложениями, ресурсами, файлами и т.д.
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib
 
.data
dllHandle               DD                      ?;хэндл DLL
hWindowHook             HHOOK           0
mess_1                    DB                            "hook_",0
.code
hook_ proto : DWORD, : WPARAM, : LPARAM
 
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
        mov EAX, hInstDLL
        mov dllHandle, EAX
        mov  EAX,TRUE
        ret 12
        DllEntry Endp
        
        ;устанавливаем хуки
        hook_set_ proc
                invoke SetWindowsHookEx, WH_CBT, offset hook_, dllHandle, 0
                ret
        hook_set_ endp
        
        ;обработка хуков
         hook_ proc nCode:DWORD, wParam:WPARAM, lParam:LPARAM 
         mov hWindowHook, EAX;правильно??????????????? загружаем EAX - хэндл хука - результат выполнения предыдущей функции
         invoke MessageBox, 0, offset mess_1, offset mess_1, 1
         invoke CallNextHookEx, hWindowHook,nCode,wParam,lParam
                ExitProc:
                ret 12
        hook_ endp
end DllEntry
все файлы приложил во вложениях




короче совсем непонятно. То одна и та же программа работает, то она не работает.
Изображения
Тип файла: jpg Снимок.jpg (45.9 Кб, 128 просмотров)
Вложения
Тип файла: zip e1_e2_хуки.zip (397.1 Кб, 9 просмотров)
Dimarik вне форума Ответить с цитированием
Старый 31.07.2011, 21:54   #17
|{ot
Форумчанин
 
Аватар для |{ot
 
Регистрация: 09.03.2008
Сообщений: 127
Лампочка

Цитата:
Сообщение от Dimarik Посмотреть сообщение
Код:
hook_set_ proc
                invoke SetWindowsHookEx, WH_CBT, offset hook_, dllHandle, 0
                ret
        hook_set_ endp
Зачем все время пытаешся запихнуть код установки хука в ДЛЛ??

Это
Цитата:
Сообщение от Dimarik Посмотреть сообщение
Код:
                ;устанавливаем хуки
                call [FunctionName_hook_set_F_addr]
                or EAX, EAX;проверка на ошибку
                        jz Error_label
Замени на:

Код:
invoke SetWindowsHookEx,WH_CBT,...
Итого что то на подобии:
Код:
.686
.model flat, stdcall
option casemap :none; теперь MASM32 начнёт различать регистры НА САМОМ ДЕЛЕ ЭТО НЕ ТАК
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
include \masm32\include\user32.inc
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\bin\e2.lib
 
.data
        strDllName                                              BYTE                    "e2.dll",0
        FunctionName_hookF                      DB                              "hook_",0
        hLib                                                    DD                              ?;хэндл библиотеки
        
.code
Start:
WinMain proc  hInstance : HINSTANCE, hPrevInstance : HINSTANCE, lpcmdLine : BYTE, nCmdShow : DWORD
        
                invoke LoadLibrary, addr strDllName
                or EAX, EAX;проверка на ошибку
                        jz Error_label
                mov hLib, EAX
                
                invoke GetProcAddress, hLib, addr FunctionName_hookF
                or EAX, EAX;проверка на ошибку
                        jz Error_label
                
                ;устанавливаем хуки
                invoke SetWindowsHookEx, WH_CBT, eax, hLib, 0
                or EAX, EAX;проверка на ошибку
                        jz Error_label
                
Error_label:
                invoke FreeLibrary, hLib
                call ExitProcess
                ret 16
        WinMain endp
        
end Start




.686
.model flat, stdcall
 
option casemap :none; теперь MASM32 начнёт различать регистры
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\user32.inc
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib;здесь содержатся функции уравления памятью, приложениями, ресурсами, файлами и т.д.
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib
 
.data
mess_1                    DB                            "hook_",0

.code
hook_ proto : DWORD, : WPARAM, : LPARAM
 
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
        ;mov EAX, hInstDLL
        ;mov dllHandle, EAX ;ненужно!
        mov  EAX,TRUE
        ret 12
        DllEntry Endp
        
        ;устанавливаем хуки НЕНУЖНО!
        ;hook_set_ proc
        ;       invoke SetWindowsHookEx, WH_CBT, offset hook_, dllHandle, 0
        ;        ret
        ;hook_set_ endp
        
        ;обработка хуков
         hook_ proc nCode:DWORD, wParam:WPARAM, lParam:LPARAM 

         ;mov hWindowHook, EAX;правильно??????????????? загружаем EAX - хэндл хука - результат выполнения предыдущей функции НЕПРАВИЛЬНО
         invoke MessageBox, 0, addr mess_1, addr mess_1, 1
         invoke CallNextHookEx, 0,nCode,wParam,lParam
                ExitProc:
                ret 12
        hook_ endp
end DllEntry
|{ot вне форума Ответить с цитированием
Старый 05.08.2011, 16:33   #18
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Я всё сделал как ты сказал.
Но у меня по прежнему всё работает только при запуске из отладчика! Хотя непонятно почему, какая программе разница, откуда её запускать?
вот запускающего файла e1.asm
Код:
.686
.model flat, stdcall
option casemap :none; теперь MASM32 начнёт различать регистры
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
include \masm32\include\user32.inc
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\bin\e2.lib

.data
	strDllName						BYTE			"e2.dll",0
	FunctionName_hookF  			DB				"hook_",0
	hLib							DD				?;хэндл DLL
	FunctionName_hook_addr  		DD				?
	
.code
Start:
WinMain proc  hInstance : HINSTANCE, hPrevInstance : HINSTANCE, lpcmdLine : BYTE, nCmdShow : DWORD
	
		invoke LoadLibrary, addr strDllName
		or EAX, EAX;проверка на ошибку
			jz Error_label
		mov hLib, EAX
		
		invoke GetProcAddress, hLib, offset FunctionName_hookF
		or EAX, EAX;проверка на ошибку
			jz Error_label
		mov FunctionName_hook_addr, EAX;загружаем адрес вызова функции
		
		;устанавливаем хуки
		invoke SetWindowsHookEx, WH_CBT, FunctionName_hook_addr, hLib, 0
		or EAX, EAX;проверка на ошибку
			jz Error_label
		
Error_label:
		invoke FreeLibrary, hLib
		call ExitProcess
		ret 13
	WinMain endp
	
end Start
вот код e2.def
Код:
LIBRARY e2
EXPORTS hook_
ну а вот код e2.asm - dll-ки
Код:
.686
.model flat, stdcall

option casemap :none; теперь MASM32 начнёт различать регистры
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\user32.inc
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib;здесь содержатся функции уравления памятью, приложениями, ресурсами, файлами и т.д.
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib

.data
dllHandle		DD			?;хэндл DLL
hWindowHook		HHOOK		0
mess_1			  DB				"hook_",0
.code
hook_ proto : DWORD, : WPARAM, : LPARAM

DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
	mov EAX, hInstDLL
	mov dllHandle, EAX
	mov  EAX,TRUE
	ret 12
	DllEntry Endp

	
	;обработка хуков
	 hook_ proc nCode:DWORD, wParam:WPARAM, lParam:LPARAM 

	 invoke MessageBox, 0, offset mess_1, offset mess_1, 1
	 invoke CallNextHookEx, 0,nCode,wParam,lParam
		ExitProc:
		ret 12
	hook_ endp
end DllEntry
Dimarik вне форума Ответить с цитированием
Старый 05.08.2011, 20:02   #19
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
Восклицание

Добавил цикл обработки сообщений и всё заработало нормально.
Код:
label_cycle:
		invoke GetMessage, offset message, 0, 0, 0
		pop EAX
		invoke TranslateMessage, offset message
		invoke DispatchMessage, offset message
		push EAX
		cmp EAX, 0
			jnz label_cycle
Только интересует 2 вопроса:
1. По идее ведь был создан бесконечный цикл хуков. то есть: идёт сообщение, если нужное, обрабатываем хук, и потом CallNextHook, если ненужное - просто CallNextHook
2. Почему тогда в отладчике нормально работал?



решил программу малость изменить. Надо чтобы при появлении окошка Microsoft Word (вопрос о сохранении документа) автоматически была нажата кнопка Сохранить
В результате этого должен произойти автоматический клик по кнопке Сохранить.

Код dll-ки
Код:
.686
.model flat, stdcall
 
option casemap :none; теперь MASM32 начнёт различать регистры
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\user32.inc
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib;здесь содержатся функции уравления памятью, приложениями, ресурсами, файлами и т.д.
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib
 
.data
dllHandle               DD                      ?;хэндл DLL
hWindowHook             HHOOK           0
HWnd_new_wind   HWND            ?;хэндл обрабатываемого окна
nameOfWindow_1  DB                      "Microsoft Word",0;исходная строка
nameOfWindow_2  DB                      ?;полученная строка.code
nameOfButton    DB                      "Сохранить",0
hWindButton             DB                      ?;хэндл кнопки "Да"
strButton               DB                      "Button",0      
 
.code
hook_ proto : DWORD, : WPARAM, : LPARAM
 
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
        mov EAX, hInstDLL
        mov dllHandle, EAX
        mov  EAX,TRUE
        ret 12
        DllEntry Endp
 
        
        ;обработка хуков
 hook_ proc nCode:DWORD, wParam:WPARAM, lParam:LPARAM
 
 call GetForegroundWindow;узнаём хэндл окна
         mov HWnd_new_wind, EAX
        invoke GetWindowText, HWnd_new_wind, addr nameOfWindow_2, 15;узнаём название окна
        
        ;переходим на кнопку "Да"
                invoke FindWindow, offset strButton, offset nameOfButton
                cmp EAX,0;проверяем на ошибку
                        jz      ExitProc
                ;устанавливаем фокус
                invoke SetFocus, EAX
                invoke SendMessage, EAX, BM_CLICK, 0, 0
        
        
         invoke CallNextHookEx, 0,nCode,wParam,lParam
                ExitProc:
                ret 12
        hook_ endp
end DllEntry
Результата это никакого не дало. Запустил отладчик. Нашёл где вызывается функция из dll-ки
Вылезло такое окошко: (см. вложения)
Затем я поставил Break-Point-ы где мне надо было и не один не сработал. Как тогда можно в отладчике отладить эту dll-ку?

P.S.Из кода программы видно, что в данный момент не осуществлялась проверка на то, является ли это окно Microsoft Word или какое-либо другое. Это сделаю потом. Сейчас главное щёлкнуть по кнопке сохранить.
Изображения
Тип файла: jpg кккккккккккСнимок.JPG (31.0 Кб, 65 просмотров)
Тип файла: jpg Снимок.JPG (234.0 Кб, 134 просмотров)
Dimarik вне форума Ответить с цитированием
Старый 06.08.2011, 00:09   #20
|{ot
Форумчанин
 
Аватар для |{ot
 
Регистрация: 09.03.2008
Сообщений: 127
По умолчанию

Для начала скачай програмку WinDowse и посмотри иерархию компонентов в интересующем окне +текст в окне (кнопка с текстом "ДА" на самом деле имеет текст "&Да") +имя класса кнопки (это не обязательно "button")

Код:
!!nameOfButton    DB                      "&Да",0

hook_	proc	nCode:DWORD, wParam:WPARAM, lParam:LPARAM

;сюда ОБЯЗАТЕЛЬНО необходимо вставить фильтрацию для nCode, только то событие которое тебя интересует, иначе будет бесполезно грузится система

invoke MessageBeep,0FFFFFFFFh ;это что бы ты послушал, сколько раз вызывается эта процедура, вставишь фильтрацию nCode, вызов в разы уменьшится

	call GetForegroundWindow;
	mov HWnd_new_wind, EAX

        ;искать хэндл кнопки необходимо этой ф-цией, потому как тебе нужно найти компонент (кнопку) в текущем активном окне
	invoke FindWindowEx,eax,NULL, NULL, offset nameOfButton
 	cmp EAX,0
		jz      ExitProc
	
	;хэндл нашел, посылай сообщение этому окну (в данном случае имитация клика мышкой)
	mov ebx,eax
	invoke SendMessage, ebx,WM_LBUTTONUP,0,0
	invoke SendMessage, ebx,WM_LBUTTONDOWN,0,0
        
	ExitProc:
	invoke CallNextHookEx, 0,nCode,wParam,lParam
                
	ret 12
hook_ endp
этот код проверил, работает!! Он жмет кнопку "Да" в любом окне где найдет ее

PS: убери лишние переменные из описания и ненужный код в DllEntry
Код:
.data
..
nameOfWindow_2  DB                      ?;полученная строка.code МАЛОВАТ РАЗМЕР ДЛЯ СТРОКИ
..
hWindButton             DB                      ?;хэндл кнопки "Да" ХЭНДЛ = 4 БАЙТА В 32Х РАЗРЯДНЫХ СИСТЕМАХ

Последний раз редактировалось |{ot; 06.08.2011 в 00:17.
|{ot вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сетевые функции, хуки Igoressicus Помощь студентам 1 05.11.2010 14:03
Хуки в Windows JeyKip Win Api 11 09.05.2010 00:33
Программа, использующая хуки anGeee Win Api 1 11.12.2009 20:59
ListView и хуки 7KByte Win Api 0 10.07.2009 22:21
Глобальные хуки Zeraim Win Api 2 24.05.2008 16:00