能力值:
( LV8,RANK:120 )
|
-
-
2 楼
自己找到原因了..
1.是因为这些内存不可读
因为加载驱动的时候
当前进程环境是System
而调用TimersProc的时候(这些内存可读)是csrss.exe
也可以说2者的CR3不同
我尝试着直接修改CR3
成功一次、蓝了十次
目前还没想到一个比较好的方法去读取。。
|
能力值:
( 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这个环境下
真的有点郁闷
刚在一个群里问了这个问题
还被人说**
大冷天的心情真郁闷
真心问点问题
有这么难吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
关注,有没有可能在CR3环境下实现?
|
|
|