首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • XP哪些进程不能注入DLL挂钩子? [已结帖,结帖人:sojia]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sojia
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-19 16:06:15 楼主
    很奇怪,我的一个全局钩子自己运行完全没有问题,
    我和同学用完全相同的XP盘状的两个虚拟机,
    我的机器上运行完全没有问题,他的注入后说什么services.exe出错,
    郁闷,我现在都怀疑是不是挂钩和硬件有关了。

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

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

    或者挂钩有哪些要注意的??
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

      2

      15

    发表于:2008-08-19 16:09:181楼 得分:10
    与你的代码有关,你试试什么都不做应该就没问题了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lvshaoqing
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:11:492楼 得分:10
    全局钩子有什么好的啊...最底层的东西又钩不到...而且全局钩子很容易出事情.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sojia
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:24:063楼 得分:0
    引用 1 楼 cnzdgs 的回复:
    与你的代码有关,你试试什么都不做应该就没问题了。



    不知道全局钩子对操作有什么限制,
    比如说不能发送进程间的消息等等?
    我就是钩到我要的API 后用sendmessage返回主模块一个消息,
    而且在我的机器上运行完全没有问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sojia
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:28:154楼 得分:0
    引用 2 楼 lvshaoqing 的回复:
    全局钩子有什么好的啊...最底层的东西又钩不到...而且全局钩子很容易出事情.


    那你有什么更好的方法吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

      2

      15

    发表于:2008-08-19 16:37:405楼 得分:20
    SendMessage可能存在两种问题:
    1、SendMessage向其它线程的窗口发消息时,要等待窗口处理完该消息后才返回,有些时候程序是不能等待的,所以可能会引发问题;
    2、每个进程都有自己独立的地址空间,进程间不能利用指针来传递数据,否则很容易产生异常。

    根据你的问题描述来看,应该是Hook的代码本身出了问题,你把代码贴出来看看。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sojia
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:45:506楼 得分:0
    引用 5 楼 cnzdgs 的回复:
    SendMessage可能存在两种问题:
    1、SendMessage向其它线程的窗口发消息时,要等待窗口处理完该消息后才返回,有些时候程序是不能等待的,所以可能会引发问题;
    2、每个进程都有自己独立的地址空间,进程间不能利用指针来传递数据,否则很容易产生异常。

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


    首先感谢!
    注入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
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sojia
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:59:547楼 得分:0
    引用 5 楼 cnzdgs 的回复:
    SendMessage可能存在两种问题:
    1、SendMessage向其它线程的窗口发消息时,要等待窗口处理完该消息后才返回,有些时候程序是不能等待的,所以可能会引发问题;
    2、每个进程都有自己独立的地址空间,进程间不能利用指针来传递数据,否则很容易产生异常。

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


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

    我现在只会用也只知道SendMessage这一个?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lvshaoqing
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 17:32:148楼 得分:10
    我刚才试了下,卡吧和瑞心的进程,哈哈完全不行....
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved