Ring0Prolog

1 Undocumented Windows NT中通过callgate实现的无驱动进如ring0的代码中的两个宏汇编代码   直接仿制于NT系统代码(_KiSystemService),随NT版本而变。 Ring0Prolog macro  PUSHAD  PUSHFD  PUSH FS

 ;FS:0即指向FFDFF000h这个重要结构,用户态与核心态的FS值不同,下面是例行公事而已  MOV     EBX,00000030h  MOV     FS,BX  SUB     ESP, 50h         MOV     EBP,ESP

 ;Setup the exception frame to NULL  MOV     EBX,DWORD PTR CS:[0FFDFF000h]  MOV     DWORD PTR DS:[0FFDFF000h], 0FFFFFFFFh  MOV     DWORD PTR [EBP],EBX

 ;CS:[FFDFF124h]存有大家再熟悉不过的线程核心块KTHREAD,其中偏移128h处为TrapFrame  ;Save away the existing KSS EBP  MOV     ESI, DWORD PTR CS:[0FFDFF124h]  MOV     EBX,DWORD PTR [ESI+00000128h]  MOV     DWORD PTR [EBP+4h],EBX  MOV     DWORD PTR [ESI+00000128h],EBP

 ;块偏移137h处为PreviousMode,简单说供核心函数区分是用户态还是核心态请求,直接决定了某些函数调  ;用的成功与否。137与上面的128都是nt上的偏移,2000/XP下是不同的,所以这段代码平台相关  ;Save away the kernel time and the thread mode (kernel/user)  MOV     EDI,DWORD PTR [ESI+00000137h]  MOV     DWORD PTR [EBP+8h],EDI

 ;Set the thread mode (kernel/user) based on the code selector  MOV     EBX,DWORD PTR [EBP+7Ch]  AND     EBX,01  MOV     BYTE PTR [ESI+00000137h],BL

 STI endm

Ring0Epilog macro  ;Restore the KSS EBP  MOV     ESI,DWORD PTR CS:[0FFDFF124h]  MOV     EBX,DWORD PTR [EBP+4]  MOV     DWORD PTR [ESI+00000128h],EBX

 ;Restore the exception frame  MOV     EBX,DWORD PTR [EBP]  MOV     DWORD PTR FS:[00000000],EBX

 ;Restore the thread mode  MOV     EBX,DWORD PTR [EBP+8h]  MOV     ESI,DWORD PTR FS:[00000124h]  MOV     BYTE PTR [ESI+00000137h],BL  ADD     ESP, 50h  POP     FS  POPFD  POPAD endm EPROCESS的开头部分就是KPROCESS,名字上的所区别可以表明二者的主要定义与使用者的不同:K***意为微内核使用(kernel),在调度等代码使用,所需结构简单,只要一部分;E***意为执行体使用,需要额外的部分,比如活动进程链供任务枚举。KTHREAD、ETHREAD类似。至于ETHREAD、EPROCESS的联系有结构定义很容易看到,还有TEB/PEB,ETHREAD/EPROCESS等。 2 关于nt内存管理 //PDE-PTE(和硬件页表项的格式相同),页目录的自映射问题告诉我们PDE与PTE的格式相同! ULONG LinearAddressToPhysicalAddress(ULONG lAddress) {  unsigned int *pAddr;  unsigned int *PageDirectoryEntry=(unsigned int *)0xC0300000;  unsigned int *PageTableEntry=(unsigned int *)0xC0000000;    if((!(PageDirectoryEntry[lAddress>>22]&0xFFFFF000))   &&(!(PageDirectoryEntry[lAddress>>22]&0x00000001)))   return 0;    pAddr=(unsigned int *)((int)PageTableEntry+((lAddress&0xFFFFF000)>>10));  if((*pAddr)&1)   return ((*pAddr) &0xFFFFF000) |(lAddress&0x00000FFF);  return 0; } 3 /Device/PhysicalMemory对象 /Device/PhysicalMemory对象有下面的权限: user SYSTEM: Delete, Change Permissions, Change Owner, Query Data,              Query State, Modify State user Administrator: Query Data, Query State 详见:http://www.xfocus.net/articles/200208/430.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值