阅读:2638回复:25
大家帮助看看,关于进程控制方案以及2个问题
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 |
|
|
沙发#
发布于:2004-12-15 16:57
1目的:控制用户对某些软件的运行。具体就是通过控制进程的创建来达到。 1、参考File Monitor的代码 2、安装一个2003就可以知道了 另外Hook NtCreateProcess的方法不是很理想,因为和OS相关性很大,从其它方向可以以达到目标 |
|
|
板凳#
发布于:2004-12-15 17:27
2、安装一个2003就可以知道了 : 我没有2003。我就像看看vntcreateprocess是如何实现的。
1、参考File Monitor的代码 : 好的。 另外Hook NtCreateProcess的方法不是很理想,因为和OS相关性很大,从其它方向可以以达到目标 : 我不是要HOOK NtCreateProcess,我是替换服务表中相应的入口啊,我找NtCreateProcess的目的是获得服务号。虽然和OS相关,但是ntdll.dll在不同的os中都要吧,都会实现NtCreateProcess吧,那我就可以拿到服务号了吧,麻烦大侠看看我说得对吗? |
|
|
地板#
发布于:2004-12-15 17:55
2、安装一个2003就可以知道了 : 我没有2003。我就像看看vntcreateprocess是如何实现的。 其实这个就是Hook,并且不是MS公开使用的方法,所以你使用一定存在风险的 当然如果没有其它思路,这样实现当然可以 |
|
|
地下室#
发布于:2004-12-16 11:13
hook CreateProcess()不行吗?传进来的参数里面就有可执行文件.exe的名字,还有路径...
|
|
5楼#
发布于:2004-12-16 12:03
我Hook的是CreateProcessA和CreateProcessW,感觉还挺好的。
|
|
|
6楼#
发布于:2004-12-17 11:27
你说的这种替换函数地址的方式就是hook:)
如果只是想控制进程的创建,可以不必使用内核进行hook,在应用层hook api也可以做到,而且更方便一些,应用层hook api的实现方式网上很多,搜一下 2003的ntdll我有,英文版的,要是还需要,就给我发mail |
|
|
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] |
|
|
8楼#
发布于:2004-12-22 17:56
简单的方法: 用PsSetLoadImageNotifyRoutine怎么控制进程创建??? 它只能在进程创建的时候得到通知吧,但是没有办法控制进程的创建。 |
|
9楼#
发布于:2004-12-22 18:01
当你的注册函数被调用的时候,进程还没有获得执行的机会,你可以杀掉这个进程。所以可以控制!
|
|
|
10楼#
发布于:2005-02-06 14:28
wywwwl 你太幼稚了。等你收到通知时,动态连接库都加载了,说不定连你的动态连接库的初始化代码都开始执行了,然后中断???危险的很。
|
|
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. |
|
|
12楼#
发布于:2005-02-06 14:55
wywwwl 你太幼稚了。等你收到通知时,动态连接库都加载了,说不定连你的动态连接库的初始化代码都开始执行了,然后中断???危险的很。 等你收到通知时,动态连接库都加载:这个你说对了! 说不定连你的动态连接库的初始化代码都开始执行了:这个你说错了 然后中断???危险的很 :不是中断,是结束进程。 上面这个方法是可以的,不过不是很好,最终我也没有采用。 我是很幼稚。 |
|
|
13楼#
发布于:2005-02-06 14:58
以后到了64位OS下,你的程序就等于垃圾了. 我得软件不靠率64位系统,不过还要问问:那该如何作啊? |
|
|
14楼#
发布于:2005-02-07 10:22
事情没那么绝对的啦,操作系统说它总得探测吧,躲过探测不就可以了。
|
|
|
15楼#
发布于:2005-02-07 10:33
再说运行Ring 0代码可以不靠驱动。这就是解决方案。
|
|
|
16楼#
发布于:2005-02-07 10:34
光听微软胡咧咧,那还是高手吗?
|
|
|
17楼#
发布于:2005-02-07 12:31
光听微软胡咧咧,那还是高手吗? 不知道你有什么好办法??? 我虽然把INTEL EM64T和AMD64的手册都看了一遍,还是没想通MS是如何在CPU硬件级别上实现的..... 请指点...... |
|
|
18楼#
发布于:2005-02-07 12:32
1目的:控制用户对某些软件的运行。具体就是通过控制进程的创建来达到。 其实想法还是不错的,在32位下完全可行,其实IPD已经实现了你的功能,所以方法完全可以...... |
|
|
19楼#
发布于:2005-02-08 10:49
[quote]光听微软胡咧咧,那还是高手吗? 不知道你有什么好办法??? 我虽然把INTEL EM64T和AMD64的手册都看了一遍,还是没想通MS是如何在CPU硬件级别上实现的..... 请指点...... [/quote] 估计它最多在各种操作系统的各个部分做些检测,除非不让进ring0,否则,再多的检测也没用。我如果对付,它总不能让调试器无法工作吧,我hook系统,设置硬件断点,它能耐我何? |
|
|
上一页
下一页