下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

在VisualBasic中如何获得系统服务描述表入口地址

作者:课课家教育     来源: http://www.kokojia.com点击数:1221发布时间: 2016-12-24 15:00:43

标签: VisualBasic操作系统Linux

大神带你学编程,欢迎选课

  相信不少的程序员都使用过VB编程语言吧,毕竟它是世界上使用人数最多的语言。VisualBasic是一种由微软公司开发的包含协助开发环境的事件驱动编程语言,它源自于BASIC编程语言。今天我们一起来学习一下,在VisualBasic中如何获得系统服务描述表入口地址?

  小编曾经在一篇教程里面,看到过编程者是使用MS提供的DbgHelp库,然后从符号库文件中查找KeServiceDescriptorTableShadow以及KeServiceDescriptorTable的符号,用于来获得系统服务描述表入口地址。如果大家对这篇教程有兴趣的话,可以去搜索一下《自动获取NT系统服务描述表与函数名映射表》这篇教程,个人感觉还是挺不错的。其实这种方法,总的来说逻辑还是较为简单的。但是对于一些不同操作系统版本的调试符号文件就具有依赖性了,所以小编认为这是不适用于作为一种工具被散发出去的程序的。所以在这里的话,小编就给出另外一种获得系统服务描述表入口地址的方法,那就是从线程本身的特性开始着手。现在就进入教程的主题吧。

  线程的两个部分

  大家知道我们所说的线程(有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。),实际上分为哪几个部分吗?没错,是两个部分的,分别是用户态以及核心态两者。在Win32下这两两个部分基本上就是1对1的关系,如果说是在其他平台(比如说:Linux2.6以前的版本或者是Solaris),那么就需要使用不一样的映射模型了。然而在Win32系统中,核心态的线程,在事实上也可以分成GUI线程以及工作线程这两种类型。前者(即GUI线程)在线程第一次使用Win32k.sys系统服务的时候自动进行转换,或者是进行使用PsConvertToGuiThread函数(ntos\\ps\\psquery.c:3247)显式转换。然而后者(即工作线程)是建立核心线程的缺省类型。

在VisualBasic中如何获得系统服务描述表入口地址_VisualBasic_操作系统_Linux_课课家

  那么这两种类型之间究竟有什么的区别呢?其实区别主要就是在于使用的资源缺省大小不一样,此外,使用的系统服务描述表也是不一样的。这也是为什么系统服务描述表要分为KeServiceDescriptorTableShadow以及KeServiceDescriptorTable这两个部分的原因之一,前者包括了后者并没有的对GDI服务的入口函数地址。一般情况下,都是在Win32k.sys中实现的。另外一个方面,核心线程对象的ETHREAD::KTHREAD::ServiceTable字段保存了这个线程适用的系统调用服务表地址,这个字段也已经被名为PsConvertToGuiThread的函数用来判断一些线程的类型了,功能和Windows xp/2003为我们提供的IsGUIThread函数类型。

  引用部分

  在实际操作中,我们可以将一个线程创建起来,然后这个线程并不做任何实际的工作。仅仅只是根据我们要获取哪一个系统服务描述表来决定究竟是不是调用GDI函数。为了方便大家的理解,小编特意找了一个例子来演示给大家看。下面的编程代码就是为引用的部分,具体的源代码如下图:

引用部分一

  我们在需要获取地址的时候,可以先将一个此线程的实例创建起来,接着再通过这个句柄获取内核对象地址就可以了。下面的编程代码就是为引用的部分,具体的源代码如下图:

引用部分二

  小编结语:

  通过这篇编程语言教程,不知道大家是否已经学会了在VisualBasic中如何获得系统服务描述表入口地址?如果还是不太懂,可以看多几遍教程哟,毕竟实现的方法还是较为简单的。课课家教育每天更新不同的教程,一起来学习吧。

赞(22)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程