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

琢磨悟真知
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-15 16:57
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

 


1、参考File Monitor的代码
2、安装一个2003就可以知道了
另外Hook NtCreateProcess的方法不是很理想,因为和OS相关性很大,从其它方向可以以达到目标
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-12-15 17:27
2、安装一个2003就可以知道了  :  我没有2003。我就像看看vntcreateprocess是如何实现的。

1、参考File Monitor的代码   :  好的。

另外Hook NtCreateProcess的方法不是很理想,因为和OS相关性很大,从其它方向可以以达到目标  :

我不是要HOOK NtCreateProcess,我是替换服务表中相应的入口啊,我找NtCreateProcess的目的是获得服务号。虽然和OS相关,但是ntdll.dll在不同的os中都要吧,都会实现NtCreateProcess吧,那我就可以拿到服务号了吧,麻烦大侠看看我说得对吗?
琢磨悟真知
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-15 17:55
2、安装一个2003就可以知道了  :  我没有2003。我就像看看vntcreateprocess是如何实现的。

1、参考File Monitor的代码   :  好的。

另外Hook NtCreateProcess的方法不是很理想,因为和OS相关性很大,从其它方向可以以达到目标  :

我不是要HOOK NtCreateProcess,我是替换服务表中相应的入口啊,我找NtCreateProcess的目的是获得服务号。虽然和OS相关,但是ntdll.dll在不同的os中都要吧,都会实现NtCreateProcess吧,那我就可以拿到服务号了吧,麻烦大侠看看我说得对吗?
 


其实这个就是Hook,并且不是MS公开使用的方法,所以你使用一定存在风险的
当然如果没有其它思路,这样实现当然可以
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-16 11:13
hook CreateProcess()不行吗?传进来的参数里面就有可执行文件.exe的名字,还有路径...
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-16 12:03
我Hook的是CreateProcessA和CreateProcessW,感觉还挺好的。
在交流中学习。。。
poweruser
驱动老牛
驱动老牛
  • 注册日期2003-02-26
  • 最后登录2008-07-18
  • 粉丝0
  • 关注0
  • 积分652分
  • 威望72点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-17 11:27
你说的这种替换函数地址的方式就是hook:)

如果只是想控制进程的创建,可以不必使用内核进行hook,在应用层hook api也可以做到,而且更方便一些,应用层hook api的实现方式网上很多,搜一下

2003的ntdll我有,英文版的,要是还需要,就给我发mail
老虎不发威,你当我是Hello Kitty!
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于: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]
琢磨悟真知
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
8楼#
发布于: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分
  • 社区居民
9楼#
发布于:2004-12-22 18:01
当你的注册函数被调用的时候,进程还没有获得执行的机会,你可以杀掉这个进程。所以可以控制!
琢磨悟真知
iamwuge
驱动牛犊
驱动牛犊
  • 注册日期2002-01-07
  • 最后登录2005-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-02-06 14:28
wywwwl 你太幼稚了。等你收到通知时,动态连接库都加载了,说不定连你的动态连接库的初始化代码都开始执行了,然后中断???危险的很。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
11楼#
发布于: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.


花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2005-02-06 14:55
wywwwl 你太幼稚了。等你收到通知时,动态连接库都加载了,说不定连你的动态连接库的初始化代码都开始执行了,然后中断???危险的很。


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


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

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

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

我是很幼稚。




琢磨悟真知
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位系统,不过还要问问:那该如何作啊?
琢磨悟真知
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-02-07 10:22
事情没那么绝对的啦,操作系统说它总得探测吧,躲过探测不就可以了。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-02-07 10:33
再说运行Ring 0代码可以不靠驱动。这就是解决方案。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-02-07 10:34
光听微软胡咧咧,那还是高手吗?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
17楼#
发布于:2005-02-07 12:31
光听微软胡咧咧,那还是高手吗?

不知道你有什么好办法???
我虽然把INTEL EM64T和AMD64的手册都看了一遍,还是没想通MS是如何在CPU硬件级别上实现的.....
请指点......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
18楼#
发布于: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已经实现了你的功能,所以方法完全可以......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-02-08 10:49
[quote]光听微软胡咧咧,那还是高手吗?

不知道你有什么好办法???
我虽然把INTEL EM64T和AMD64的手册都看了一遍,还是没想通MS是如何在CPU硬件级别上实现的.....
请指点...... [/quote]
估计它最多在各种操作系统的各个部分做些检测,除非不让进ring0,否则,再多的检测也没用。我如果对付,它总不能让调试器无法工作吧,我hook系统,设置硬件断点,它能耐我何?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
上一页
游客

返回顶部