其实这个已经是一个很老的技巧了,今天挖出来写到blog上。windows在强制结束进程的时候会先结束掉所有的线程,而结束线程调用的是:PspTerminateThreadByPointer,这个函数很有意思。看看就知道了。

它判断ETHREAD里面的CrossThreadFlags;的值,如果这个值等于PS_CROSS_THREAD_FLAGS_SYSTEM ,即是一个系统线程,那么直接返回拒绝访问,那么进程就无法结束了。所以我们把程序的线程改成系统线程,那么就可以达到防杀的目的。当然要杀还是很快的,把值修改回去或者投递一个ExitThread的APC就OK了。当然,觉得不够刺激可以改成PS_CROSS_THREAD_FLAGS_BREAK_ON_TERMINATION,那么结束线程的时候,系统会中断下来,一般是因为没有调试器附加而产生一个bugcheck,即蓝屏。

NTSTATUS
PspTerminateThreadByPointer(
    IN PETHREAD Thread,
    IN NTSTATUS ExitStatus,
    IN BOOLEAN DirectTerminate
    )

/**//**//**//*++

Routine Description:

    This function causes the specified thread to terminate.

Arguments:

    ThreadHandle - Supplies a referenced pointer to the thread to terminate.

    ExitStatus - Supplies the exit status associated with the thread.

    DirectTerminate - TRUE is its ok to exit without queing an APC, FALSE otherwise

--*/

......{
    NTSTATUS Status;
    PKAPC    ExitApc=NULL;
    ULONG    OldMask;

    PAGED_CODE();

    if (Thread->CrossThreadFlags
    & PS_CROSS_THREAD_FLAGS_BREAK_ON_TERMINATION) ......{
      PspCatchCriticalBreak("Terminating critical thread 0x%p (in %s) ",
                Thread,
                THREAD_TO_PROCESS(Thread)->ImageFileName);
    }

    if (DirectTerminate && Thread == PsGetCurrentThread()) ......{

        ASSERT (KeGetCurrentIrql() < APC_LEVEL);

        PS_SET_BITS (&Thread->CrossThreadFlags, PS_CROSS_THREAD_FLAGS_TERMINATED);

        PspExitThread (ExitStatus);

        //
        // Never Returns
        //

    } else ......{
        //
        // Cross thread deletion of system threads won't work.
        //
        if (IS_SYSTEM_THREAD (Thread)) ......{//如果这个是一个系统线程,直接返回拒绝访问。
            return STATUS_ACCESS_DENIED;
        }

        Status = STATUS_SUCCESS;

        while (1) ......{
            ExitApc = (PKAPC) ExAllocatePoolWithTag (NonPagedPool,
                                                     sizeof(KAPC),
                                                     'xEsP');
            if (ExitApc != NULL) ......{
                break;
            }
            KeDelayExecutionThread(KernelMode, FALSE, &ShortTime);
        }

        //
        // Mark the thread as terminating and call the exit function.
        //
        OldMask = PS_TEST_SET_BITS (&Thread->CrossThreadFlags, PS_CROSS_THREAD_FLAGS_TERMINATED);

        //
        // If we are the first to set the terminating flag then queue the APC
        //

        if ((OldMask & PS_CROSS_THREAD_FLAGS_TERMINATED) == 0) ......{

            KeInitializeApc (ExitApc,
                             PsGetKernelThread (Thread),
                             OriginalApcEnvironment,
                             PsExitSpecialApc,
                             PspExitApcRundown,
                             PspExitNormalApc,
                             KernelMode,
                             ULongToPtr (ExitStatus));

            if (!KeInsertQueueApc (ExitApc, ExitApc, NULL, 2)) ......{
                //
                // If APC queuing is disabled then the thread is exiting anyway
                //
                ExFreePool (ExitApc);
                Status = STATUS_UNSUCCESSFUL;
            } else ......{
                //
                // We queued the APC to the thread. Wake up the thread if it was suspended.
                //
                KeForceResumeThread (&Thread->Tcb);

            }
        } else ......{
            ExFreePool (ExitApc);
        }
    }

    return Status;
}

