C# Hook相关

hvaexlove 2016-11-18 01:34:45
做C#两年了 但是刚接触Hook
在网上找C#Hook相关资料很少所以就发帖来问一下
先说一下我对Hook的理解
我认为Hook一个函数就相当于 用我自己写的函数替换呢个我Hook的函数 不知道我的理解对不对
现在在学习的过程中遇到一个问题
功能是用C#来Hook User32.dll里面的MessageBoxW函数 (全局Hook)
现在只能实现 在这一个项目里Hook住MessageBox函数 其他程序在调MessageBox就不起作用了
我想问C#可以Hook全局MessageBoxW函数吗
以及怎么全局Hook MessageBox
看过全局Hook键盘和鼠标的
但是全局MessageBox总是失败
...全文
268 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 u010565261 的回复:
[quote=引用 2 楼 dongxinxi 的回复:] 可以是可以,但是那个钩子函数所在的dll得用C/C++来写,因为被挂钩的函数或dll是会直接被所有用到MessageBox的程序加载的,试想,那些程序都会有CLR吗?肯定不可能的 《Windows核心编程》上刚好就有MessageBox挂钩的例子,去搜PDF和源代码吧
谢回复 你的意思是用C或C++封装好一个钩子 然后用C#直接调用是吗[/quote] 建议你去下载上面那本书的PDF,去看DLL注入和钩子那两章(当然先要了解进程与线程的基本概念),就明白怎么做了,而且网上有随书源代码,那个直接就可以用的,而且刚好就是MessageBox
hvaexlove 2016-11-18
  • 打赏
  • 举报
回复
引用 2 楼 dongxinxi 的回复:
可以是可以,但是那个钩子函数所在的dll得用C/C++来写,因为被挂钩的函数或dll是会直接被所有用到MessageBox的程序加载的,试想,那些程序都会有CLR吗?肯定不可能的 《Windows核心编程》上刚好就有MessageBox挂钩的例子,去搜PDF和源代码吧
谢回复 你的意思是用C或C++封装好一个钩子 然后用C#直接调用是吗
hvaexlove 2016-11-18
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
很久之前写过一个。没什么太大映像了。 我记得我使用的就是 SetWindowsHookEx这个钩子中的明星函数。 HOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId); 其中,第一个参数是钩子的类型;第二个参数是钩子函数的地址;第三个参数是包含钩子函数的模块句柄;第四个参数指定监视的线程。如果指定确定的线程,即为线程专用钩子;如果指定为空,即为全局钩子。其中,全局钩子函数必须包含在DLL(动态链接库)中,而线程专用钩子还可以包含在可执行文件中。得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它。钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。的确如果函数是全局性的,那么它必须放在一个DLL(动态链接库)中,但是我发现在window 2000以上的版本中,不用写 DLL(动态链接库)就可以作出全局性的键盘函数。用它可以做很多事情。 附上我以前看过的帖子(应该是这篇了),希望对你有帮助 http://blog.csdn.net/u014434080/article/details/51513197
先谢过层主 这个文章我早上看到了 我试了一下 这个可以做到全局钩子 但是我把他
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
这个委托换成MessageboxW的委托注册钩子 触发钩子是就报空指针了
bigbaldy 2016-11-18
  • 打赏
  • 举报
回复
1.应用层实现。全局hook在应用层就是通过注入所有进程实现,例如注入explore进程,由于其他桌面进程都是通过这个进程启动的,在CreateProcessInternal函数后必然会调用NtResumeThread函数,这样hook NtResumeThread函数,在其中加入注入子进程代码,实现递归注入 2.内核实现。内核中UI相关函数都在SSDT Shadow表中,需要写个驱动实现
  • 打赏
  • 举报
回复
其实如果你用了360的进程监视(钩子),你用ProcExplorer会发现所有的桌面应用都加载了360开头的几个dll
  • 打赏
  • 举报
回复
可以是可以,但是那个钩子函数所在的dll得用C/C++来写,因为被挂钩的函数或dll是会直接被所有用到MessageBox的程序加载的,试想,那些程序都会有CLR吗?肯定不可能的 《Windows核心编程》上刚好就有MessageBox挂钩的例子,去搜PDF和源代码吧
正怒月神 2016-11-18
  • 打赏
  • 举报
回复
很久之前写过一个。没什么太大映像了。 我记得我使用的就是 SetWindowsHookEx这个钩子中的明星函数。 HOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId); 其中,第一个参数是钩子的类型;第二个参数是钩子函数的地址;第三个参数是包含钩子函数的模块句柄;第四个参数指定监视的线程。如果指定确定的线程,即为线程专用钩子;如果指定为空,即为全局钩子。其中,全局钩子函数必须包含在DLL(动态链接库)中,而线程专用钩子还可以包含在可执行文件中。得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它。钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。的确如果函数是全局性的,那么它必须放在一个DLL(动态链接库)中,但是我发现在window 2000以上的版本中,不用写 DLL(动态链接库)就可以作出全局性的键盘函数。用它可以做很多事情。 附上我以前看过的帖子(应该是这篇了),希望对你有帮助 http://blog.csdn.net/u014434080/article/details/51513197

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