首页
社区
课程
招聘
[求助]求段代码:实现进程保护
发表于: 2010-4-22 20:46 10204

[求助]求段代码:实现进程保护

2010-4-22 20:46
10204
求个能在2000/xp/2003/vista下实现进程保护的代码。
能在杀毒软件运行下稳定运行的。
具备一定强度的,(毕竟这玩意是相对的)。
可适当给点酬劳。
qq:467280785

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 21
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不让把进程杀掉?
2010-4-22 20:48
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是啊,XP下我自己用 hook shadow ssdt搞的挺稳的了。
但2000/2003/vista不能跑,要改,很烦
2010-4-22 20:51
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
一堆一堆的代码,hook ntopenprocess,内核态,用户态都是一堆一堆的
2010-4-22 22:41
0
雪    币: 72
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主参考下!
上传的附件:
2010-4-22 22:53
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
5楼的,你的程序兰屏了.还是谢谢
2010-4-23 14:42
0
雪    币: 72
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
加我Q吧 楼主!
2010-4-23 16:15
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
8
SSDT hook NtOpenProcess就完事了~
2010-4-23 20:28
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
9
楼主真有钱可以买个nProtect GameGuard SDK来保护自己的进程
2010-4-23 20:28
0
雪    币: 492
活跃值: (53)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
能买到源代码吗?
2010-4-23 20:32
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
11
nProtect GameGuard的src INCA开出来的价格很BT~
2010-4-23 20:33
0
雪    币: 492
活跃值: (53)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
12
估计韩国棒子想钱想疯了,呵呵~~~
2010-4-23 21:02
0
雪    币: 254
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
一定强度是什么强度?
真能搞
2010-4-23 23:22
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
关注中,我也想知道怎么保护啊
2010-4-23 23:41
0
雪    币: 410
活跃值: (214)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
15
要hook就往底层走,比如PspTerminateThreadByPointer,KeInsertQueueApc..当然还是做不到绝对的安全
2010-4-24 11:52
0
雪    币: 1753
活跃值: (840)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
16
#include "ntddk.h"

#define NT_DEVICE_NAME      L"\\Device\\ProtectProcess"
#define DOS_DEVICE_NAME     L"\\DosDevices\\ProtectProcess"

#define IOCTL_PROTECT_CONTROL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)

NTSTATUS DispatchDeviceControl(IN PDEVICE_OBJECT  DeviceObject,IN PIRP  Irp);
VOID OnUnload(IN PDRIVER_OBJECT DriverObject);

#pragma pack(1)        //SSDT表的结构
typedef struct ServiceDescriptorEntry {
        unsigned int *ServiceTableBase;
        unsigned int *ServiceCounterTableBase; //Used only in checked build
        unsigned int NumberOfServices;
        unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()

__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;        //变量名是不能变的,因为是从外部导入
//这个是查询某个函数的地址的一个宏
#define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)_function+1)]

NTSYSAPI NTSTATUS NTAPI ZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);
typedef NTSTATUS (*ZWOPENPROCESS)(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL);

ZWOPENPROCESS OldZwOpenProcess;
long pid = 584;

NTSTATUS NewZwOpenProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PCLIENT_ID ClientId OPTIONAL)
{
        //用来替换的新函数
        NTSTATUS nStatus = STATUS_SUCCESS;
        if((long)ClientId->UniqueProcess == pid)
        {
                DbgPrint("保护进程 PID:%ld\n",pid);
                return STATUS_ACCESS_DENIED;
        }

        //剩下的交给我们的原函数
        nStatus = OldZwOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
        return STATUS_SUCCESS;
}

VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
        //卸载时会调用
        UNICODE_STRING DeviceLinkString;
        PDEVICE_OBJECT DeviceObjectTemp1=NULL;
        PDEVICE_OBJECT DeviceObjectTemp2=NULL;

        DbgPrint("驱动程序卸载...\n");

        RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME);
        IoDeleteSymbolicLink(&DeviceLinkString);
        if(DriverObject)
        {
                DeviceObjectTemp1=DriverObject->DeviceObject;
                while(DeviceObjectTemp1)
                {
                        DeviceObjectTemp2=DeviceObjectTemp1;
                        DeviceObjectTemp1=DeviceObjectTemp1->NextDevice;
                        IoDeleteDevice(DeviceObjectTemp2);
                }
        }  
        DbgPrint("设备已经卸载\n");

        DbgPrint("修复SSDT表\n");
        (ZWOPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess)) = OldZwOpenProcess;

        DbgPrint("驱动卸载完毕.\n");
}

