另一种获取系统服务描述表入口地址的方法

51单片机的中断源入口地址是程序存储器空间的5个单元 程序存储器低端的一些地址被固定地用作特定程序的入口地址: (1) 0000H——单片机复位后的程序入口地址。 (2) 0003H——外部中断 0 的中断服务子程序入口地址。 (3) 000BH——定时/计数器 0 的中断服务子程序入口地址。 (4) 0013H——外部中断 1 的中断服务子程序入口地址。 (5) 001BH——定时/计数器 1 的中断服务子程序入口地址。 (6) 0023H——... 阅读详情
 

在《自动获取 NT 系统服务描述表与函数名映射表》一文中我使用MS提供的DbgHelp库,从符号库文件中查找KeServiceDescriptorTable和KeServiceDescriptorTableShadow符号,以获取系统服务描述表入口地址。这种方法逻辑简单,但是对不同操作系统版本的调试符号文件有依赖性,不适用于作为工具被散发出去的程序。因此这儿给出另外一种从线程本身的特性着手获取系统服务描述表入口地址的方法。
我们所说的线程,实际上分为核心态和用户态两部分。Win32下这两者基本上是1对1的关系,其他平台如Solaris或Linux 2.6以前的版本则使用不同的映射模型。而Win32系统中核心态的线程,实际上也分为两类:工作线程和GUI线程。前者是建立核心线程的缺省类型,后者在线程第一次使用Win32k.sys系统服务时自动转换,或者使用PsConvertToGuiThread函数(ntos/ps/psquery.c:3247)显式转换。两者之间的区别主要在于使用的资源缺省大小不同,以及使用的系统服务描述表不同。这也是为什么系统服务描述表要分为KeServiceDescriptorTable和KeServiceDescriptorTableShadow的原因之一,后者包括前者没有的对GDI服务的入口函数地址,一般在Win32k.sys中实现。核心线程对象的ETHREAD::KTHREAD::ServiceTable字段保存了此线程适用的系统调用服务表地址,此字段也被PsConvertToGuiThread函数用于判断线程类型。功能与Windows XP/2003提供的IsGUIThread函数类型。
使用上我们可以创建一个线程,此线程不做任何实际工作,只是根据我们要取哪个系统服务描述表来决定是否调用GDI函数,如

以下为引用:

class TGuiThread : public TThread
{
public:
TGuiThread(void) : TThread(false)
{
FreeOnTerminate = false;
}

void __fastcall Execute(void)
{
::GetDesktopWindow();
}
};

在需要获取地址时,我们可以创建一个此线程的实例,然后通过其句柄获取内核对象地址。

以下为引用:

//---------------------------------------------------------------------------
DWORD TServiceTableApplication::GetpKeServiceDescriptorTableAddress(void) const

{
std::auto_ptr<TGuiThread> GuiThread(new TGuiThread());

GuiThread->WaitFor();

::THandleTable tblHandles;

PVOID pObj = NULL;
TSystemHandleList& handles = tblHandles.HandleByProcessID[::GetCurrentProcessId()];

for(TSystemHandleCPtr itHandle = handles.begin();
itHandle != handles.end(); itHandle++)
{
if((HANDLE)itHandle->Handle == (HANDLE)GuiThread->Handle)
{
pObj = itHandle->Object;
break;
}
}

assert(pObj);

LPVOID lpAddr;

TPhysicalMemoryManager::Default().ReadVirtualMemory((LPCVOID)((DWORD)pObj + 0x124), &lpAddr, sizeof(lpAddr));

return lpAddr;
}

然后读取ETHREAD内核对象偏移0x124(win2003为0x124,win2000sp4为0xDC,其他操作系统版本可能有区别)的ServiceTable字段,即可 :D

以下为引用:

0:001> dt nt!_KTHREAD
+0x000 Header : _DISPATCHER_HEADER
...
+0x120 Affinity : Uint4B
+0x124 ServiceTable : Ptr32 Void
+0x128 ApcStatePointer : [2] Ptr32 _KAPC_STATE
...
---
说了世上一无牵挂为何有悲喜
说了朋友相交如水为何重别离
说了少年笑看将来为何常回忆
说了青春一去无悔为何还哭泣
tombkeeper 发表于:2004-03-24 22:26

