前腐后继 发表于 2006-12-13 11:20:00

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

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