现在我们要修改CrossThreadFlags,那么首先要找到线程对应的ETHREAD,如果是驱动来做的话,几行代码就OK了。但是在ring3也是几行代码。我们先用OpenThread打开自己,这时会产生一个handle,然后我们把这个handle遍历出来,以查找到对应的Object的地址,也就是ETHREAD的地址。查找handle可以使用ZwQuerySystemInformation去获得。这时就剩下修改内存了,因为ETHREAD是在内核内存的,不能直接访问,我们可以通过NtSystemDebugControl去修改内核内存。下面是核心代码:

    ZWQUERYSYSTEMINFORMATION        ZwQuerySystemInformation = NULL;
    NTSYSTEMDEBUGCONTROL            NtSystemDebugControl = NULL;
    HANDLE hThread = NULL;
    DWORD    dwPID = GetCurrentProcessId();
    DWORD    dwTID = GetCurrentThreadId();
    PSYSTEM_HANDLE_INFORMATION        pHandleInfo = NULL;
    ULONG    uObjCnt = 0;
    NTSTATUS    status;
    DWORD    dwBufLen = 1024*800;
    DWORD    dwRetLen = 1024*800;
    DWORD    dwETHREAD = 0;
    BOOL    bRet = FALSE;

    EnableDebugPrivilege(TRUE);

    ZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)GetProcAddress(LoadLibrary("ntdll.dll"),"ZwQuerySystemInformation");
    NtSystemDebugControl = (NTSYSTEMDEBUGCONTROL)GetProcAddress(LoadLibrary("ntdll.dll"),"NtSystemDebugControl");

    //先创建一个线程对象
    GetProcAddress(LoadLibrary("kernel32.dll"),"OpenThread");

    __asm
    ......{//SDK居然不包含OpenThread的声明,只能用汇编,简单很多。
        push dwTID
        push 0
        push THREAD_ALL_ACCESS
        call eax
        mov hThread,eax
    }

    //获得线程对象的地址
    BYTE * pBuf = new BYTE[dwBufLen];
    ZeroMemory(pBuf,dwBufLen);
    status = ZwQuerySystemInformation(SystemHandleInformation,pBuf,dwBufLen,&dwRetLen);//列举系统所有句柄
    
    uObjCnt = (ULONG)*(ULONG*)pBuf;//获得句柄的个数

    pHandleInfo = (PSYSTEM_HANDLE_INFORMATION)(pBuf+sizeof(ULONG));
    
    if(NT_SUCCESS(status))
    ......{
        
        for(int i=0;i<uObjCnt;i++)
        ......{
            if(pHandleInfo->ProcessId==dwPID//如果句柄的拥有者并且句柄是之前打开的。
                &&pHandleInfo->Handle==(USHORT)hThread)
            ......{
                dwETHREAD = (DWORD)pHandleInfo->Object;//保存下来
                break;
            }
            pHandleInfo++;
        }
        
        //patch 内核
        
        MEMORY_CHUNKS datas;
        datas.Address = dwETHREAD+0x248;//CrossThreadFlags的偏移
        datas.Data = &m_dwFixData;
        datas.Length = 4;

        status = NtSystemDebugControl(0x9,&datas,sizeof(MEMORY_CHUNKS),NULL,0,&dwRetLen);

    //    status = NtSystemDebugControl(0x8,&datas,sizeof(MEMORY_CHUNKS),NULL,0,&dwRetLen);

        if(NT_SUCCESS(status))
            bRet = TRUE;

    }
    delete [] pBuf;
    CloseHandle(hThread);

当然上面的代码只在XP下有效,并且是管理员。为什么?自己去看资料吧。呵呵。

我晕,这文章我发表了5次才成功,CSDN可不是一般的烂.

完整代码:http://download.csdn.net/source/458567

