分享 进程拦截的一个标准方法
方法在 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);
} LZ这神判断。。。
如果程序的后缀名不是EXE的话,那岂不是能bypass你的判断?
你把EXE的后缀名改为scr,照样能运行。 Tesla.Angela 发表于 2013-1-7 14:07 static/image/common/back.gif
LZ这神判断。。。
如果程序的后缀名不是EXE的话,那岂不是能bypass你的判断?
你把EXE的后缀名改为scr,照 ...
呵呵,可以在应用层设置规则嘛 xiaoc1026 发表于 2013-1-7 14:35 static/image/common/back.gif
呵呵,可以在应用层设置规则嘛
规则个毛。你这样子做根本行不通。
标准做法是使用PsSetCreateProcessNotifyRoutine。 Tesla.Angela 发表于 2013-1-7 17:15 static/image/common/back.gif
规则个毛。你这样子做根本行不通。
标准做法是使用PsSetCreateProcessNotifyRoutine。 ...
为什么行不通呢,事实上我要拦截 c:\test.exe ,上面的方式是可行的哦 WINDOWS下实现同一效果的方式很少只有一种方法,哈哈.
只要达到目的又没有问题的话就好了{:soso_e113:} xiaoc1026 发表于 2013-1-7 18:03 static/image/common/back.gif
为什么行不通呢,事实上我要拦截 c:\test.exe ,上面的方式是可行的哦
我的意思是,这么做只能拦截扩展名为EXE的程序,无法拦截扩展名为其他的程序。 sb666 发表于 2013-1-17 23:30 static/image/common/back.gif
在LoadImageNotify回调里获取前两个字节……看看是不是PE……
走LoadImageNotify的,有可能不是PE么?
页:
[1]