wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2640回复:25

大家帮助看看,关于进程控制方案以及2个问题

楼主#
更多 发布于:2004-12-15 11:18
1目的:控制用户对某些软件的运行。具体就是通过控制进程的创建来达到。
2适用范围:nt4、2000、xp 、2003。
3考虑因素: os。
4受到影响参数:服务表号。
5实现方法:hook系统的服务描述表。
为了控制进程的创建,就要控制NtCreateProcess和NtCreateProcessEx(xp、2003支持)这两个函数,实际上它们都是系统服务的包裹,在内部实现的第一条指令为mov eax, ********h,这(********h)4个字节的数字表示的是系统服务号,通过base+(********h)就可以得到实际的地址了,只要把地址的内容改为自己的MyNtCreateProcess就可以拦截进程的创建了。剩下的问题就是表号的获取和MyNtCreateProcess的处理过程。
表号的获取要从Ntdll.dll中拿到。因为NtCreateProcess只在Ntdll.dll实现。方法在内核中用zwquerysystmeInformaiton查到ntdll.dll的基本地址,然后对pe文件分析,找到NtCreateProcess函数地址,通过地址找前面5字节(B8+ 4个16进制,B8是MOV eax的指令代码) 的内容,其中4个16进制数字表示的就是服务号。
MyNtCreateProcess的处理就是对某些进程,如果允许执行,就调用原来的处理函数;如果不允许执行就返回一个不能创建的值(具体多少不知道)。

问题:
1)如何对进程进行识别,我想应该是:获取进程的名字,通过名字获得可执行文件的位置。但是怎么样获取进程的名字呢?
2)2003下面的ntdll.dll文件哪位大侠有阿,给我发一个啊email:wywwwl@163.com

琢磨悟真知
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-16 11:50
[quote]wowocock和AllenZh在吗?我觉得驱动可以在ring 1,2实现,类似ntdll.dll仅仅是一个包装,只能调用ring0中特定的例程实现,这样限制了特权指令的使用。你们觉得目前的驱动中有哪些通过这样方法不能实现呢?

你这是比较理想的方法,不过现在看来不现实.
按照INTEL的建议本来是那么做最好,这样普通驱动程序无法修改系统核心的数据结构,也不用担心什么核心级别的ROOTKIT了.
但是当初为了兼容其他CPU,所以现在的WINDOWS和LINUX都只用了RING0和RING3,而应用层调用核心服务或者通过中断门,或者通过X86-32下的SYSENTER,SYSEXIT或者X86-64下的SYSCALL,SYSRET来实现.
由于通过门切换,需要进行特权检查等步骤,所以在XP以后就采用了后面的方法.但是他们只能在0,3之间进行切换,如果位于1,2就无法使用.只能通过门的方法,但你认为要通过那么多门来调用系统服务方便吗????
所以现在只能一条道跑到黑而已..... [/quote]
AMD64中手册就是这么说的,这么说你认为MS不会在用这种方法实现Patching policy for x64-based systems
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2005-02-16 10:30
wowocock和AllenZh在吗?我觉得驱动可以在ring 1,2实现,类似ntdll.dll仅仅是一个包装,只能调用ring0中特定的例程实现,这样限制了特权指令的使用。你们觉得目前的驱动中有哪些通过这样方法不能实现呢?

你这是比较理想的方法,不过现在看来不现实.
按照INTEL的建议本来是那么做最好,这样普通驱动程序无法修改系统核心的数据结构,也不用担心什么核心级别的ROOTKIT了.
但是当初为了兼容其他CPU,所以现在的WINDOWS和LINUX都只用了RING0和RING3,而应用层调用核心服务或者通过中断门,或者通过X86-32下的SYSENTER,SYSEXIT或者X86-64下的SYSCALL,SYSRET来实现.
由于通过门切换,需要进行特权检查等步骤,所以在XP以后就采用了后面的方法.但是他们只能在0,3之间进行切换,如果位于1,2就无法使用.只能通过门的方法,但你认为要通过那么多门来调用系统服务方便吗????
所以现在只能一条道跑到黑而已.....
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-02-16 10:21
wowocock和AllenZh在吗?我觉得驱动可以在ring 1,2实现,类似ntdll.dll仅仅是一个包装,只能调用ring0中特定的例程实现,这样限制了特权指令的使用。你们觉得目前的驱动中有哪些通过这样方法不能实现呢?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-02-14 17:11
[quote]光听微软胡咧咧,那还是高手吗?

不知道你有什么好办法???
我虽然把INTEL EM64T和AMD64的手册都看了一遍,还是没想通MS是如何在CPU硬件级别上实现的.....
请指点...... [/quote]
我也看了一下AMD64的手册,发现它推荐驱动辅助的函数lib工作在ring 1和2,这样便限制了特权指令的使用,也许这便是MS的硬件级的实现。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-02-11 17:21
[quote]估计它最多在各种操作系统的各个部分做些检测,除非不让进ring0,否则,再多的检测也没用。我如果对付,它总不能让调试器无法工作吧,我hook系统,设置硬件断点,它能耐我何?

