人气 223

[游戏程序] 用WIN32汇编写的超简单钩子(初学者适用) [复制链接]

九艺网 2017-3-10 17:01:49

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-4-25 16:11 , Processed in 0.126893 second(s), 23 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.