发帖: 2279
注册: 2001-01-16
/*
作为该flier程序的第一个小白鼠,我在2000上运行的时候就蹦出了非法访问的框子,
bug提交Flier后,发现是ServiceTable的偏移在各系统上不同导致的。
作为小白鼠,我有义务找个通用的办法。

ServiceTable在ETHREAD中的偏移,每个操作系统各不相同,但是在NTOSKRNL.EXE的系
统调用入口部分用到了这个偏移,所以我们可以用搜索代码的方式将这个偏移找出来。
tombkeeper#nsfocus.com
*/

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

char * get_func(char str[],char moduleName[])
{
char *ret = 0;
char *b = (char*)LoadLibrary(moduleName);
int i;
__try
{
for (i=0; i<0x100000; i++, b++)
{
if (memcmp(b, str, 12) == 0)
{
printf("ServiceTable offset: 0x%.8x/n",*(DWORD *)(b+12));
}
}
}
__except(1){}

return ret;
}

void main()
{
int i = 0;
char * funcAddr = 0;
static char moduleName[]="NTOSKRNL.EXE";
static char str[] = {
0x8B,0xF8,0xC1,0xEF,0x08,0x83,
0xE7,0x30,0x8B,0xCF,0x03,0xBE,
0xDC,0x00,0x00,0x00
};
get_func(str,moduleName);
}

通过中断类型码求中断入口地址 表的地址位于内存的0000:0000到0000:03FFH(即0段的0000到03FFH) 大小1KB,共256个入口。假设中断类型码16H,求中断程序入口地址?每个入口占用4个单元,一次为CS:IP ,低字节为段内偏移地址,高字节为段基址。下面高,上面低,高地址放高位,低地址放低位。然后去 58H,59H,60H,61H中取数据。61H 里面的内容是 44H。58H 里面的内容是 11H。59 H里面的内容是 22H。60H 里面的内容是 33H。假设它们中的数据分别是。... 阅读详情

相关推荐

用C#获取本机IP地址的方法

IP地址是互联网协议地址(Internet Protocol address)的简称,是分配给网络中每个主机(网络设备)的唯一地址标识。它是实现网络通信的关键组件,使数据包能够在复杂的网络环境中准确无误地传送到目标主机。在互联网中,IP地址用于定位设备位置,确保网络通信的顺利进行。

weixin_42405592的博客 1310

消息机制(GUI线程讲解)

你能回答这些问题吗? 什么是窗口句柄?在哪里?有什么用? 什么是消息?什么是消息队列?消息队列在哪 ? 什么是窗口过程?窗口过程是由谁调用的?没有消息循环窗口过程会执行吗? 为什么要有w32k.sys这个模块? 为什么只有使用图形界面的程序才可以访问KeServiceDescriptorTableShadow? 界面“卡死”的时候为什么鼠标还可以动? 消息队列: 消息队列在何处呢? 首先我们假设把消息队列放在用户空间(3环),那么谁又来往用户空间的消息队列存储这些东西呢? 最好的解决方案就是找一个专

寻梦&之璐 2048

易语言取系统服务列表、修改系统服务源码

本源码的功能是获取系统服务列表,还可以修改系统服务(在Win7和Vista系统下会因为权限不够而修改失败。但是95、98、2000、2003、XP下是能够修改的),比如启动、停止等都不在话下

 Windows子系统(GUI)