三两行代码实现进程防杀,免驱动,IceSword,WSysCheck等无效.相关推荐

  1. 首创!用户级权限进程防杀 C++

    用户级权限实现简单防杀 Guest权限下实现防杀!全网首创思路! 无意中翻出小学时候写的程序,应该是全网首创的无权限防杀手段,拿出来分享下.这个程序运行不需要任何权限,应该是为数不多的能抗住PChun ...

  2. 两行代码隐藏进程在top中的显示

    今天到上海比较早,赶上了嘉泰线公交车,省了几十块钱打车钱,高兴! 两行代码能干啥?能隐藏一个进程在top中的显示,却也只能隐藏一个进程在top中的显示.如果非要抬杠sar可以暴露,perf可以暴露,t ...

  3. 黑科技!两行代码完美解决:同时设置overflow-x:hidden,overflow-y:visible无效的问题...

    不废话,直接上代码 <!DOCTYPE html> <html><head><style>body {padding: 0;margin: 0;heig ...

  4. 很巧妙的进程防杀方法[秋镇菜原创]

    刚刚学内核对象,想写个可以防杀的进程,但其他方法太高级, 本菜鸟不感高攀,想了几天,想到一个很本的办法,不正确的 方还请高手指点一下. 程序运行两个事例,每个实例互相监视另外的实例是否存在, 如果不存 ...

  5. c语言怎么去掉空白行,多种方法求解去掉空格 (三两行代码---适合初学者)

    ---------------------------------------解法一 ---------------------------------------------- 解题思路: 其实本题 ...

  6. Linux进程防杀/防崩溃monitor的实现

    对于自行实现的很多服务,很多人喜欢用一个专门的监控进程来监控自己的服务,为了防止监控进程也崩掉,甚至使用了经典的双进程监控.不说别的,光编写调试这个双进程就够我喝一壶的啦,对于我这样专门写bug的家伙 ...

  7. 智能化防杀未知电脑病毒探讨

    智能化防杀未知电脑病毒探讨 金州[est_vip] 2006.8.21 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-c ...

  8. im即时通讯开发:进程被杀底层原理、APP应对被杀技巧

    本文的技术原理讲解透彻.系统源码分享到位.样例代码也很有参考意义,希望能对有同样兴趣爱好的Android开发者.IM开发者.推送系统开发者等,带来对于Android进程保活技术的深入理解. 一直以来, ...

  9. android 读取U盘apk文件信息,拔掉U盘导致进程被杀

    最近一直在搞appStore,之前一直都是从网络获取apk下载进行安装,现在车机要求需要支持从U 盘安装apk,本以为简单很容易的事,却一不小心掉了一个坑里,爬了好久,主要是没很明显的报错,没遇到过的 ...

最新文章

  1. Java知识点总结——装箱与拆箱
  2. One order search dynamic SQL build logic
  3. php无法post,PHP无法获得post数据
  4. bootstrap --- 弹出对话框
  5. USB 摄像头成熟方案介绍
  6. 远程声控系统(MATLAB代码见CSDN资源)
  7. CompletionService VS ExecutorService
  8. 软件测试,何去何从?
  9. 【正则化】Label Smoothing详解
  10. OpenShift 4 - DevSecOps (1) - 安装 DevOps 环境
  11. ajax响应不显示值,Ajax响应200正常,但显示未能加载响应数据
  12. linux基础--grep以及模式正则表达式
  13. Dagger 注入的简单原理
  14. 幸运抽奖java_java10幸运抽奖
  15. global shutter和rolling shutter,全局快门与卷帘式快门
  16. 网页数据提取----网络投票软件开发(续1)
  17. 那些活在浪里的创业者最终被拍成了电影
  18. 不浪费原料的汉堡制作方案--贪心算法
  19. mysql gprs 程序_基于STM32控制的GPS定位与GPRS发送数据(程序源码)
  20. 338页网易Java面试真题解析火爆全网,面试真题解析

热门文章

  1. extra加ing_英语词缀extra- (outside; beyond) 与派生词
  2. springboot + vue项目本地化部署配置内+外网
  3. 杂项:SpagoBI
  4. matlab 交易模型,基于技术交易规则的动态模型股票价格(附论文和Matlab源程序)...
  5. Python去掉列表中的 ‘ | ’ |竖线分隔符
  6. el-table 按照某种规则 进行自定义升序降序的排序
  7. 人才早已过剩,计算机专业还值得报吗?
  8. 服务器系统盘 回写盘价格,服务器内存当回写盘
  9. PDF文件限制编辑、不能打印
  10. 【常见算法】求近似值