怎么解决SetWindowsHookEx挂CallWndProc(copydata)钩子返回为0

陈义源 2020-03-19 08:57:56
想用SetWindowsHookEx监听其他程序(不知道handle)的copydata数据,但是一直挂不成功。 尝试通过查找handle挂勾,也不成功,求大神帮忙。

public class CopyDataHook {

private const int WM_COPYDATA = 0x004A;
private IntPtr nextHookPtr;
private HookProc hookProc;
private const int HookType.CallWndProc = 4;

[DllImport("User32.dll")]
public static extern void UnhookWindowsHookEx(IntPtr handle);
[DllImport("User32.dll")]
public static extern IntPtr SetWindowsHookEx(int idHook, [MarshalAs(UnmanagedType.FunctionPtr)] HookProc lpfn, IntPtr hinstance, int threadID);.
[DllImport("User32.dll")]
public static extern IntPtr CallNextHookEx(IntPtr handle, int code, IntPtr wparam, IntPtr lparam);

public CopyDataHook()
{
nextHookPtr = IntPtr.Zero;
}
public void SetCopyDataHook()
{
if (nextHookPtr != IntPtr.Zero)
return;
hookProc = new HookProc(CopyDatahookProc);
nextHookPtr = SetWindowsHookEx((int)HookType.CallWndProc,
hookProc,
Marshal.GetHINSTANCE(
Assembly.GetExecutingAssembly().GetModules()[0]),
0);
//==>返回为0
Console.Write(string.Format("HookPtr:{0}", nextHookPtr.ToString()));
}
}
...全文
299 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
清晨曦月 2020-03-21
  • 打赏
  • 举报
回复
很多啊
detours
EasyHook
可以了解一下
有空愿意深入学就了解一下HOOK原理,像IAT,EAT,INLINE的几种形式都可以玩一玩,之后可以了解一下怎么给非托管进程加载运行时。。这些东西很多介绍的。
陈义源 2020-03-21
  • 打赏
  • 举报
回复
引用 5 楼 清晨曦月 的回复:
用第三方库吧。或者自己用C#写一个托管DLL注入到对方进程。。。自己搞麻烦得很呢,想注入托管DLL到非托管进程需要写一个前置的DLL给对方加载CLR。。。。。。
第三方的库没听说过,帮忙介绍几个。
陈义源 2020-03-21
  • 打赏
  • 举报
回复
引用 7 楼 清晨曦月 的回复:
很多啊 detours EasyHook 可以了解一下 有空愿意深入学就了解一下HOOK原理,像IAT,EAT,INLINE的几种形式都可以玩一玩,之后可以了解一下怎么给非托管进程加载运行时。。这些东西很多介绍的。
有点深了... EasyHook也没找到可用的例子咯。 有没有可参考的案例学习学习?
清晨曦月 2020-03-20
  • 打赏
  • 举报
回复
用第三方库吧。或者自己用C#写一个托管DLL注入到对方进程。。。自己搞麻烦得很呢,想注入托管DLL到非托管进程需要写一个前置的DLL给对方加载CLR。。。。。。
正怒月神 2020-03-20
  • 打赏
  • 举报
回复
说到这个,我也有点纳闷。 SetWindowsHookEx(WH_KEYBOARD, KeyBoardProc, HInstance, 0); 中的0代表全局钩子, 可是当年怎么试都不成功。 现在看了楼上各位的说法,大概明白了。
陈义源 2020-03-20
  • 打赏
  • 举报
回复
我试着找到模块的句柄进行挂钩也不成功
  • 打赏
  • 举报
回复
记得是 C# 不能挂钩局部钩子吧 只能挂钩全局钩子 因为局部在线程外,需要模块句柄,托管举报是COM+格式貌似不行 也可能记错了
github_36000833 2020-03-20
  • 打赏
  • 举报
回复
除了WH_KEYBOARD_LL和WH_MOUSE_LL作为例外,C#不能单独安装全局钩子。 因为全局钩子需要把Dll模块注入到其他进程中,该Dll模块必须是具有原生导出的dll,而C#不能写非托管DLL(native Dll)。 注:WH_KEYBOARD_LL和WH_MOUSE_LL之所以是例外,因为安装Low Level鼠标或键盘钩子并没有把Dll模块注入到其他线程中,而是在钩子回调时,上下文切换(Context switch,每个线程都有其独特的上下文)到安装线程。这就是为什么C#不能写非托管DLL,却能安装Low Level键盘钩子的原因。【引用自:https://bbs.csdn.net/topics/230047420】

110,534

社区成员

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

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

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