Windows子系统 1 Windows子系统结构 Windows子系统结构,如图: Windows子系统有用户模式和内核模式组件。列出这些组件的职责: a. 内核模块win32k.sys。是Windows内核的扩展。包含两大功能组成部分: 窗口管理器(window manager): 负责控制窗口显示、管理屏幕输出、手机来自键盘鼠标和其他设备的输入,以及将用户信息传递给应用程序。 GDI:图形输出设备的函数库。 b.图形设备驱动程序。 c.Windows环境子系统进程(csrss.e..

maomao171314的专栏 6398

GUI_THREAD界面多线程操作

GUI_THREAD界面多线程操作 来源自网络

ABAP代码检查(Code Review)

1、SLIN 扩展程序检查 也可通过(SE38工具栏->检查-扩展程序检查) 进入 2、ATC 检查 通过<SE38菜单栏-检查-ABAP测试主控室> 或事物代码SCI, 支持自定义检查变式 SCI可以配置检查变式满足特殊需求,配置对象集用于批量检查 3、通过ABAP测试主控室实现统一管理,定期检查作业和监控功能(事务代码ATC) 参考 SLIN...

u012232542的博客 6072

关于Windows系统调用实现的笔记

关于Windows系统调用实现的笔记

求索 2212

Microsoft Speech SDK 使用过程中女声改为男声遇到的问题

问题将女生改为系统自带男声(Kangkang)根据上面的步骤我的播放声音是改变了,但是还是女生,是yaoyao的女生。是因为下面注册表路径中VoicePath这个配置的路径指向了yaoyao的文件。 如何使用Microsoft Speech SDK,请参考https://blog.youkuaiyun.com/daoming1112/article/details/77542562 使用系统自带男声语音,不需...

u012161365的博客 7540

Win32k(1) 图形线程的初始化

很久以前看ROS的笔记,跟windows不一样的地方不少,最近没时间看这块了= = 先贴上来备份第一部分图形线程的初始化综述一下——图形通信对象(user object)以线程为单位。这个线程是图形线程,调用表就是ssdt shadow,包含了图形系统调用,三环由user32提供,0环由win32k支持。线程包含窗口,桌面,普通窗口,各种控件,都是窗口。窗口有一个wndpro...

weixin_30332241的博客 179

方案设计之亿级排行榜方案设计

该方案通过 “Redis Zset 为核心 + 分治策略为骨架 + 多级优化为细节”,在亿级用户场景下实现了:本质是将 “亿级大问题” 拆解为 “千万级小问题”,用分布式思想和精细化设计平衡性能、可用性与成本。

shine0312的专栏 1100

Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (一)

先把这连个都添加到场景中,然后把kinect的depth相机拖到vision sensor中,把kinect的script也拖到vision sensor中,同时要注意修改深度相机的坐标,及修改script,删掉/rgb部分。由于需要导入到仿真场景中PDF文件不能直接导入,所以需要生成图下文件,使用windows自带的画图工具,生成以厘米为单位的图像格式,大小和标定板的设置大小一直。可以生成需要用的标定板的文件,设置标定板的大小,棋盘格的大小,等相关的参数,之后可以保存PDF文件。设置plane的大小。

hong3731的专栏 1753

windows内核情景分析--窗口消息

消息与钩子 众所周知,Windows系统是消息驱动的,现在我们就来看Windows的消息机制. 早期的Windows的窗口图形机制是在用户空间实现的,后来为了提高图形处理效率,将这部分移入内核空间,在Win32k.sys模块中实现。这个模块作为一个扩展的内核模块,提高了一个扩展额系统服务表,专用于窗口图形操作,相应的,这个模块中添加了一个扩展系统调用服务表Shadow SSDT,以及一个扩

maomao171314的专栏 3715

药物吸收仿真软件:Caco-2_(9).Caco-2模型在药物开发中的案例分析

通过以上五个案例,我们可以看到Caco-2模型在药物开发中的重要作用。它不仅能够帮助我们预测药物的肠道吸收情况,还能够用于优化药物配方、评估代谢稳定性、研究药物相互作用以及转运蛋白的影响。这些体外实验和仿真分析的结果为药物的进一步临床研究提供了重要的参考依据,有助于缩短药物开发周期,提高研发效率。

kkchenjj的博客 864

如何获取真正的中断入口地址

概述:   我们知道,DOS 的中断例程的入口地址存在 0000:0000 开始的中断向量表中,当程序要要建立一个中断例程时,需要修改中断向量表把入口地址指向自己的程序,为了使原来的中断例程能正常使用,在出口的时候还要用远跳转指令回到原中断的入口地址,如 DOS 中断 INT 21H,在 DOS 启动后,后面要挂上很多的新的例程,如 SMARTDRV 等等,磁盘中断 INT 13H 也是如此。  

w9521423的博客 3909

基于Python的FAO农业数据高效爬取与分析实战:从Scrapy到异步爬虫的进阶之路

本文将详细介绍如何使用Python最新技术爬取联合国粮农组织(FAO)的农业数据,涵盖从基础爬虫到高级异步爬虫的完整实现过程。文章包含5000余字的技术解析,提供完整的代码示例,并探讨数据处理与存储的最佳实践。

2201_76125261的博客 242

Python经典编程习题100例:第32例:相反顺序输出列表

不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程100例习题汇总 题目描述: 按相反的顺序输出列表的值。 解题思路: > 利用reverse函数逆序 代码: arr=['f','g','e','b'] print(arr) arr.reverse() print(arr) ...

优快云 精品推荐 1419

linux 内核入口地址,linux内核的加载地址和入口地址

编译完内核之后,会产生zImage,而把它直接导入0x30008000,会出现Bad Magic Number.查明是需要将内核加一个0x40大小的头,由mkimage工具来添加.mkimage在编译u-boot时在u-boot-1.1.6/tools下生成,可以为编译的内核添加头信息的.在bootm命令中会解析这个头,获得参数.zImage在编译内核时,在arch/arm/boot目录下生成。我...

weixin_42515100的博客 4908

总目录- AutoSAR从入门到精通实战系列课程【持续更新中...】

欢迎大家订阅《AutoSAR入门和实战系列》,开始前博主先列出AutoSAR学习的大纲,同时这也可以作为大家学习AutoSAR的参考。想学习和及以及的同学们,可以订阅本博客,本博客一直持续更新中。如果想深入或从本质上学习和理解AutoSAR,打开此链接后,,点击左下方【立即订阅】订阅专栏!!!】......

4万+

HTML自动获取地址,如何动态获取API入口地址

在本文中介绍另一个相对独立的技术:动态获取API 入口地址。文章附带的源码有两个工程:GetApiAddr 为一个独立的动态获取 API 入口地址的程序;另一个 Virus为在上一篇文章基础上进行扩展的病毒程序,这个程序把工程目录下的 test.exe 复制一份为 test_virus.exe并在这个文件上添加动态获取API入口地址的代码,如果程序运行成功,打开 test_virus.exe后会弹...

weixin_31869579的博客 595

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Uboot 引导内核时加载地址与入口地址问题

如果使用 mkimage 生成内核镜像文件的话,会在内核的前头加上了 64 bytes 的信息头,供建立 tag 之用。bootm 命令会首先判断 bootm xxx 这个指定的地址 xxx 与 -a 指定的加载地址是否相同。 如果不同的话会从这个地址开始提取出这个 64 bytes 的头部,对其进行分析,然后把去掉头部的内核复制到 -a 指定的加载地址去运行; 如果相同的话那就让其原封...

aiduan6474的博客 1480

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

fiq中断的入口地址_中断系统

中断的基本概念程序中断是在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又返回到现行程序的断点处,继续执行原程序。中断的作用:①实现CPU与IO设备的并行工作②处理硬件故障和软件错误③实现人机交互,用户干预机器需要用到中断系统④实现多道程序、分时操作,多道程序的切换需要借助于中断系统⑤实...

weixin_42515340的博客 4849

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

bootm命令中地址参数,内核加载地址以及内核入口地址

bootm命令只能用来引导经过mkimage构建了镜像头的内核镜像文件以及根文件镜像,对于没有用mkimage对内核进行处理的话,那直接把内核下载到连接脚本中指定的加载地址0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。通过mkimage可以给内核镜像或根文件系统镜像加入一个用来记录镜像的各种信息的头。同样通过mkimage也可以将内核镜像进行一次压缩(指定-C none/gz

liangkaiming的专栏 1万+

宝塔面板安全入口校验失败的解决方法

宝塔面板安全入口校验失败的解决方法, 宝塔BT面板新增了安全入口校验,这是一种安全机制,在登录地址的后面加上8位字符的随机码,如果宝塔后台登录地址的随机码不对就会提示“安全入口校验失败”,LAMPLNMP分享解决方法: 另外,很多同学遇到使用linuxboyECS云服务器安装宝塔后无法登录的情况,这是由于安全组的问题,参考官方文档(添加安全组规则开发8888端口 - linuxboy)安全组问题几乎是每个宝塔用户都会遇到的问题,建议参考官方文档。 安全入口校验失败 报错提示: 请使用正确的入口登录面板 错误

威小胖的博客 1万+
上一篇: 关闭SFC[文件保护]的源代码
下一篇: Microsoft Windows DHCP Client Service Remote Buffer Overflow
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值