-
-
[求助]关于r0和r3通信和同步的问题
-
发表于:
2016-4-7 16:08
6846
-
比如我在ring0注册了一个PsSetxxx(LoadImage,CreateThread,CreateProcess)NotifyRoutine回调之后,一旦回调被调用,我就像某数字一样在ring3弹个MessageBox告知你某模块加载了、某线程创建了。。。
目前我的思路是用event和ring3通信
驱动层:
VOID LoadImageCallback(...)
{
LoadImageNotify_Callback *buffer = (LoadImage_Callback *)LoadImageNotify.SharedMem;//ring0申请的共享内存,在DispatchIoctl中MmMapLockedPagesSpecifyCache获取其UserMode的地址丢给ring3
buffer->ProcessId = (__int32)ProcessId;//就传一个PID
KeSetEvent(LoadImageNotify.obEvent, 0, FALSE);//LoadImageNotify.obEvent是ring3传过来并ObReferenceObjectByHandle得到的
}
应用层:
void LoadImageThread(void)
{
DWORD MyProcessId = GetCurrentProcessId();
while (!m_StopThread)
{
WaitForSingleObject(m_hLoadImageNotifyEvent, INFINITE);
DWORD dwProcessId = m_LoadImageNotify->ProcessId;
if(dwProcessId != MyProcessId)
{
MessageBox(NULL, L"load image", L"warning", MB_YESNO);
}
}
}
m_hLoadImageNotifyEvent来自ring3 CreateEvent(NULL, FALSE, FALSE, NULL);
1、目前这种方式确实能够监视到dll加载、进程创建等行为
2、如果碰到同时加载多个dll的情况下(比如CreateThread x N,里面各种LoadLibrary),是不是会出现回调同时被调用n次,导致共享内存被修改n次(因为没有加锁),导致应用层n次取到同样的数据?
3、为了防止2的情况,我是不是应该在回调开始的地方KeWaitForSingleObject某个event一下,直到上一个数据被应用层取完才允许他继续运行?
4、如果我用一个新的event实现了3的思路,那么万一应用层正好在读取数据(比如m_LoadImageNotify->ProcessId)的时候意外退出了,没有给那个新的event设置信号告知驱动我已读完数据,那驱动再下一次执行loadimage回调的时候,岂不是永远阻塞在最开头的KeWaitForSingleObject上了?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!