首页
社区
课程
招聘
驱动与r3交互的问题
发表于: 2011-8-18 15:40 5254

驱动与r3交互的问题

2011-8-18 15:40
5254
在驱动里面使用PsSetCreateProcessRoutine设置一个监视进程启动的回调函数A。
请问,如何在A中通知r3的程序,有新的进程启动呢?(将进程id和进程名传递个r3的程序)。

请说个思路,有代码更好~

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 343
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
R3程序可以定时去IoCtrl向R0查询,新手建议~
2011-8-18 15:50
0
雪    币: 2332
活跃值: (3774)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
最好是驱动主动通知应用程序~
2011-8-18 15:52
0
雪    币: 27
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
一个APC搞定
2011-8-18 16:18
0
雪    币: 2332
活跃值: (3774)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
5
求例子代码
资料看了半天,还是不清楚怎么弄。。刚开始写驱动~~
2011-8-18 16:44
0
雪    币: 364
活跃值: (1696)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
用事件.事件不管在R0或者R3都是对象.
2011-8-18 16:51
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
R3发一个异步IRP,有进程启动后由驱动完成该IRP,这样R3就会被唤醒go on~~~
2011-8-18 17:20
0
雪    币: 75
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
驱动和应用层交互,又涉及到向应用层传数据(进程ID和进程名),用IOCTL较方便,用事件进行同步,首先,应用层创建事件对象,WaitForSingleObject等待新进程创建的事件(内核在新进程创建的回调函数中激活事件,并将进程信息保存在全局变量中),应用程序发IOCTL获取内核传入的进程ID和进程名
2011-8-19 09:44
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
驱动层:
该函数设置回调函数
NTSTATUS ActivateMonitoringHanlder(BOOL bActive)
{
        NTSTATUS               ntStatus = STATUS_UNSUCCESSFUL;

        KdPrint(("Start ActivateMonitoringHanlder\n"));

        if (g_ActivateInfo.bActivated != bActive)
        {
                if (bActive)
                {
                        KdPrint(("Set PsSetCreateProcessNotifyRoutine\n"));

                        // Set up callback routines
                        ntStatus = PsSetCreateProcessNotifyRoutine(ProcessCreateOrTerminateCallback, FALSE);
                        if (ntStatus != STATUS_SUCCESS)
                        {
                                KdPrint(("Set PsSetCreateProcessNotifyRoutine Failed\n"));
                                return ntStatus;
                        }

                        // Setup the global data structure
                        g_ActivateInfo.bActivated = bActive;
                        KdPrint(("Set PsSetCreateProcessNotifyRoutine success\n"));
                }
                else
                {
                        // restore the call back routine, thus givinig chance to the
                        // user mode application to unload dynamically the driver
                        ntStatus = PsSetCreateProcessNotifyRoutine(ProcessCreateOrTerminateCallback, TRUE);
                        if (ntStatus != STATUS_SUCCESS)
                                return ntStatus;
                        else
                                g_ActivateInfo.bActivated = FALSE;
                }

                ntStatus = STATUS_SUCCESS;
        }

        return ntStatus;
}

回调函数如下:
VOID ProcessCreateOrTerminateCallback(
                                         IN HANDLE  hParentId,
                                         IN HANDLE  hProcessId,
                                         IN BOOLEAN bCreate
                                         )
{
        NTSTATUS status;
        PEPROCESS pEProc;
        CHAR *pName;   //进程名
        ANSI_STRING QQExeName;
        ANSI_STRING CurExeName;
        KIRQL oldIrql;

        if (bCreate)
        {
        // PsLookupProcessByProcessId routine accepts the process ID of a process
        // and returns a referenced pointer to EPROCESS structure of the process.
                PsLookupProcessByProcessId(hProcessId, &pEProc);

#if WINVER >= 0x0501
                pName = (CHAR*)PsGetProcessImageFileName(pEProc); //获取进程名
#else
                pName = (CHAR*)pEProc + 0x1FC;
#endif

                //DbgPrint("Process Name: %s\n", pName);
        //The ObDereferenceObject routine decrements the given object's reference count and performs retention checks.
                ObDereferenceObject(pEProc);

                RtlInitAnsiString(&QQExeName, "这里可以填你想要比较的进程名称");
                RtlInitAnsiString(&CurExeName, pName);

                if (RtlCompareString(&QQExeName, &CurExeName, TRUE) == 0)
                {
                        KdPrint(("Set Exe Event!\n"));
                        KeAcquireSpinLock(&g_QQHandleLock, &oldIrql);
                        g_hQQHandle = hProcessId;
                        KeReleaseSpinLock(&g_QQHandleLock, oldIrql);

                        if (g_QQNotifyEvent != NULL)
                        {
                                KeSetEvent(g_QQNotifyEvent, 0, FALSE);
                        }
                        else
                        {
                                KdPrint(("g_QQNotifyEvent == Null!\n"));
                        }
                }
        }
}

应用层需要事先给驱动层传递一个事件对象g_QQNotifyEvent:
应用层首先创建事件:
hQQnotifyEvent = CreateEventW(NULL, TRUE, FALSE, NULL);

然后打开驱动,把该事件传递给驱动
DeviceIoControl(hQpmonDrv,
IOCTL_SFPMON_ACTIVATE_MONITORING,// Activate/Deactivate the process
&activateInfo,
sizeof(activateInfo),
&bStart,
iStartSize,
&retSize,
NULL
)

然后等待:
HANDLE waitEvent[] = {hQQnotifyEvent};

DWORD signalRslt = ::WaitForMultipleObjectsEx(sizeof(waitEvent) / sizeof(waitEvent[0]), waitEvent, FALSE, INFINITE, FALSE);
2011-8-19 13:27
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
给出代码中的变量,你需要自己查API,自己重新定义一下。
这个例子掩饰,当某个关心的进程启动时,激活应用层。

你也可以不比较进程名,这样就达到你的目的了,所有进程启动时,都Setevent
2011-8-19 13:30
0
游客
登录 | 注册 方可回帖
返回
//