用WIN32汇编写的超简单钩子(初学者适用) 

2006-12-13 11:20 发布

2774 0 0

大家好!我是菜鸟一名(菜中之菜^_^)!说真的!本人汇编水平不高!刚学会了这些东东只想在这里与大家学习学习!在这里看到的关于怎样
编写钩子的文章!大多数都是用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编写的超简单钩子出炉了~!爽


(例子源代码:http://www.cc-365.com/lzq/asmhook.rar)

作者:懒虫
QQ:270909303
mail:lzq@cc-365.com

B Color Smilies

你可能喜欢

用WIN32汇编写的超简单钩子(初学者适用) 
联系
我们
快速回复 返回顶部 返回列表