首页
社区
课程
招聘
[求助]无法存取 kthread 结构的 trapframe
发表于: 2014-7-9 17:36 6940

[求助]无法存取 kthread 结构的 trapframe

2014-7-9 17:36
6940
请问大家!  
kthread里头的trapframe是无法存取的吗?
我只要一读取 立刻蓝屏 错误代号 0x50 ...

不知道各位有没有碰过这个问题?
而且更奇怪的是 我可以用windbg查看trapframe.eip  我的驱动却无法存取

kthread这样重要的对象 应当是在非分页的内存吧?

查看trapframe.eip 的地址的页表项  正常 (attach之后)
尝试过提升irql为 1 和2  依然蓝屏  好头痛...

附上我的代码:



void DriverUnload(PDRIVER_OBJECT pDriverObj);


NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{

char SuspendCount;
ULONG CrossThreadFlags;
char* pekthread;
int* pCurrentEPROCESS,pEPROCESS,pEPROCESSOfServices;
char services[]="services.exe";
NTSTATUS status;
ULONG i,c,b;



theDriverObject->DriverUnload=DriverUnload;

_asm
{
_emit 0xcc
}


//=====================取得 service.exe 的 EPROCESS================================================
pCurrentEPROCESS = (int*)PsGetCurrentProcess();
pEPROCESS = pCurrentEPROCESS;



do
{
DbgPrint("PID:%d ImageName:%s ", *((int*)(pEPROCESS+EPROCESS_PID_OFFSET)), pEPROCESS+EPROCESS_IMAGENAME_OFFSET );

if( strcmp(pEPROCESS+EPROCESS_IMAGENAME_OFFSET,services)==0 )
{
DbgPrint("found service.exe's pEPROCESS=%X\n",pEPROCESS);

pEPROCESSOfServices=pEPROCESS;
break;

}

pEPROCESS= *((int*)(pEPROCESS+EPROCESS_FLINK_OFFSET))-EPROCESS_FLINK_OFFSET;
DbgPrint("next pEPROCESS=%X\n",pEPROCESS);

}while(pCurrentEPROCESS!=pEPROCESS);

//遍历trapframe.eip====================================

pekthread=((*((ULONG*)(pEPROCESSOfServices+0x190)))-0x22c);

do
{


SuspendCount = *(char*)(((ULONG)pekthread) + 0x1b9);
CrossThreadFlags = *(ULONG*)(((ULONG)pekthread) + 0x248);

if( !SuspendCount && !(CrossThreadFlags & 0x13) )
{


if( *((char*)(pekthread+0x02d))!=4 && *((char*)(pekthread+0x02d))!=0 )
{


DbgPrint("original EIP:%X", *((ULONG*)(*((ULONG*)(pekthread+0x134))+0x68)) ); //蓝屏,代码0x50  存取trapframe.eip时发生

}
}
pekthread= (*((ULONG*)(pekthread+0x22c)))-0x22c;


}while( ((*((ULONG*)(pEPROCESSOfServices+0x190)))-0x22c)!=pekthread );


return status;
}

void DriverUnload(PDRIVER_OBJECT pDriverObj)
{


}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我找到一篇帖子跟我的问题完全一样  但里头没有很明显的解决方法  看不甚懂....6楼似乎是关键!

请看:
http://bbs.pediy.com/showthread.php?t=176452&highlight=trapframe
2014-7-9 18:37
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
刚刚再去检查一下我访问出错的那个地址   的页目录项 和页表项
页目录项一切正常   页表项有问题..  第0位(p位) 被置为0
但奇怪的是  此虚拟地址其实还在物理内存中  并没有被页换出  因为我能在windbg中查看

不过 就算被页换出 当我访问此地址时 因为我的中断级别够低  系统也应当帮我将此地址页换入了吧?
或许就是因为此页根本没被页换出 但p位因为某错误的操作而置为0   
而等到我访问时 系统认为此页已经被换出  就试图在硬碟中寻找  却找不到 因此蓝屏?

唉 难不成只能手动置p位为1了吗?

ring0 战战兢兢啊!
2014-7-9 22:23
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
现在我得寻找 为何此页表项的p位被置为0
我想必然是因为某个windows里头我所不懂的机制

我相信不只我碰到这个问题
望大家助我一臂之力!
2014-7-9 22:28
0
雪    币: 1157
活跃值: (847)
能力值: ( LV8,RANK:150 )
在线值:
发帖
回帖
粉丝
5
你可以看下 wrk 里面 GetThreadContext的实现,用 apc 来解决,在apc routine 里面去操作 frame
2014-7-11 09:50
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你说的是GetContextThread吧
其实我也看过他的源码了...哈哈但是看不是很懂

而且调用GetContextThread  也没有成功返回正确的context

目前打算在读写trapframe之前 检查p位  将它置为1

之后再研究问题原因..
2014-7-11 14:18
0
雪    币: 310
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
帮你顶一下,咱也想知道答案,只是现在才疏学浅,还不知道答案
2014-7-12 18:19
0
雪    币: 1157
活跃值: (847)
能力值: ( LV8,RANK:150 )
在线值:
发帖
回帖
粉丝
8
反正我这么搞的是搞好了当时,你再试试吧
2014-7-14 15:32
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢你 我再试试看!
目前我的解决方法是在读取前检查对应的pte的p位, 还算ok
2014-7-14 17:19
0
雪    币: 53
活跃值: (734)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
2014-7-15 16:38
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼上你最后怎么解决的呀?

2014-7-15 17:17
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
12
我是能读这个KTHREAD.TrapFrame.RIP。但是win7  64位 hook 这个rip,执行MessageBox函数会崩溃。不是到是不是线程的上下文不对的原因照成的。
2014-7-29 21:25
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
你的shellcode有恢复寄存器的功能吗?

不然messagebox之后 崩溃也理所当然
2014-7-29 21:55
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
14
当然有恢复,但是是在MessageBox中崩溃的,并不是因为寄存器,栈被破坏导致的,我怀疑是线程上下文的原因。就像 KTHREAD.Alertable=1的线程被hook,程序也会崩溃,即使是插入apc也是一样的结构。这是我在win7 32位发现的。xp就没问题,不管线程是什么情况。
2014-7-29 22:42
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
恭喜你得到解答啊!
搞不懂对齐为何会对运行造成影响

不过看来你的问题跟我的问题相关性不大..
2014-7-29 23:23
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
16
我是没遇到这种情况。你试下把当前线程附加到到目标进程。
2014-7-30 00:07
0
游客
登录 | 注册 方可回帖
返回
//