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