x64的ssdt必备组件怎么声明

jimshu 的BLOG
用户名:jimshu
文章数:344
评论数:180
访问量:1094848
注册日期:
阅读量:5863
阅读量:12276
阅读量:364857
阅读量:1060026
51CTO推荐博文
  SQL Server 导入和导出数据向导只可以处理简单的数据传送,对于复杂的传送数据的需求,还需要使用SSDT来实现。一、配置SSIS服务1. 安装SSIS 和 SSDT  使用安装光盘安装SSIS和SSDT。  注意:对于SQL Server 2014,安装光盘没有附带安装文件,需要从官网下载Visual Studio对应的SSDT安装程序。&http://jimshu./04692. 配置SSIS服务二、修复SSDT  如果本机还安装了其它版本的SQL Server并覆盖了注册表,那么SSDT可能需要修复。例如,出现如下的错误。  解决方案:使用安装光盘,重新安装SSDT。  注意:也可以直接从安装光盘找到SSDT的安装文件,例如,SQL Server 2012 64位安装程序的DVD,安装文件为&D:\x64\Setup\sql_bids.msi 。在右键菜单中选择“修复”。三、启用SSDT1. SSDT简介  SSDT 是一个特殊的 Visual Studio 版本。也可以看作是 Visual Studio 集成环境中添加了一些商业智能的模板。  在SQL Server 2012之前的版本中,SSDT被称为BIDS。关于SSDT的介绍,详见 2. 创建SSIS项目  依次打开“开始”、“所有程序”、“Microsoft SQL Server 2012”、“SQL Server Data Tools”,启动 SSDT。然后新建一个 SSIS 项目。3. SSIS设计环境  以下是一个集成设计环境的示例:本文出自 “” 博客,谢绝转载!