这样做理论上问题不打,实际还要测试了才知道
不知兄弟可否这样实验过? [/quote]
softice的bpm就是这样实做的
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-02-08 11:38
估计它最多在各种操作系统的各个部分做些检测,除非不让进ring0,否则,再多的检测也没用。我如果对付,它总不能让调试器无法工作吧,我hook系统,设置硬件断点,它能耐我何?

这样做理论上问题不打,实际还要测试了才知道
不知兄弟可否这样实验过?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-02-08 10:49
[quote]光听微软胡咧咧,那还是高手吗?

不知道你有什么好办法???
我虽然把INTEL EM64T和AMD64的手册都看了一遍,还是没想通MS是如何在CPU硬件级别上实现的.....
请指点...... [/quote]
估计它最多在各种操作系统的各个部分做些检测,除非不让进ring0,否则,再多的检测也没用。我如果对付,它总不能让调试器无法工作吧,我hook系统,设置硬件断点,它能耐我何?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2005-02-07 12:32
1目的:控制用户对某些软件的运行。具体就是通过控制进程的创建来达到。
2适用范围:nt4、2000、xp 、2003。
3考虑因素: os。
4受到影响参数:服务表号。
5实现方法:hook系统的服务描述表。
为了控制进程的创建,就要控制NtCreateProcess和NtCreateProcessEx(xp、2003支持)这两个函数,实际上它们都是系统服务的包裹,在内部实现的第一条指令为mov eax, ********h,这(********h)4个字节的数字表示的是系统服务号,通过base+(********h)就可以得到实际的地址了,只要把地址的内容改为自己的MyNtCreateProcess就可以拦截进程的创建了。剩下的问题就是表号的获取和MyNtCreateProcess的处理过程。
表号的获取要从Ntdll.dll中拿到。因为NtCreateProcess只在Ntdll.dll实现。方法在内核中用zwquerysystmeInformaiton查到ntdll.dll的基本地址,然后对pe文件分析,找到NtCreateProcess函数地址,通过地址找前面5字节(B8+ 4个16进制,B8是MOV eax的指令代码) 的内容,其中4个16进制数字表示的就是服务号。
MyNtCreateProcess的处理就是对某些进程,如果允许执行,就调用原来的处理函数;如果不允许执行就返回一个不能创建的值(具体多少不知道)。

问题:
1)如何对进程进行识别,我想应该是:获取进程的名字,通过名字获得可执行文件的位置。但是怎么样获取进程的名字呢?
2)2003下面的ntdll.dll文件哪位大侠有阿,给我发一个啊email:wywwwl@163.com

 

其实想法还是不错的,在32位下完全可行,其实IPD已经实现了你的功能,所以方法完全可以......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2005-02-07 12:31
光听微软胡咧咧,那还是高手吗?

不知道你有什么好办法???
我虽然把INTEL EM64T和AMD64的手册都看了一遍,还是没想通MS是如何在CPU硬件级别上实现的.....
请指点......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-02-07 10:34
光听微软胡咧咧,那还是高手吗?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-02-07 10:33
再说运行Ring 0代码可以不靠驱动。这就是解决方案。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-02-07 10:22
事情没那么绝对的啦,操作系统说它总得探测吧,躲过探测不就可以了。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2005-02-06 14:58
以后到了64位OS下,你的程序就等于垃圾了.
Patching policy for x64-based systems

 
 By: smex
Microsoft Windows Server 2003 SP1 and later versions of Windows for x64-based systems do not allow the kernel to be patched except through authorized Microsoft-originated hotfixes.

Why is this change important?

Kernel-mode drivers that extend or replace kernel services through undocumented means (such as hooking the system service tables) can interfere with other software and affect the stability of the operating system. For x86-based systems, Microsoft discourages such practices but does not prevent them programmatically, because doing so would break compatibility for a significant amount of released software. A similar base of released software does not exist for x64-based systems, so it is possible to add this level of protection to the kernel without breaking compatibility.



What works differently?

Many system structures are protected on x64-based systems, including the system service dispatch tables, the interrupt descriptor table (IDT), and the global descriptor table (GDT). The operating system also does not allow third-party software to allocate memory “on the side” and use it as a kernel stack. If the operating system detects one of these modifications or any other unauthorized patch, it will generate a bug check and shut down the system.


How do I fix these issues?

For compatibility with Windows for x64-based systems, drivers cannot do the following:
• Modify system services tables, for example, by hooking the KeServiceDescriptor table
• Modify the IDT
• Modify the GDT
• Use kernel stacks that are not allocated by the kernel
• Patch any part of the kernel (detected on AMD64-based systems only)

