首页
社区
课程
招聘
[求助][求助]关于定时器链表指针gptmrFirst
发表于: 2011-2-14 20:14 5828

[求助][求助]关于定时器链表指针gptmrFirst

2011-2-14 20:14
5828
我想写一个遍历此链表的驱动
问题是这个指针gptmrFirst 所指向的内存 有时候是
“无法检索信息, Win32 error 0n30: 系统无法从指定的设备上读取。”
我无法判断什么时候此内存可读
我本以为win32k.sys没加载
可是用(!PspW32ProcessCallout)和(ShadowSSPT == 0)判断都是已经加载的
想问下
1.为啥会出现这种情况?
2.怎么在程序里去判断?

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 232
活跃值: (105)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
自己找到原因了..
1.是因为这些内存不可读
因为加载驱动的时候
当前进程环境是System
而调用TimersProc的时候(这些内存可读)是csrss.exe
也可以说2者的CR3不同
我尝试着直接修改CR3
成功一次、蓝了十次

目前还没想到一个比较好的方法去读取。。
2011-2-15 00:04
0
雪    币: 232
活跃值: (105)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
我想了一个方法
开启一个定时器,然后在里面判断当前进程的上下环境
代码如下

//显示定时器
void ShowtTimer()
{
        int* SSSDT;
        int* SSSDTP;
        int gptmrFirst;
        int number;
        PTIMER ptmr;                                //第一个指向的链表
        SSSDT= 0x8055ab50;                        //ShadowSSDT地址
        SSSDTP = 0x8055ab58;
        gptmrFirst = 0xbf9a8914;        //定时器链表头
        __try
        {
                ProbeForRead(gptmrFirst,4,4);
                if((*SSSDTP) != 0)
                {
                        //证明ShadowSSDT已经被加载、
                        ptmr = (PTIMER)gptmrFirst;
                        number = 1;
                        while (ptmr != NULL)
                        {
                                        DbgPrint("第%d个定时器",number++);
                                        DbgPrint("定时器间隔:%dms",ptmr->cmsRate);
                                        DbgPrint("定时器执行函数体%x",ptmr->pfn);
                                        DbgPrint("HWND:%x",*(ptmr->pti));
                                        DbgPrint(".........................");
                                        ptmr = ptmr->ptmrNext;
                        }
                       
                }
                else
                {
                        DbgPrint("win32k未加载");
                }
        }
        __except(1)
        {
                DbgPrint("内存不可读");
        }

}

VOID PollingTimerDpc( IN PKDPC pDpc,
                                          IN PVOID pContext,
                                          IN PVOID SysArg1,
                                          IN PVOID SysArg2 )
{
        PDEVICE_OBJECT pDevObj = (PDEVICE_OBJECT)pContext;
        PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
        KeSetTimer(
                &pdx->pollingTimer,
                pdx->pollingInterval,
                &pdx->pollingDPC );
        pEProcess = IoGetCurrentProcess();
       cr3 = *(int*)((ULONG)pEProcess + 0x18);       
       ProcessName = (PTSTR)((ULONG)pEProcess + 0x174);
       if(cr3 == 0x074ed000)                      //csrss.exe的 CR3 这个值每次重启会改变
      {
            DbgPrint("发现进程");
            KdPrint(("%s\n",ProcessName));
            ShowtTimer();
      }



本来用意是,因为根据某书上写的,定时器会中断在任意线程环境
后来验证了下,怎么说呢,只能算半对?
因为中断确实是随机的
但是一次都没中断在csrss.exe这个环境下
真的有点郁闷
刚在一个群里问了这个问题
还被人说**
大冷天的心情真郁闷
真心问点问题
有这么难吗?
2011-2-15 02:53
0
雪    币: 225
活跃值: (218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
关注,有没有可能在CR3环境下实现?
2011-2-28 10:37
0
游客
登录 | 注册 方可回帖
返回
//