SetWindowsHookEx参数问题 ( 积分: 100 )

  • 主题发起人 主题发起人 rikhong
  • 开始时间 开始时间
R

rikhong

Unregistered / Unconfirmed
GUEST, unregistred user!
SetWindowsHookEx的第四个参数dwThreadId 到底是什么?
比如我要HOOK Flashget ,只单独HOOK它,不要填0。
我用钩子钩这两个函数:WSASend和WSARecv的时候 dwThreadId 填了0也就是全局钩子,程序一运行Flashget 就退出了,我怀疑是dwThreadId 这个参数的问题。单独HOOK它dwThreadId 要填什么?
 
单独HOOK Flashget dwThreadId 是创建Flashget的主线程的ID,记住是Id 不是句柄
 
请问如何得到创建Flashget的主线程的ID?
 
帮你顶上去
 
FlashgetID:= GetWindowThreadID(Flashget的句柄,nil)
 
取得FlashGet的线程 用在那个参数上就可以了
 
GetWindowThreadID 要用那个单元,编译时显示未定义
 
不好意思 弄错了FlashgetID:= GetWindowThreadProcessID(Flashget的句柄,nil)
 
我用过了,但用了这个后钩不到任何数据
 
GetWindowThreadProcessID的问题已经解决,谢谢,但我的程序问题并不是完全出在这里,
dwThreadId 添入线程ID后 ,目标程序出错的概率明显降低,但没完全解决,希望有高手能给我指点一下挂钩WSASend和WSARecv遇到的这个问题出现原因!
 
问题查出来了,原因是我储存截获的数据方式,我用写INI文件来储存lpBuffers里lan的数据,请问我该用什么方式来储存这个数据?
ini:=TIniFile.Create('c:/datalog.ini');
ini.WriteString('data',DateTimeToStr(now)+' S ',pchar(lpBuffers.len));
我注释掉这两句就没再出错过!
 
问题出在这里:在钩到WSARecv函数时我把其中的数据处理并保存,方式如下:
len:=lpBuffers.len;
temp:=strpas(lpBuffers.buf);//lpBuffers是WSARecv的第二个参数
if temp='' then
exit;
for i:=1 to len do
begin
x:=tmp;
rtmp:=rtmp+' '+bytetohex(byte(x));
end;
在执行for 循环时导致目标程序出错。我发现lpBuffers.len很长,4万多,而挂钩WSASend就没事,而且WSASend的lpBuffers.len长度只有不到 100。大虾门指点一下,分不够我会加上
 
大虾们请高抬贵手帮帮我,
 
估计是你在 Hook 里处理的程序太多了,超时跑不过来。你试试光转发代码,其它什么都不干。还有没有问题
 
我上边的代码已经贴出来,在FOR里出错,的确是有可能,因为这个FOR里要跑4万多次,我纳闷为什么一个包有这么长
 
为什么要用for?你截到的就是直接指针,直接用写到内存影象里去,由另外程序接管操作就是了。
 
我用共享内存的方法也一样出错:(网络上抄的一段代码)
定义:
type
PShareMem = ^TShareMem;
TShareMem = record
Data: array[0..500] of pchar;
end;

创建部分
HMapping := CreateFileMapping(
$FFFFFFFF,
nil,
PAGE_READWRITE,
0,
SizeOf(TShareMem),
{这个文件映射对象的名字用于与其他进程共享该对象,}
pchar('Map Name')
);
if (hMapping = 0) then
begin
//ShowMessage('不能创建内存映射文件');
// Application.Terminate;
exit;
end;
{将文件数据映射到进程的地址空间}
{当创建了一个文件映射对象之后,仍然必须让系统为文件的数据保留
一个地址空间区域,并将文件的数据作为映射到该区域的物理存储器进行提交。
}
PShare := PShareMem(MapViewOfFile(HMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0));
if PShare = nil then
begin
CloseHandle(HMapping);
// ShowMessage('Can''t View Memory Map');
// Application.Terminate;
exit;
end;
执行部分:
CopyMemory(@(PShare^.data[0]), lpBuffers.buf, lpBuffers.len);
发送函数在这一句没问题,但接收函数一定出错,请指教!!!
 
我觉得应该是lpBuffers.buf长度的问题
CopyMemory(@(PShare^.data[0]), lpBuffers.buf, lpBuffers.len-40000);
lpBuffers.len-40000后就没出错,
 
多人接受答案了。
 
后退
顶部