Drivers for other platforms should avoid these functions to help ensure stability and reliability of the operating system and a better experience for users.


 


我得软件不靠率64位系统,不过还要问问:那该如何作啊?
琢磨悟真知
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2005-02-06 14:55
wywwwl 你太幼稚了。等你收到通知时,动态连接库都加载了,说不定连你的动态连接库的初始化代码都开始执行了,然后中断???危险的很。


等你收到通知时,动态连接库都加载:这个你说对了!


说不定连你的动态连接库的初始化代码都开始执行了:这个你说错了

然后中断???危险的很 :不是中断,是结束进程。

上面这个方法是可以的,不过不是很好,最终我也没有采用。

我是很幼稚。




琢磨悟真知
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
15楼#
发布于:2005-02-06 14:47
以后到了64位OS下,你的程序就等于垃圾了.
Patching policy for x64-based systems

 
 By: smex
Microsoft Windows Server 2003 SP1 and later versions of Windows for x64-based systems do not allow the kernel to be patched except through authorized Microsoft-originated hotfixes.

Why is this change important?

Kernel-mode drivers that extend or replace kernel services through undocumented means (such as hooking the system service tables) can interfere with other software and affect the stability of the operating system. For x86-based systems, Microsoft discourages such practices but does not prevent them programmatically, because doing so would break compatibility for a significant amount of released software. A similar base of released software does not exist for x64-based systems, so it is possible to add this level of protection to the kernel without breaking compatibility.



What works differently?

Many system structures are protected on x64-based systems, including the system service dispatch tables, the interrupt descriptor table (IDT), and the global descriptor table (GDT). The operating system also does not allow third-party software to allocate memory “on the side” and use it as a kernel stack. If the operating system detects one of these modifications or any other unauthorized patch, it will generate a bug check and shut down the system.


How do I fix these issues?

For compatibility with Windows for x64-based systems, drivers cannot do the following:
• Modify system services tables, for example, by hooking the KeServiceDescriptor table
• Modify the IDT
• Modify the GDT
• Use kernel stacks that are not allocated by the kernel
• Patch any part of the kernel (detected on AMD64-based systems only)

Drivers for other platforms should avoid these functions to help ensure stability and reliability of the operating system and a better experience for users.


花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
iamwuge
驱动牛犊
驱动牛犊
  • 注册日期2002-01-07
  • 最后登录2005-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-02-06 14:28
wywwwl 你太幼稚了。等你收到通知时,动态连接库都加载了,说不定连你的动态连接库的初始化代码都开始执行了,然后中断???危险的很。
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2004-12-22 18:01
当你的注册函数被调用的时候,进程还没有获得执行的机会,你可以杀掉这个进程。所以可以控制!
琢磨悟真知
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-12-22 17:56
简单的方法:
PsSetLoadImageNotifyRoutine(ImageCreateMon)
在ImageCreateMon中处理控制进程的是继续执行还是不让执行,这个是我跟踪系统服务之后发现的,可以适合2000 xp 2003.

NT4我不知道能不能用(不知道NT4是否支持PsSetLoadImageNotifyRoutine(ImageCreateMon)
)。但是PsSetLoadImageNotifyRoutine只能成功8次,DDK上说得,作多可以注册8个回调,不爽。万一你是第9个,怎么办?

复杂的方法就是hook系统服务,可以脱离PsSetLoadImageNotifyRoutine(ImageCreateMon)
限制,但是使用了一些没用公开的函数。但是可以支持到NT4。

实践证明:这个方案是不完全的,需要考虑的问题很多。但是可以从这个方案出发,探测系统的行为。

[编辑 -  12/22/04 by  wywwwl]


用PsSetLoadImageNotifyRoutine怎么控制进程创建???
它只能在进程创建的时候得到通知吧,但是没有办法控制进程的创建。
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2004-12-22 17:25
简单的方法:
PsSetLoadImageNotifyRoutine(ImageCreateMon)
在ImageCreateMon中处理控制进程的是继续执行还是不让执行,这个是我跟踪系统服务之后发现的,可以适合2000 xp 2003.

NT4我不知道能不能用(不知道NT4是否支持PsSetLoadImageNotifyRoutine(ImageCreateMon)
)。但是PsSetLoadImageNotifyRoutine只能成功8次,DDK上说得,作多可以注册8个回调,不爽。万一你是第9个,怎么办?

复杂的方法就是hook系统服务,可以脱离PsSetLoadImageNotifyRoutine(ImageCreateMon)
限制,但是使用了一些没用公开的函数。但是可以支持到NT4。

实践证明:这个方案是不完全的,需要考虑的问题很多。但是可以从这个方案出发,探测系统的行为。

[编辑 -  12/22/04 by  wywwwl]
琢磨悟真知
上一页
游客

返回顶部