了这篇文章
类别:┆阅读(0)┆评论(0)
本文收录至博客专题:《》查看: 11072|回复: 15
WIN8 x64下也成功HOOK SSDT了
主题帖子积分
还是上传个BIN给大家玩玩吧。。。
不过如何过PG/DS还请自己解决。。。
win8.jpg (222.49 KB, 下载次数: 104)
01:45 上传
图:保护进程名loaddrv.exe的进程不被结束。
这说明一个问题:WIN7 X64和WIN8 X64的SSDT地址算法没有发生变化!!!
WIN7 X64上的实现:
01:47 上传
点击文件名下载附件
244.09 KB, 阅读权限: 30, 下载次数: 1
售价: 10 水晶币 &[]
QQ群:(WINDOWS内核编程讨论)、(用户交流)
如果需要本人原创的代码请联系QQ:(付费服务,价格较高,非诚勿扰)
注意:最近发现有人恶意山寨本人网络ID,请认准上述本人唯一商务QQ防止上当受骗。
主题帖子积分
银牌会员, 积分 4795, 距离下一级还需 3205 积分
银牌会员, 积分 4795, 距离下一级还需 3205 积分
貌似很多东西从vista以后就没怎么变
主题帖子积分
来点码吧……不要总是高清无码……
主题帖子积分
银牌会员, 积分 4853, 距离下一级还需 3147 积分
银牌会员, 积分 4853, 距离下一级还需 3147 积分
win8的内核更新版本了么?还是6.X?
主题帖子积分
初级会员, 积分 409, 距离下一级还需 591 积分
初级会员, 积分 409, 距离下一级还需 591 积分
支持下。!
主题帖子积分
银牌会员, 积分 4853, 距离下一级还需 3147 积分
银牌会员, 积分 4853, 距离下一级还需 3147 积分
整了个win8,看起来版本号是6.2,所以很多东西都应该和win7一样……
主题帖子积分
初级会员, 积分 18, 距离下一级还需 982 积分
初级会员, 积分 18, 距离下一级还需 982 积分
主题帖子积分
初级会员, 积分 184, 距离下一级还需 816 积分
初级会员, 积分 184, 距离下一级还需 816 积分
主题帖子积分
嗷嗷叫的老马
WIN8不知道现在好不好点了,之前好多MSMVP讲课时它都假死,于是大家一脸黑线.....
我就是嗷嗷叫的老马了......
主题帖子积分
初级会员, 积分 117, 距离下一级还需 883 积分
初级会员, 积分 117, 距离下一级还需 883 积分
dddddd& &学习中~~~
疯狂作品奖
疯狂作品奖
赞助论坛勋章
赞助论坛勋章
乐于助人勋章
乐于助人勋章
Powered by查看: 3419|回复: 4
x64下KeSystemDescriptorTable(SSDT)地址的获取原理
阅读权限10
本帖最后由 msx2009 于
20:42 编辑
win32下KeSystemDescriptorTable的地址已经由ntoskrnl.exe导出,直接 extern PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable 即可获取SSDT的地址。在win64下,KeSystemDescriptorTable的地址没有被导出,不能通过win32下的方法获取地址。Win64下,我们可以通过msr寄存器获取 KiSystemCall64函数的地址,在这个函数开始地址向下搜索0x150字节左右,在通过特征码4c8d15,就能获取KeServiceDescriptorTable的地址。Windgb下看一下uf KiSystemCall64
kd& uf KiSystemCall64Flow analysis was incomplete, some code may be missingnt!KiSystemCall64:fffff800`03ecfbc0 0f01f8& && && & swapgsfffff800`03ecfbc3 000000 mov& &qword ptr gs:[10h],rspfffff800`03ecfbcc a8010000 mov& &rsp,qword ptr gs:[1A8h]fffff800`03ecfbd5 6a2b& && && && &push& & 2Bhfffff800`03ecfbd7 65ff push& & qword ptr gs:[10h]fffff800`03ecfbdf 4153& && && && &push& & r11……nt!KiSystemServiceRepeat:fffff800`03ecfcf2 4c8d&&lea& &&&r10,[nt!KeServiceDescriptorTable (fffff800`)]fffff800`03ecfcf9 4c8d1d808c2300&&lea& &&&r11,[nt!KeServiceDescriptorTableShadow (fffff800`)]fffff800`03ecfd00 f0000000 test dword ptr [rbx+100h],80hfffff800`03ecfd0a 4d0f45d3& && &&&cmovne&&r10,r11fffff800`03ecfd0e 423b441710& && &cmp& &&&eax,dword ptr [rdi+r10+10h]fffff800`03ecfd13 0f83e9020000& & jae& &&&nt!KiSystemServiceExit+0x1a7 (fffff800`03ed0002)
注意蓝色字节内容, KiSystemCall64的开始地址是fffff800`03ecfbc0 , 第二个蓝色标记处发现了KeServiceDescriptorTable,这条指令地址是fffff800`03ecfcf2,对应的字节为4c8d,Lea的对应字节为4c8d15,所以后边的字节478c2300为偏移地址,注意地址是反过来的,真正偏移地址是 00238c47,偏移地址是针对这条指令最后一个字节的地址的偏移,所以需要在加7字节,由此可得KeServiceDescriptorTable地址为:fffff800`03ecfcf2 +00238c47 + 7 = fffff800`。
我们可以dd KeServiceDescriptorTable看一下地址kd& dd KeServiceDescriptorTablefffff800`ed1800 fffff800 00000fffff800`8c fffff800可以看出上述计算是正确的。
编程实现以下,主要代码如下(引用别人的代码)://获取SSDT地址ULONGLONG MyGetKeServiceDescriptorTable(){& && &&&PUCHAR StartSearchAddress =(PUCHAR)__readmsr(0xC0000082);& && &&&PUCHAR EndSearchAddress = StartSearchAddress + 0x500;& && &&&PUCHAR i = NULL;& && &&&UCHAR b1=0,b2=0,b3=0;& && &&&ULONG templong=0;& && &&&ULONGLONG addr=0;
& && &&&for(i=StartSearchAi&EndSearchAi++)& && &&&{& && && && && & if(MmIsAddressValid(i) && MmIsAddressValid(i+1) && MmIsAddressValid(i+1))& && && && && & {& && && && && && && && &b1=*i;& && && && && && && && &b2=*(i+1);& && && && && && && && &b3=*(i+2);& && && && && && && && &if(b1==0x4c && b2==0x8d && b3==0x15) //4c8d15& && && && && && && && &{& && && && && && && && && && &&&memcpy(&templong,i+3,4);& && && && && && && && && && &&&addr = (ULONGLONG)templong + (ULONGLONG)i +7;& && && && && && && && && && &&&& && && && && && && && &}& && && && && & }& && &&&}& && &&&return 0;}
可以在驱动入口打印出地址DbgPrint(&[method 1]SSDT: %llx&,MyGetKeServiceDescriptorTable())
对曾经的32位转向64位HIPS驱动很有帮助
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
刚接触这个 如果楼主能看到我的问题的话,我想问问__readmsr(0xC0000082);是什么原理
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
谢谢楼主分享,学习了,一会就实践一下
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限20
支持新人贴
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
免责声明:吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
( 京ICP备号 | 京公网安备 87号 )
Powered by Discuz! X3.2
Comsenz Inc.下次自动登录
现在的位置:
& 综合 & 正文
Shadow SSDT x64
在32位下hook,和普通的SSDT hook没有太大的区别,主要就是查找shadow ssdt真实地址。这个网上许多大牛都已经给出方法了,就不讨论了,参考:
作为一个例子,就hook
NtGdiBitBlt吧,NtGdiBitBlt函数原型:
BOOL NtGdiBitBlt(HANDLE, int, int, int, int, HANDLE , int, int, int, int, int);
现在讨论在64位环境下,准备环境,vm, 虚拟win8x64系统,windbg,下载win8x64的符号表(如果你不嫌慢,网速也够快,那直接现下也可以的,我网速小,又比较急躁,就先下载下来了),贴下下载地址:
准备工作已经完毕,开始,开启虚拟系统,连接上windbg(具体怎么设置,google,一大堆),系统启动后,断下来。
由于KeServiceDescriptorTableShadow没有导出,需要先获取KeServiceDescriptorTableShadow的地址。这里的获取方式是通过在nt!KiSystemServiceStart查找固定地址获取,nt!KiSystemServiceStart通过在nt!KiServiceInternal中获取,nt!KiServiceInternal通过在Nt!ZwClose中获取,ZwClose是导出函数,可以直接使用。
切换到explorer.exe进程
先查看Nt!ZwClose,
u Nt!ZwClose
获取到nt!KiServiceInternal的地址
获取到nt!KiSystemServiceStart的地址
获取到KeServiceDescriptorTableShadow的地址。
编码实现:
NTSTATUS FindShadowSSDT(ULONG_PTR *SSSDT) {
ULONG_PTR ZwCloseAddr = 0;
ULONG_PTR ServiceInternalAddr = 0;
ULONG_PTR SystemServiceStartAddr = 0;
ULONG_PTR ShadowSSDT = 0;
*SSSDT = 0;
ZwCloseAddr = (ULONG_PTR)ZwC
ServiceInternalAddr = ((ULONG_PTR)ZwCloseAddr & 0xFFFFFFFF) +
(((ULONG_PTR)ZwCloseAddr + 0x1e + (uint32_t)(*((uint32_t *)((ULONG_PTR)ZwCloseAddr + 0x1a)))) & 0xFFFFFFFF);
SystemServiceStart = ServiceInternalAddr + 0x61 + (uint32_t)(*((uint32_t *)(ServiceInternalAddr + 0x5d)));
ShadowSSDT = SystemServiceStartAddr + 0x22 + (uint32_t)(*((uint32_t *)(SystemServiceStartAddr + 0x1e)));
*SSSDT = *((ULONG_PTR*)(ShadowSSDT + 0x20));
return STATUS_SUCCESS;
查看KeServiceDescriptorTableShadow:
需要关注的只有两处,一个是地址fffff960`00146e00,一个是000003da,fffff960`00146e00是Shadow
SSDT的地址,000003da是函数的个数
其中fffff800`f74fb200是SSDT的地址,000001ad是函数的个数,我们现在只考虑Shadow
win32k!W32pServiceTable=fffff960`00146e00
根据网上大牛给的Shadow
SSDT表函数调用方式,第n个函数真实地址:
win32k!W32pServiceTable+((poi(win32k!W32pServiceTable+4*n)&0x`ffffffff)&&4)-
可以看到KeServiceDescriptorTableShadow其实是用的四字节表示一个函数的地址的,由win32k!W32pServiceTable+偏移地址
先查看一下,都有哪些函数,当n=1,2,3时(我测试的时候,发现等于0的时候,查看不到任何值,不知为何):
当n=9时,为NtGdiBitBlt函数
即ffd66807在表内就代表NtGdiBitBlt函数。
到目前为止,已经找到KeServiceDescriptorTableShadow的地址,找到表内NtGdiBitBlt表示的地址,
现在还不能像32位那样直接把我的函数替换,因为这个地址是4字节的,我的函数是地址是8字节的。
现在还需要一个一块区域,这块区域内可以放一条跳转指令,跳到我的hook
函数内,这块区域要求通过
win32k!W32pServiceTable+((poi(win32k!W32pServiceTable+4*n)&0x`ffffffff)&&4)-公式来转换。
由于内存块对齐等原因,通常在页之间,函数之间,有一些闲置区域,如c3,90(ret,
nop等指令),在win32k模块的.txet内部,找一块合适的区域。
通过分析可执行文件头,获取.text节,查找上述空闲区域。
写个遍历函数,很快就能找到这样一块区域,记录下该地址addr_findtext,把跳转到hook函数的指令写在该处,
写的时候要去掉页的写保护,写完恢复。
far jump 0xff+地址()
通过公式把转换addr_findtext写入KeServiceDescriptorTableShadow的位置,写入之前先把原值备份。
恢复的时候,直接把原值写回即可。
至此,hook已经完成,我本机测试功能已经实现。搜索了许多资料,都记不清谁的了,感谢网上公布研究心得的大牛们!
这个方法限制很多,获取KeServiceDescriptorTableShadow是固定值偏移,不能保证其他64位版本,
兼容性较差,仅作为自己学习研究吧。
&&&&推荐文章:
【上篇】【下篇】博客访问: 12462
博文数量: 3
博客积分: 102
博客等级: 民兵
技术积分: 42
注册时间:
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: WINDOWS
  今天分析win7的一个64位的驱动,其中涉及到了win7 64位SSDT的知识,结果发现和xp系统的完全不一样,感慨自己out的同时,赶紧学习补上。  注:本文是自己的学习总结,如有不正确的地方欢迎拍砖指正。如果没有特殊说明下面说的都是64位的win7。另外,下文的汇编都是我随手写的或者直接从windbg或IDA上拷贝的,不保证用编译器能直接编译通过:不过即使编不过稍微一改应该就可以了。  windows的SSDT是类似于linux下的sys_call_table的东东,在windbg中它的符号名为KiServiceTable,下文也以KiServiceTable称呼之。下面主要说明KiServiceTable基址的获取方法和其格式。  给XP系统写驱动时当我们要用到KiServiceTable时,直接声明一下,然后就可以用了,因为XP系统中的nt导出了这个表。但在win7下这个导出去掉了,所以要想使用KiServiceTable的基址,就得另寻别的方法。网上以及我分析的文件,都是用的读取MSR,然后特征码匹配的方法。  读取MSR的第0xC0000082号寄存器,可以得到KiSystemCall64的基址。什么是KiSystemCall64呢?就是所有系统调用进入内核的第一站,相当于linux的system_call啦,网上有的是资料。要想得到KiServiceTable的基址,第一步就得获取KiSystemCall64的基址,方法如下:mov ecx, 0C000082hrdmsrshl rdx, 20hor rax, rdxKiSystemCall64的地址就保存到了rax寄存器中。  有了KiSystemCall64的基址怎么获取SSDT的基址呢?我们用windbg看一下KiSystemCall64中的代码:#以下代码是KiSystemCall64的节选nt!KiSystemCall64:fffff800`03cbaec0 0f01f8
swapgsfffff800`03cbaec3 000000 mov
qword ptr gs:[10h],rspfffff800`03cbaecc a8010000 mov
rsp,qword ptr gs:[1A8h]fffff800`03cbaed5 6a2b
2Bhfffff800`03cbaed7 65ff push
qword ptr gs:[10h]fffff800`03cbaedf 4153
r11fffff800`03cbaee1 6a33
33hfffff800`03cbaee3 51
rcxfffff800`03cbaee4 498bca
rcx,r10fffff800`03cbaee7 4883ec08
rsp,8fffff800`03cbaeeb 55
rbpfffff800`03cbaeec 00
rsp,158hfffff800`03cbaef3 488dac lea
rbp,[rsp+80h]...nt!KiSystemServiceStart:fffff800`03cbafde 0000
qword ptr [rbx+1D8h],rspfffff800`03cbafe5 8bf8
edi,eaxfffff800`03cbafe7 c1ef07
edi,7fffff800`03cbafea 83e720
edi,20hfffff800`03cbafed 25ff0f0000
eax,0FFFhnt!KiSystemServiceRepeat:fffff800`03cbaff2 4c8d
r10,[nt!KeServiceDescriptorTable (fffff800`03ef2840)]fffff800`03cbaff9 4c8d1d
r11,[nt!KeServiceDescriptorTableShadow (fffff800`03ef2880)]fffff800`03cbb000 f0000000 test dword ptr [rbx+100h],80hfffff800`03cbb00a 4d0f45d3
r10,r11...看到地址fffff800`03cbaff2处的指令了么?那里有个KeServiceDescriptorTable。我们要做的,就是通过特征码匹配到这一句,然后从中计算出KeServiceDescriptorTable的地址就行了。匹配就不用说了,看怎么计算地址吧。  这条指令是RIP相关的指令(我自己起的名词^_^,解释一下:4c是rex前缀,8d是操作码,15是modrm,用来计算的关键是后面四个字节,从15(00 010 101)可以知道这四个字节代表的值其实是相对于下一条指令的地址的偏移,再看不懂就学opcode去~~^_^),所用如果用p代表此指令的地址(即fffff800`03cbaff2),x代表指令长度(即7),用C语言语法表达计算方法为:base = *( (uint32*)( (char*)p + 3 ) ) &+ &( (char*)p + x )实际计算:*(uint32*)(fffff800`03cbaff2 + 3) --> 0x0x + (fffff800`03cbaff2 + 7) --> fffff800`03ef2840所以KeServiceDescriptorTable的基址为fffff800`03ef2840  有了KeServiceDescriptorTable的基址,要得到KiServiceTable的基址就很简单了:KiServiceTable = *((int**)KeServiceDescriptorTable)  终于得到KiServiceTable的基址了,事情到此好像结束了,不过我手贱的在windbg中看了一下KiServiceTable中的内容,发现里面根本不是指向系统调用函数基址的指针,而是一些看上去很无聊的数而已。继续网上查找.....  KiServiceTable的格式也和以前不一样了,现在的格式,虽然还是一个个的四字节整数,但再也不是函数指针。要想得到系统调用基址,需要用这些整数计算一下。计算方法如下(index为系统调用的调用号):base = *( (int32*)((int32*)KiServiceTable + index) ) >> 4 + (char*)KiServiceTable即对应的整数值右移4位,再加上KiServiceTable的基址(我怎么感觉这里文字表达得更清楚呢...)。  OK,搞定。
阅读(5642) | 评论(1) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
......PatchGuard你怎么搞定的
请登录后评论。}

我要回帖

更多关于 ssdt hook 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信