NTSTATUS DispatchDeviceControl(IN PDEVICE_OBJECT  DeviceObject,IN PIRP  Irp)
{
        //IRP_MJ_DEVICE_CONTROL的响应函数
        NTSTATUS nStatus = STATUS_SUCCESS;
        ULONG IoControlCode = 0;
        PIO_STACK_LOCATION IrpStack = NULL;

        long* inBuf = NULL;
        char* outBuf = NULL;
        ULONG inSize = 0;
        ULONG outSize = 0;
        PCHAR buffer = NULL;
        PMDL mdl = NULL;

        Irp->IoStatus.Status = STATUS_SUCCESS;
        Irp->IoStatus.Information = 0;

        IrpStack = IoGetCurrentIrpStackLocation(Irp);

        switch(IrpStack->MajorFunction)
        {
        case IRP_MJ_CREATE:
                DbgPrint("IRP_MJ_CREATE 被调用\n");
                break;
        case IRP_MJ_CLOSE:
                DbgPrint("IRP_MJ_CLOSE 被调用\n");
                break;
        case IRP_MJ_DEVICE_CONTROL:
                DbgPrint("IRP_MJ_DEVICE_CONTROL 被调用\n");
                IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
                switch(IoControlCode)
                {
                case IOCTL_PROTECT_CONTROL:
                        inSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
                        outSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;                       
                        inBuf = (long*)Irp->AssociatedIrp.SystemBuffer;
               
                        pid = *inBuf;
                        DbgPrint("===========================\n");
                        DbgPrint("IOCTL_PROTECT_CONTROL 被调用,通讯成功!\n");
                        DbgPrint("输入缓冲区大小: %d\n",inSize);
                        DbgPrint("输出缓冲区大小: %d\n",outSize);
                        DbgPrint("输入缓冲区内容: %ld\n",*inBuf);
                        DbgPrint("当前保护进程ID: %ld\n",pid);
                        DbgPrint("===========================\n");       
                       
                        strcpy(Irp->UserBuffer,"OK!\n");
                        break;
                default:
                        break;
                }
                break;
        default:
                DbgPrint("未知请求包被调用\n");
                break;
        }

        nStatus = Irp->IoStatus.Status;

        IoCompleteRequest(Irp,IO_NO_INCREMENT);

        return nStatus;
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING theRegistryPath)
{
        //驱动入口函数
        NTSTATUS        ntStatus = STATUS_SUCCESS;
        UNICODE_STRING  ntDeviceName;
        UNICODE_STRING  DeviceLinkString;
        PDEVICE_OBJECT  deviceObject = NULL;

        DbgPrint("驱动程序加载...\n");

        RtlInitUnicodeString( &ntDeviceName, NT_DEVICE_NAME );

        ntStatus = IoCreateDevice(
                DriverObject,
                0,
                &ntDeviceName,
                FILE_DEVICE_UNKNOWN,
                0,
                FALSE,
                &deviceObject );

        if ( !NT_SUCCESS( ntStatus ) )
        {
                DbgPrint("无法创建驱动设备");
                return ntStatus;
        }

        RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME);
        ntStatus=IoCreateSymbolicLink(&DeviceLinkString,&ntDeviceName);

        if(!NT_SUCCESS(ntStatus))
        {
                return ntStatus;
        }

        DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchDeviceControl;
        DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchDeviceControl;
        DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
        DriverObject->DriverUnload = OnUnload;

        DbgPrint("驱动程序已经启动\n");

        DbgPrint("修改SSDT表...\n");

        //修改 ZwOpenProcess 函数地址
        OldZwOpenProcess =(ZWOPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess));
        (ZWOPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess)) = NewZwOpenProcess;

        DbgPrint("驱动程序加载完毕.\n");

        return STATUS_SUCCESS;
}

win2K测试通过
上传的附件:
2010-4-25 12:11
0
雪    币: 1753
活跃值: (840)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
17
R3层的交互就自己做吧~~`
2010-4-25 12:12
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
18
返回的错误号不优雅~~
2010-4-26 03:38
0
游客
登录 | 注册 方可回帖
返回
//