为什么进程、线程一些重要信息可以通过FS寄存器简单的取到?
2014-07-14 22:29
706 查看
这两天稍微学习了一下寄存器相关知识,很多人说为什么进程、线程一些重要信息可以通过FS寄存器简单的取到?
可以看到 都有个 fs:[00000124h],我们先 r 一下看看fs的值:
可见在内核态中 fs=0x30,我们.formats 0x40看一下:
然后查一下intel手册,对比一下:
可以看到: RPL:0 TI:0 INDEX:6
也就是序号为6,如下:
选取第六个:ffc093df`f0000001,分别.formats一下
接下来继续查看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地址是固定不变的。
kd> u PsLookupProcessByProcessId nt!PsLookupProcessByProcessId: 805ca38a 8bff mov edi,edi 805ca38c 55 push ebp 805ca38d 8bec mov ebp,esp 805ca38f 53 push ebx 805ca390 56 push esi 805ca391 64a124010000 mov eax,dword ptr fs:[00000124h] 805ca397 ff7508 push dword ptr [ebp+8] 805ca39a 8bf0 mov esi,eax kd> u PsGetCurrentProcess nt!IoGetCurrentProcess: 804ef608 64a124010000 mov eax,dword ptr fs:[00000124h] 804ef60e 8b4044 mov eax,dword ptr [eax+44h] 804ef611 c3 ret 804ef612 cc int 3 804ef613 cc int 3 804ef614 cc int 3 804ef615 cc int 3 804ef616 cc int 3 kd> u PsGetCurrentThread nt!PsGetCurrentThread: 8052890c 64a124010000 mov eax,dword ptr fs:[00000124h] 80528912 c3 ret 80528913 cc int 3 80528914 cc int 3 80528915 cc int 3 80528916 cc int 3 80528917 cc int 3 nt!PsGetCurrentThreadStackBase: 80528918 64a124010000 mov eax,dword ptr fs:[00000124h]
可以看到 都有个 fs:[00000124h],我们先 r 一下看看fs的值:
kd> r eax=00000001 ebx=ffdff980 ecx=8054bd4c edx=000002f8 esi=00000000 edi=1d399334 eip=80528bdc esp=8054abd0 ebp=8054abe0 iopl=0 nv up ei pl nz na po nc cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202 nt!RtlpBreakWithStatusInstruction: 80528bdc cc int 3
可见在内核态中 fs=0x30,我们.formats 0x40看一下:
kd> .formats 0x30 Evaluate expression: Hex: 00000030 Decimal: 48 Octal: 00000000060 Binary: 00000000 00000000 00000000 00110000 Chars: ...0 Time: Thu Jan 01 08:00:48 1970 Float: low 6.72623e-044 high 0 Double: 2.37152e-322
然后查一下intel手册,对比一下:
可以看到: RPL:0 TI:0 INDEX:6
也就是序号为6,如下:
kd> r gdtr gdtr=8003f000取全局描述符gdtr = 8003f000,
kd> dq 8003f000 8003f000 00000000`00000000 00cf9b00`0000ffff 8003f010 00cf9300`0000ffff 00cffb00`0000ffff 8003f020 00cff300`0000ffff 80008b04`200020ab 8003f030 ffc093df`f0000001 0040f300`00000fff 8003f040 0000f200`0400ffff 00000000`00000000 8003f050 80008954`af000068 80008954`af680068 8003f060 00009302`2f40ffff 0000920b`80003fff 8003f070 ff0092ff`700003ff 80009a40`0000ffff
选取第六个:ffc093df`f0000001,分别.formats一下
kd> .formats ffc093df Evaluate expression: Hex: ffc093df Decimal: -4156449 Octal: 37760111737 Binary: 11111111 11000000 10010011 11011111 Chars: .... Time: ***** Invalid Float: low -1.#QNAN high -1.#QNAN Double: -1.#QNAN kd> .formats f0000001 Evaluate expression: Hex: f0000001 Decimal: -268435455 Octal: 36000000001 Binary: 11110000 00000000 00000000 00000001 Chars: .... Time: ***** Invalid Float: low -1.58456e+029 high -1.#QNAN 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地址是固定不变的。
相关文章推荐
- 正在进行调试的Web服务器进程已由Internet信息服务(IIS)终止。可以通过在IIS中配置应用程序池Ping设置来避免这一问题。有关更多详细信息,请参见“帮助”
- execlp启动android进程命令窗口通过adb shell 进入android 的Linux命令界面,输入am -help看到如下信息: 我们可以通过命令启动android中的
- 正在进行调试的Web服务器进程已由Internet信息服务(IIS)终止。可以通过在IIS中配置应用程序池Ping设置来避免这一问题。有关更多详细信息,请参见“帮助”
- 进程与线程的一些简单理解
- 正在进行调试的Web服务器进程已由Internet信息服务(IIS)终止。可以通过在IIS中配置应用程序池Ping设置来避免这一问题。有关更多详细信息,请参见“帮助”
- 蜜罐技术——通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析
- iOS学习重要知识点整理02-进程和线程的一个简单解释
- 发布一个web service,可以通过ISBN获得图书的一些基本信息!
- 输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程
- 正在进行调试的Web服务器进程已由Internet信息服务(IIS)终止。可以通过在IIS中配置应用程序池Ping设置来避免这一问题。有关更多详细信息,请参见“帮助”
- 正在进行调试的 Web 服务器进程已由 Internet 信息服务器(IIS)终止。可以通过在 IIS 中配置应用程序池 Ping 设置为避免这一问题
- 正在进行调试的Web服务器进程已由Internet信息服务(IIS)终止。可以通过在IIS中配置应用程序池Ping设置来避免这一问题。有关更多详细信息,请参见“帮助”
- 通过进程ID查看进程信息,调出进程线程集合,查看进程模块,并对其进行操作!
- 通过远程线程向其他进程注入代码
- SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息
- 创建线程后为什么关闭了线程句柄,线程还是可以运行?
- C# 获取一些简单的本机信息
- 通过ManagementClass 获得显卡的一些基本信息(Win32_VideoController )
- [转]线程,进程和程序的简单比较
- 为什么TheBeerHouse的网站可以VS2005下正常编译通过?