xiaoc1026 发表于 2013-1-7 13:18:59

分享 进程拦截的一个标准方法

方法在 WIN2003 X86 X64WIN2008 X64 测试通过

//1,注册回调
status = PsSetLoadImageNotifyRoutine(MyProcessImageLoadFilter);

//2,
VOID MyProcessImageLoadFilter (
                                                           IN PUNICODE_STRINGpuniFullImageName,
                                                           IN HANDLEhProcessId,
                                                           IN PIMAGE_INFOpImageInfo
                                                           )
{
        PEPROCESS       pEprocess = NULL;
        PVOID                        pPEBAddr = NULL;

             //这里的 puniFullImageName 就是镜像路径了 有DLL、EXE什么的,过滤进程的话就判断EXE好了

            //如果判断是要进程拦截的进程 那么就销毁它

            KillProcess(hProcessId,pEprocess, pPEBAddr );

         //这样就达到了 拦截进程的目的
}


//3,销毁进程

void KillProcess(HANDLE hProcessId, PEPROCESS pEprocess, PVOID pPEBAddr)
{
        if( !NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)hProcessId,&pEprocess)) )
        {
                return;
        }

        if(VERSION_CHECK)
        {
                if( !MmIsAddressValid((PULONG64)((ULONG64)pfnGetProcessPeb(pEprocess) + BASEADDRESS_OFFSET)) )
                {   
                        return ;
                }        
                pPEBAddr = (PVOID)((ULONG64)pfnGetProcessPeb(pEprocess) + BASEADDRESS_OFFSET);

                *(ULONG64*)pPEBAddr += BASE_ADDRESS_DESTORY;
        }
        else
        {
                if( !MmIsAddressValid((PULONG)((ULONG)pfnGetProcessPeb(pEprocess) + BASEADDRESS_OFFSET)) )
                {   
                        return ;
                }
                pPEBAddr = (PVOID)((ULONG)pfnGetProcessPeb(pEprocess) + BASEADDRESS_OFFSET);               

                *(ULONG*)pPEBAddr += BASE_ADDRESS_DESTORY;
        }

        ObfDereferenceObject(pEprocess);
}

Tesla.Angela 发表于 2013-1-7 14:07:18

LZ这神判断。。。
如果程序的后缀名不是EXE的话,那岂不是能bypass你的判断?
你把EXE的后缀名改为scr,照样能运行。

xiaoc1026 发表于 2013-1-7 14:35:41

Tesla.Angela 发表于 2013-1-7 14:07 static/image/common/back.gif
LZ这神判断。。。
如果程序的后缀名不是EXE的话,那岂不是能bypass你的判断?
你把EXE的后缀名改为scr,照 ...

呵呵,可以在应用层设置规则嘛

Tesla.Angela 发表于 2013-1-7 17:15:49

xiaoc1026 发表于 2013-1-7 14:35 static/image/common/back.gif
呵呵,可以在应用层设置规则嘛

规则个毛。你这样子做根本行不通。
标准做法是使用PsSetCreateProcessNotifyRoutine。

xiaoc1026 发表于 2013-1-7 18:03:32

Tesla.Angela 发表于 2013-1-7 17:15 static/image/common/back.gif
规则个毛。你这样子做根本行不通。
标准做法是使用PsSetCreateProcessNotifyRoutine。 ...

为什么行不通呢,事实上我要拦截 c:\test.exe ,上面的方式是可行的哦

马大哈 发表于 2013-1-8 18:50:16

WINDOWS下实现同一效果的方式很少只有一种方法,哈哈.

只要达到目的又没有问题的话就好了{:soso_e113:}

Tesla.Angela 发表于 2013-1-13 16:51:27

xiaoc1026 发表于 2013-1-7 18:03 static/image/common/back.gif
为什么行不通呢,事实上我要拦截 c:\test.exe ,上面的方式是可行的哦

我的意思是,这么做只能拦截扩展名为EXE的程序,无法拦截扩展名为其他的程序。

Tesla.Angela 发表于 2013-1-18 12:48:48

sb666 发表于 2013-1-17 23:30 static/image/common/back.gif
在LoadImageNotify回调里获取前两个字节……看看是不是PE……

走LoadImageNotify的,有可能不是PE么?
页: [1]
查看完整版本: 分享 进程拦截的一个标准方法