XP哪些进程不能注入DLL挂钩子?

sojia 2008-08-19 04:06:15
很奇怪,我的一个全局钩子自己运行完全没有问题,
我和同学用完全相同的XP盘状的两个虚拟机,
我的机器上运行完全没有问题,他的注入后说什么services.exe出错,
郁闷,我现在都怀疑是不是挂钩和硬件有关了。

以前他的是注入winlogon后蓝屏,我的没有问题,所以后来我就不注winlogon了

请教高手,这是什么原因引起的

或者挂钩有哪些要注意的??
...全文
196 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvshaoqing 2008-08-19
  • 打赏
  • 举报
回复
我刚才试了下,卡吧和瑞心的进程,哈哈完全不行....
sojia 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cnzdgs 的回复:]
SendMessage可能存在两种问题:
1、SendMessage向其它线程的窗口发消息时,要等待窗口处理完该消息后才返回,有些时候程序是不能等待的,所以可能会引发问题;
2、每个进程都有自己独立的地址空间,进程间不能利用指针来传递数据,否则很容易产生异常。

根据你的问题描述来看,应该是Hook的代码本身出了问题,你把代码贴出来看看。
[/Quote]

除了SendMessage,有其他不使用指针传递消息的方法吗?

我现在只会用也只知道SendMessage这一个?
sojia 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cnzdgs 的回复:]
SendMessage可能存在两种问题:
1、SendMessage向其它线程的窗口发消息时,要等待窗口处理完该消息后才返回,有些时候程序是不能等待的,所以可能会引发问题;
2、每个进程都有自己独立的地址空间,进程间不能利用指针来传递数据,否则很容易产生异常。

根据你的问题描述来看,应该是Hook的代码本身出了问题,你把代码贴出来看看。
[/Quote]

首先感谢!
注入DLL我用的是Windows 程序设计(王艳平)编写的类:class CRemThreadInjector。开始时枚举所有进程,远程注入,

HOOKAPI用得Jeffrey的CAPIHook类 ,都没有做修改。
HOOKAPI很多贴一两个吧:

extern CAPIHook g_WriteFile;

CAPIHook g_WriteFile("kernel32.dll", "WriteFile", (PROC)Hook_WriteFile);

HANDLE WINAPI Hook_WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped)
{
typedef HANDLE (WINAPI *PFNTERMINATEPROCESS)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);

// 取得主模块的文件名称
char szPathName[MAX_PATH];

::GetModuleFileName(NULL, szPathName, MAX_PATH);

/////////////////////////////////////////////////////////
NTSTATUS status = -1;
HMODULE hNtdll = NULL;
IO_STATUS_BLOCK IoStatus = {0};
wchar_t FileInfo[MAX_PATH+2];
LPSTR p;
char szFilePath[MAX_PATH];

RtlZeroMemory(szFilePath, MAX_PATH);
hNtdll = LoadLibrary(_T("ntdll.dll"));
if(hNtdll!=NULL)
{
NtQueryInformationFile = (NTQUERYINFORMATIONFILE)GetProcAddress(hNtdll, "NtQueryInformationFile");

if(NtQueryInformationFile!=NULL)
{
if (hFile != INVALID_HANDLE_VALUE)
{
RtlZeroMemory((void*)&FileInfo, MAX_PATH);
status = NtQueryInformationFile(hFile, &IoStatus, (PVOID)FileInfo, MAX_PATH+2, FileNameInformation);
if (NT_SUCCESS(status))
{
wchar_t* temp=&FileInfo[0];
temp=temp+2;
char* AnsiPath=UnicodeToAnsi((LPCTSTR)temp);
GetFullPathNameA(AnsiPath, MAX_PATH, szFilePath, &p);
}
}
}
}


FreeLibrary(hNtdll);
////////////////////////////////////////////////////////////////
// 构建发送给主窗口的字符串
char sz[2048];
wsprintf(sz, "%d\r\n%s\r\nWriteFile\r\n%s\r\n", ::GetCurrentProcessId(), szPathName, szFilePath);

// 发送这个字符串到主对话框
COPYDATASTRUCT cds = { ::GetCurrentProcessId(), strlen(sz) + 1, sz };
::SendMessageTimeout(::FindWindow(NULL, "HookComu"), WM_COPYDATA, 0, (LPARAM)&cds, SMTO_ABORTIFHUNG, 10, NULL);

return ((PFNTERMINATEPROCESS)(PROC)g_WriteFile)(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);

}

此外还HOOK了很多注册表的操作,大约HOOk了28个API
cnzdgs 2008-08-19
  • 打赏
  • 举报
回复
SendMessage可能存在两种问题:
1、SendMessage向其它线程的窗口发消息时,要等待窗口处理完该消息后才返回,有些时候程序是不能等待的,所以可能会引发问题;
2、每个进程都有自己独立的地址空间,进程间不能利用指针来传递数据,否则很容易产生异常。

根据你的问题描述来看,应该是Hook的代码本身出了问题,你把代码贴出来看看。
sojia 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lvshaoqing 的回复:]
全局钩子有什么好的啊...最底层的东西又钩不到...而且全局钩子很容易出事情.
[/Quote]

那你有什么更好的方法吗?
sojia 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
与你的代码有关,你试试什么都不做应该就没问题了。
[/Quote]


不知道全局钩子对操作有什么限制,
比如说不能发送进程间的消息等等?
我就是钩到我要的API 后用sendmessage返回主模块一个消息,
而且在我的机器上运行完全没有问题
lvshaoqing 2008-08-19
  • 打赏
  • 举报
回复
全局钩子有什么好的啊...最底层的东西又钩不到...而且全局钩子很容易出事情.
cnzdgs 2008-08-19
  • 打赏
  • 举报
回复
与你的代码有关,你试试什么都不做应该就没问题了。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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