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

通过修改线程的CrossThreadFlags值为PS_CROSS_THREAD_FLAGS_SYSTEM,使得进程在试图被强制结束时,系统会返回拒绝访问,从而达到防杀效果。在Windows中,当CrossThreadFlags等于PS_CROSS_THREAD_FLAGS_SYSTEM时,结束线程操作会失败。虽然仍可通过恢复值或投递ExitThread APC解除保护,但此技巧提供了一种免驱动的防杀手段。代码实现主要涉及OpenThread、ZwQuerySystemInformation和NtSystemDebugControl等API,可在用户模式下完成。
摘要由CSDN通过智能技术生成

其实这个已经是一个很老的技巧了,今天挖出来写到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);

<
  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值