编写钩子的文章!大多数都是用VC++编写的(可能以前已经有高手们用汇编写过!只是我没有看到而已!呵呵!请不要见怪)现在我来简单介
绍怎样用WIN32ASM来编写超简单钩子!(本人是第一次写这些东东的!难免有一些不对的地方!请高手们指正指正。)
我使用的工具:Masm32v8(安装到C:/Masm32v8)+记事本
第一步,执行文件源程序的建立。打开记事本,输入以下的源程序,保存为hook.asm,先不要编译!
=========================================
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
include hookdll.inc
includelib hookdll.lib
.data
ClassName db 'MyClass',0
Caption db '我的第一个窗口',0
.data?
hInstance dd ?
hWnd dd ?
.code
GoGo:
call WinMain
invoke ExitProcess,NULL
WinMain proc
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,offset WndPro
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
mov eax,hInstance
mov wc.hInstance,eax
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,offset ClassName
invoke RegisterClassEx,addr wc
invoke CreateWindowEx,/
NULL,addr ClassName,/
addr Caption,/
WS_OVERLAPPEDWINDOW,/
CW_USEDEFAULT,/
CW_USEDEFAULT,/
CW_USEDEFAULT,/
CW_USEDEFAULT,/
NULL,/
NULL,/
hInstance,/
NULL
mov hWnd,eax
invoke ShowWindow,hWnd,SW_SHOW
invoke UpdateWindow,hWnd
.while TRUE
invoke GetMessage,addr msg,NULL,0,0
.break .if (!eax)
invoke TranslateMessage, addr msg
invoke DispatchMessage, addr msg
.endw
mov eax,msg.wParam
ret
WinMain endp
WndPro proc hwnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
.if uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.elseif uMsg==WM_CREATE
invoke installhook
.else
invoke DefWindowProc,hwnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndPro endp
end GoGo
=========================================
第二步,建立一个批处理文件(用记事本建立就可以了,文件名:make.bat)这个批处理文件的功能是用来编译执行文件的,内容如下:
=========================================
set include=c:/Masm32v8/Include
set lib=c:/Masm32v8/lib
set path=c:/Masm32v8/Bin
ml -c -coff hook.asm
link /subsystem:windows hook.obj
=========================================
第三步,建立DLL源程序(文件名:hookdll.asm),同样打开记事本输入源程序:
=========================================
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
msgTitle db "提示",0
msgText db "win32asm钩子实例",0
.data?
hInstdll dd ? ;dll 句柄
hHook dd ? ;钩子句柄
.code
DllMain proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD
.if reason==DLL_PROCESS_ATTACH
push hInst
pop hInstdll
.elseif reason==DLL_PROCESS_DETACH
call uninstallhook
.endif
mov eax,TRUE
ret
DllMain endp
showme proc nCode:DWORD,wParam:DWORD,lParam:DWORD ;简单的钩子函数
invoke CallNextHookEx,hHook,nCode,wParam,lParam
.if wParam==79h
invoke MessageBox,NULL,addr msgText,addr msgTitle,MB_OK
.endif
ret
showme endp
installhook proc ;安装hook的子程序
invoke SetWindowsHookEx,WH_KEYBOARD,addr showme,hInstdll,NULL
mov hHook,eax
ret
installhook endp
uninstallhook proc ;清除hook的子程序
invoke UnhookWindowsHookEx,hHook
ret
uninstallhook endp
end DllMain
=========================================
第四步,建立扩展名为.DEF的文件hookdll.def,这文件是用来说明DLL中哪些函数可以给应用程序调用,它连跟DLL目标文件一齐链接,也可以
用记事本编写:
=========================================
LIBRARY hookdll
EXPORTS installhook
EXPORTS uninstallhook
=========================================
呵呵!就这么几行!上面的LIBRARY关键字就是DLL的名!EXPORTS就是说明哪些函可以给应用程序调用
第五步,建立扩展名为.inc的文件hookdll.inc,这个文件用于说明DLL中函数的参数跟类型,我因为太懒了~!大多数这些文件我都是用记事本
写的!编译执行文件的时候需要它哦!~~~.inc文件的内容如下:
=========================================
installhook proto
uninstallhook proto
=========================================
第六步,呵呵!是不是有点累?好了好了!剩下最后要建立的一个文件!其实建立这些文件只是为了方便而已(费话少说)~!建立用于编译
和链接DLL的批处理文件(文件名:makedll.bat),内容如下:
=========================================
set include=c:/Masm32v8/Include
set lib=c:/Masm32v8/lib
set path=c:/Masm32v8/Bin
ml -c -coff hookdll.asm
link /dll /subsystem:windows /def:hookdll.def hookdll.obj
=========================================
好了!所需要的文件建立好了!把刚才建立的文件都放在同一目录中!先运行用于编译DLL的批处理文件,如果无出错既话!在目录会产生四个
文件:hookdll.obj,hookdll.exp,hookdll.lib,hookdll.dll!如果没有产生这些文件!就说明出错了~555555!hookdll.dll已经产生出来的话
就运行用于编译执行文件的批处理!成功的话就会产生出hook.exe了!运行hook.exe!按F10!有信息框(内容为:win32asm钩子)弹出的话!
恭喜你!你用win32asm编写的超简单钩子出炉了~!爽