· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Hook's on FASM

Посл.отвђт Сообщен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