Ring0Prolog

来源:互联网 发布:国家支柱产业知乎 编辑:程序博客网 时间:2024/05/12 09:58

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

 STIendm

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 POPADendmEPROCESS的开头部分就是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 Stateuser Administrator: Query Data, Query State详见:http://www.xfocus.net/articles/200208/430.html

原创粉丝点击