首页
社区
课程
招聘
[求助]若要将钩子安装于某一进程上,应该怎么办?
发表于: 2008-3-26 17:22 6285

[求助]若要将钩子安装于某一进程上,应该怎么办?

2008-3-26 17:22
6285
我现在只要监视某一进程,用钩子应该怎么挂???

谢了

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
在钩子模块的DLL_PROCESS_ATTACH中判断是否目标进程,否则返回FALSE不加载。
不过当其他应用程序中产生这个钩子所对应的消息时会不断地尝试加载这个DLL。
2008-3-27 02:58
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
SetWindowsHookEx的最后一个参数设为某个进程的线程ID就行了。
2008-3-27 08:14
0
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
恩,谢谢!

方法都不错

不过,如何根据某个进程的句柄或ID得到线程的ID呢?
2008-3-27 10:17
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
invoke GetWindowThreadProcessId,hWndowHandle,0
invoke SetWindowsHookEx,WH_***,offset lp***Proc,hDllInstance,eax
2008-3-27 10:25
0
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
谢谢了
我现在有了一个新的问题

我用消息钩子的方法把某一DLL加载到所有的进程空间中,然后再判断该进程是否是目标进程,如果是目标进程,我要Hook掉它的一些API
那我Hook的过程应该在哪儿做????
在回调函数中吗?如果这样的话,每来一次消息它都要重做一次……
能不能设个全局(用不用共享??)变量,只在它第一次接收到消息的时候才对API进行Hook?

或者,有没有其他的办法???

谢谢了!
2008-3-27 11:12
0
雪    币: 424
活跃值: (1829)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
HOOK函数就是DLL里单独的普通函数就行了,不需要放入SetWindowsHookEx的回调函数中,DLL_PROCESS_ATTACH时修改你要HOOK的API跳到你的HOOK函数就行了。仅仅为了HOOK API的话,一般SetWindowsHookEx的回调函数不需要做什么操作,只需要调用CallNextHookEx就行了,修改API在DLL_PROCESS_ATTACH时做
2008-3-27 12:22
0
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
写在DLL_PROCESS_ATTACH里面可以吗?
我原来写的DLL在DLL_PROCESS_ATTACH里面做了好多的东西,然后将我的DLL的名字写到AppInit_Dlls里面,但是好像每次DLL_PROCESS_ATTACH里面的代码都不执行,但DLL_PROCESS_DETACH里面的可以正常执行

后来我在一本书上看,说是这时候有好多函数不能用,就如::MessageBox函数都是不可用的。

后来我又改用了远程线程的方法将DLL注入到某一进程中,但是好像DLL根本没有被注入到目标进程中。

所以我现在就想用消息钩子将DLL注入到所有的进程中,然后再判断是否是目标进程,然后再用Hook掉特定的函数。

恩,先谢谢大家了,我再试一下!
2008-3-27 13:16
0
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
对了,还有一个问题

我定义了一个结构体
struct myS{
   byte a;
   dword b;
   byte c;
   byte d;
}

我编译的时候要保证编译器不给我优化!
不要把成员给我乱换位置,应该在编译器里面加什么(我用VC6编译的)

我看/Od是防止编译器优化的,不知道这些结构体防不防???
2008-3-27 13:56
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
10
#pragma pack(1)
struct mys_t
{
  unsigned char a;
  unsigned long b;
  unsigned char c;
  unsigned char d;
};
#pragma pack()
2008-3-27 14:47
0
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
恩,谢谢

不过又有了一个新问题
当我另写一个程序,来加载这个DLL的时候,一加载就出错
我调试了一下,发现:
1.  GetCurrentProcess()函数取得的当前进程的伪句柄每次都是-1
2.  GetCurrentProcessID()函数取得的进程ID每次都是1

这是不是有问题???

在DLL中不能这样用吗???
2008-3-27 15:58
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
本进程环境操作时,使用伪句柄是可以的,但跨进程使用必须使用真实的
2008-3-27 16:22
0
游客
登录 | 注册 方可回帖
返回
//