|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 25, 2003 09:37:37 Люди есть у кого нибудь пример реализацыи Hook'a на Flat Assembler'e??? |
|
|
Дата: Сен 25, 2003 20:49:49 А, шо нЭ ясн0? Так же как и на других языках, ведь здесь уже не надо использовать компилерозависимые директивы (<- во замутил :)... Погодь до завтра, дам свой маленький исходничек. Там мне надо было у одной проги убрать правое меню мыщи. Запачить неполучалось, т.к. правый клик мыши обрабатывался не прогой, а com-сервером... поэтому пришлось ставить хук непосредственно в поток сервера. |
|
|
Дата: Сен 26, 2003 12:51:25
format PE GUI 4.0 DLL
entry DllEntryPoint
include '%include%\win32a.inc'
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
section '.data' data writeable readable
hHook dd 0
hInstance dd 0
hThread dd 0
hProcessID dd 0
hThreadID dd 0
lHandle dd 0
lpProcess dd 0
hStr db 'VOLOVIEW', 0 ;имя искомого процесса
hStrb db 'voloview', 0
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
section '.code' code readable executable
proc DllEntryPoint, hInst, wReason, lpReserved
enter
mov ebx, [hInst]
mov [hInstance], ebx
mov eax, TRUE
return
;-------------------------------------------------------------;
proc CallBack, code, wparam, lparam ;непосредственно процедура
enter ;хука
cmp [code], HC_ACTION
jne CallBackQuit
mov eax, [lparam]
cmp dword [eax + 4], $204
je MMM
cmp dword [eax + 4], $205
je MMM
jmp CallBackQuit
MMM:
mov dword [eax + 4], 0 ;патчится нужное событие
CallBackQuit:
invoke CallNextHookEx, [hHook],\
[code],\
[wparam],\
[lparam]
return
;-------------------------------------------------------------;
proc vveMouseHook, boolean ;экспортируемая dll-кой процедура
enter ;которая устанавливает хук
cmp [boolean], TRUE
jne KillHook
call FindVoloview ;поиск процесса voloview и
cmp [hThread], 0 ;дескриптора нужного потока в нем
je BadQuit
invoke SetWindowsHookEx, WH_GETMESSAGE,\ ;ставится ху...
CallBack,\
[hInstance],\
[hThread]
cmp eax, 0
je BadQuit
mov [hHook], eax
jmp GoodQuit
KillHook:
invoke UnhookWindowsHookEx, [hHook] ;киляется...
cmp eax, TRUE
je GoodQuit
BadQuit:
mov eax, FALSE
return
GoodQuit:
mov eax, TRUE
return
;-------------------------------------------------------------;
proc FindVoloview
enter
invoke GetProcessHeap
invoke HeapAlloc, eax,\ ;заполняется описанием процесса при
HEAP_ZERO_MEMORY,\ ;вызове Process32Next
$128
mov [lpProcess], eax
mov ebx, [lpProcess]
mov word [ebx], $128 ;первый параметр - размер структуры
invoke CreateToolhelp32Snapshot, $6, 0 ;типа "снимок" процессов
mov [lHandle], eax
invoke Process32First, [lHandle], [lpProcess]
FindProcess:
invoke Process32Next, [lHandle], [lpProcess]
cmp eax, FALSE
je ExitCikl
mov edx, [lpProcess]
add edx, $24 ;по данному смещению лежит строка с именем
call FindStroka ;exe-шника под 2k, либо с полным путем
cmp eax, TRUE ;к оному под 98.
jne FindProcess
mov edx, [lpProcess]
mov eax, [edx + 8] ;а здесь - ID процесса
mov [hProcessID], eax ;по которому выделяеш поток
mov eax, TRUE
ExitCikl:
cmp eax, FALSE
je ExitFin
mov eax, [lpProcess]
mov dword [eax], 1Ch
invoke Thread32First, [lHandle], [lpProcess]
NextThread:
invoke Thread32Next, [lHandle], [lpProcess]
cmp eax, FALSE
je ExitFin
mov ebx, [lpProcess]
mov eax, [ebx + 0Ch] ;ID процесса, которому принадлежит поток
cmp eax, [hProcessID]
jne NextThread
mov eax, [ebx + 8] ;дескриптор нужного потока
mov [hThread], eax
ExitFin:
invoke GetProcessHeap
invoke HeapFree, eax,\
0,\
[lpProcess]
invoke CloseHandle, [lHandle]
return
;---------------------поиск подстроки-------------------------;
proc FindStroka
enter
;ну здесь и ищу в переданной строке имя своего
;процесса... Ввиду стрААшной кривизны того, что здесь
;было написано и нынешней тенденции "тотальной оптимизации",
;стыжусь показывать :)))
return
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
section '.idata' import data readable writeable
library kernel, 'kernel32.dll',\
user, 'user32.dll'
import kernel,\
CreateToolhelp32Snapshot, 'CreateToolhelp32Snapshot',\
Process32First, 'Process32First',\
Process32Next, 'Process32Next',\
Thread32First, 'Thread32First',\
Thread32Next, 'Thread32Next',\
CloseHandle, 'CloseHandle',\
GetProcessHeap, 'GetProcessHeap',\
HeapAlloc,'HeapAlloc',\
HeapFree,'HeapFree'
import user,\
SetWindowsHookEx, 'SetWindowsHookExA',\
UnhookWindowsHookEx, 'UnhookWindowsHookEx',\
CallNextHookEx, 'CallNextHookEx'
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
section '.edata' export data readable writeable
export 'Mouse.dll',\
vveMouseHook, 'vveMouseHook'
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
section '.reloc' fixups data readable discardable
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; |
|
|
Дата: Сен 26, 2003 12:52:56 Тут вызов CallNextHookEx под 98 некоректен и приводит к тому, что система на все хуки стоящие после этого забивает большой болт... В эту функцию необходимо передать коректный дескриптор хука (hHook), полученный родительским процессом (использующим это dll-ку) вызовом SetWindowsHookExA. Для этого нужно расшарить область в памяти и через нее передать. Я было пытался это заделать, но отхватив несколько прикольных глюканов, подхарился и забил на это дело :) ... короче, 98 <- мастдай. В 2k и остальных этот баг исправлен и достаточно передать NULL. Уже точно не помню... У сервера был вроде один поток, который обрабатывал сообщения, поэтому выбирать среди "снимка" потоков долго не пришлось. А вот если у проги будет несколько потоков, принимающих сообщения, тогда как выбрать нужный ведь неизвестно в каком порядке они перечисляются?! (а может так не бывает... гы-гы) Вообщем, хрен его знает... |
|
|
Дата: Сен 26, 2003 19:04:26 Thanx. Да я знаю как они пишутся только вот у меня почему всё время срабатывает аварийный останов. Ща бубу в твоём исходнике разбиратся! Большое спасибо! |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.379 |