• 1198阅读
  • 1回复

为什么进程、线程一些重要信息可以通过FS寄存器简单的取到? [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-04



这两天稍微学习了一下寄存器相关知识,很多人说为什么进程、线程一些重要信息可以通过FS寄存器简单的取到?


[cpp] view plain copy
  1. kd> u PsLookupProcessByProcessId  
  2. nt!PsLookupProcessByProcessId:  
  3. 805ca38a 8bff            mov     edi,edi  
  4. 805ca38c 55              push    ebp  
  5. 805ca38d 8bec            mov     ebp,esp  
  6. 805ca38f 53              push    ebx  
  7. 805ca390 56              push    esi  
  8. 805ca391 64a124010000    mov     eax,dword ptr fs:[00000124h]  
  9. 805ca397 ff7508          push    dword ptr [ebp+8]  
  10. 805ca39a 8bf0            mov     esi,eax  
  11. kd> u PsGetCurrentProcess  
  12. nt!IoGetCurrentProcess:  
  13. 804ef608 64a124010000    mov     eax,dword ptr fs:[00000124h]  
  14. 804ef60e 8b4044          mov     eax,dword ptr [eax+44h]  
  15. 804ef611 c3              ret  
  16. 804ef612 cc              int     3  
  17. 804ef613 cc              int     3  
  18. 804ef614 cc              int     3  
  19. 804ef615 cc              int     3  
  20. 804ef616 cc              int     3  
  21. kd> u PsGetCurrentThread  
  22. nt!PsGetCurrentThread:  
  23. 8052890c 64a124010000    mov     eax,dword ptr fs:[00000124h]  
  24. 80528912 c3              ret  
  25. 80528913 cc              int     3  
  26. 80528914 cc              int     3  
  27. 80528915 cc              int     3  
  28. 80528916 cc              int     3  
  29. 80528917 cc              int     3  
  30. nt!PsGetCurrentThreadStackBase:  
  31. 80528918 64a124010000    mov     eax,dword ptr fs:[00000124h]  

可以看到 都有个 fs:[00000124h],我们先 r 一下看看fs的值:



[cpp] view plain copy
  1. kd> r  
  2. eax=00000001 ebx=ffdff980 ecx=8054bd4c edx=000002f8 esi=00000000 edi=1d399334  
  3. eip=80528bdc esp=8054abd0 ebp=8054abe0 iopl=0         nv up ei pl nz na po nc  
  4. cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000202  
  5. nt!RtlpBreakWithStatusInstruction:  
  6. 80528bdc cc              int     3  

可见在内核态中 fs=0x30,我们.formats 0x40看一下:



[cpp] view plain copy
  1. kd> .formats 0x30  
  2. Evaluate expression:  
  3.   Hex:     00000030  
  4.   Decimal: 48  
  5.   Octal:   00000000060  
  6.   Binary:  00000000 00000000 00000000 00110000  
  7.   Chars:   ...0  
  8.   Time:    Thu Jan 01 08:00:48 1970  
  9.   Float:   low 6.72623e-044 high 0  
  10.   Double:  2.37152e-322  

然后查一下intel手册,对比一下:



可以看到: RPL:0  TI:0  INDEX:6
也就是序号为6,如下:


[cpp] view plain copy
  1. kd> r gdtr  
  2. gdtr=8003f000  
取全局描述符gdtr = 8003f000,



[cpp] view plain copy
  1. kd> dq 8003f000  
  2. 8003f000  00000000`00000000 00cf9b00`0000ffff  
  3. 8003f010  00cf9300`0000ffff 00cffb00`0000ffff  
  4. 8003f020  00cff300`0000ffff 80008b04`200020ab  
  5. 8003f030  ffc093df`f0000001 0040f300`00000fff  
  6. 8003f040  0000f200`0400ffff 00000000`00000000  
  7. 8003f050  80008954`af000068 80008954`af680068  
  8. 8003f060  00009302`2f40ffff 0000920b`80003fff  
  9. 8003f070  ff0092ff`700003ff 80009a40`0000ffff  

选取第六个:ffc093df`f0000001,分别.formats一下



[cpp] view plain copy
  1. kd> .formats ffc093df  
  2. Evaluate expression:  
  3.   Hex:     ffc093df  
  4.   Decimal: -4156449  
  5.   Octal:   37760111737  
  6.   Binary:  11111111 11000000 10010011 11011111  
  7.   Chars:   ....  
  8.   Time:    ***** Invalid  
  9.   Float:   low -1.#QNAN high -1.#QNAN  
  10.   Double:  -1.#QNAN  
  11. kd> .formats f0000001  
  12. Evaluate expression:  
  13.   Hex:     f0000001  
  14.   Decimal: -268435455  
  15.   Octal:   36000000001  
  16.   Binary:  11110000 00000000 00000000 00000001  
  17.   Chars:   ....  
  18.   Time:    ***** Invalid  
  19.   Float:   low -1.58456e+029 high -1.#QNAN  
  20.   Double:  -1.#QNAN  

接下来继续查看intel手册:



根据手册将:
  Binary:  11111111 11000000 10010011 11011111

  Binary:  11110000 00000000 00000000 00000001

拼接 起来:
Base Address:11111111 11011111 11110000 00000000
转化为16进制:FFDFF000
看到这里是不是特别熟悉了!没错就是KPCR结构,接下来就应该明白为什么可以通过FS寄存器简单取到进程、线程的信息了吧!
以上是单核win xp 系统的分析。xp的FFDFF000地址是固定不变的。
善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线v2680267313

只看该作者 沙发  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个