首页
论坛
专栏
课程

一个小型的用于监视进程产生和撤销驱动逆向分析

2007-1-22 13:13 7748

一个小型的用于监视进程产生和撤销驱动逆向分析

2007-1-22 13:13
7748
前两天,闪电狼兄给了一个Themida_1.0.0.5加壳的新版绝影凯旋vip1.65,
狼把它目录中一个驱动NTProcDrv.sys让偶分析分析,注意这不是Themida_1.0.0.5驱动,不过它也保护这Themida加壳的主程序.早前错认了!

由于偶是菜鸟加壳盲.只好"雾"里看花去捏裸笨的NTProcDrv.sys.

作者声明: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
由于我误解了狼兄错认它是Themida的驱动.错误改过来了!
谢谢7楼西裤兄,不过代码全部是自己逆地.

逆向一下:

1:设备对象自定义扩展结构体如下:
typedef struct _DeviceExtension {   
                 ULONG size;            //0x0                   
                 PHANDLE  EventHandle;  //0x04
                 PRKEVENT KernelEvent;   //+0x08
                 HANDLE ParentId;      //+0x0C
                 HANDLE ProcessId;    //+0x010
                 ULONG IsCreate;      //+0x014
                } NTProcDrvDeviceExtension;

2:IRP_MJ_DEVICE_CONTROL中是点关键东东.

3:IoCreateNotificationEvent 建立事件通知与下面的回调和exe交互

4:PsSetCreateProcessNotifyRoutine 进程事件回调

由于偶是菜鸟加壳盲,不敢碰Themida_1.0.0.5加壳的EXE.只好找软肋逆.
代码如下:

//////////////////////////////////////////////////////////////////////////////
//          *           NTProcDrv.sys              *      
//          *     be  reversed by qiweixue[BCG]    *
//          *    CopyRight:http:\\www.pediy.com    *     
/////////////////////////////////////////////////////////////////////////////

#include <ntddk.h>
#define NTProcDrv_IOCTL_METHOD_BUFFERED  0x22E000

typedef struct _DeviceExtension {   
                 ULONG size;            //0x0                   
                 PHANDLE  EventHandle;  //0x04
                 PRKEVENT KernelEvent;   //+0x08
                 HANDLE ParentId;      //+0x0C
                 HANDLE ProcessId;    //+0x010
                 ULONG IsCreate;      //+0x014
                } NTProcDrvDeviceExtension;  

               
VOID
NTProcDrvUnloadDriver(
    IN PDRIVER_OBJECT       DriverObject
    );
   
NTSTATUS   
NTProcDrvCreateClose(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );  
      
NTSTATUS
NTProcDeviceControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );
      
VOID
NTProcDrvNotifyRoutine (
    IN HANDLE  ParentId,
    IN HANDLE  ProcessId,
    IN BOOLEAN  Create
    );

UNICODE_STRING  DeviceNameString;   
UNICODE_STRING  LinkDeviceNameString;   
UNICODE_STRING  EventDeviceNameString;  
PDEVICE_OBJECT  GloalDeviceObject;

NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING RegistryPath
    )

{
       
        HANDLE  HEventHandle;
        PKEVENT PEnvent;
  PDEVICE_OBJECT  deviceObject = NULL;  
  NTSTATUS ntStatus;  
  NTProcDrvDeviceExtension            *DevExt=NULL;
  
  RtlInitUnicodeString( &DeviceNameString,    L"\\Device\\NTProcDrv" );
  RtlInitUnicodeString( &LinkDeviceNameString,L"\\DosDevices\\NTProcDrv");
  
  ntStatus = IoCreateDevice(
                DriverObject,
                sizeof(NTProcDrvDeviceExtension),                     
                &DeviceNameString,
                 FILE_DEVICE_UNKNOWN,
                 0,
                 FALSE,
                &deviceObject );

    if (!NT_SUCCESS( ntStatus ))
    {

        return ntStatus;
    }

   ntStatus = IoCreateSymbolicLink(
                (PUNICODE_STRING) &LinkDeviceNameString,
                (PUNICODE_STRING) &DeviceNameString
                );

   if (!NT_SUCCESS(ntStatus))
    {
        IoDeleteDevice(deviceObject);
        return ntStatus;
    }
     GloalDeviceObject=deviceObject;
    DriverObject->DriverUnload =NTProcDrvUnloadDriver;
   
    DriverObject->MajorFunction[IRP_MJ_CREATE] = NTProcDrvCreateClose;
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = NTProcDrvCreateClose;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = NTProcDeviceControl;   
   
    RtlInitUnicodeString(&EventDeviceNameString,L"\\BaseNamedObjects\\NTProcDrvProcessEvent");
   
    PEnvent=IoCreateNotificationEvent(
                          &EventDeviceNameString,
                          DevExt->EventHandle
                          );   
   DevExt=(NTProcDrvDeviceExtension*)(deviceObject->DeviceExtension);
   DevExt->KernelEvent=PEnvent;
   KeClearEvent(DevExt->KernelEvent);
   
   ntStatus= PsSetCreateProcessNotifyRoutine((PCREATE_PROCESS_NOTIFY_ROUTINE)NTProcDrvNotifyRoutine,0);
   
    return ntStatus;
}
  
  
void
NTProcDrvUnloadDriver(
    IN PDRIVER_OBJECT DriverObject
    )
{
    PDEVICE_OBJECT deviceObject = DriverObject->DeviceObject;
    IoDeleteSymbolicLink( &LinkDeviceNameString );  
    if ( deviceObject != NULL )
    {
        IoDeleteDevice( deviceObject );
    }
}

NTSTATUS
NTProcDrvCreateClose(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )   
{
    Irp->IoStatus.Status = STATUS_SUCCESS;   
    Irp->IoStatus.Information = 0;  
    IoCompleteRequest( Irp, IO_NO_INCREMENT );
    return STATUS_SUCCESS;
}

NTSTATUS
NTProcDeviceControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{   
       
          NTSTATUS  ntStatus;
          ULONG   IoCtlCode;
    PIO_STACK_LOCATION  IrpStack;
    ULONG               inBufLength;
    ULONG               outBufLength;
    PVOID               InOutBuf;
    NTProcDrvDeviceExtension            *DevExt=NULL;
  
    ntStatus=STATUS_UNSUCCESSFUL;
    IrpStack = IoGetCurrentIrpStackLocation(Irp);//+60
    outBufLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;//+4
    inBufLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;//+8
    IoCtlCode =IrpStack->Parameters.DeviceIoControl.IoControlCode; //C
    InOutBuf = Irp->AssociatedIrp.SystemBuffer;   
    switch(IoCtlCode)
    {
          
           case NTProcDrv_IOCTL_METHOD_BUFFERED:
  
                     if(outBufLength<0x0C)break;  
                     DevExt=(NTProcDrvDeviceExtension*)DeviceObject->DeviceExtension;
                    *((PLONG)InOutBuf)=(ULONG) (DevExt->ParentId);
                    *((PLONG)InOutBuf+1)=(ULONG)(DevExt->ProcessId);
                    *((PLONG)InOutBuf+2)=(char)(DevExt->IsCreate);
                     ntStatus=STATUS_SUCCESS;
           break;
       
  default:
                   Irp->IoStatus.Status = ntStatus;  
                   if(!NT_SUCCESS(ntStatus))
                           {
                                   Irp->IoStatus.Information = outBufLength;       
                           }                
           Irp->IoStatus.Information = outBufLength;                                 
   }
  
   IofCompleteRequest(Irp,IO_NO_INCREMENT);
   
   return ntStatus;
}
   
void
NTProcDrvNotifyRoutine (
    IN HANDLE  ParentId,
    IN HANDLE  ProcessId,
    IN BOOLEAN  Create
    )
{

        PDEVICE_OBJECT  deviceObject=NULL;
        NTProcDrvDeviceExtension  *DevExt=NULL;
        deviceObject=GloalDeviceObject;
  DevExt=deviceObject->DeviceExtension;  
        DevExt->ParentId=ParentId;
        DevExt->ProcessId=ProcessId;
        DevExt->IsCreate=(char)Create;
        KeSetEvent(DevExt->KernelEvent,0,0);
        KeClearEvent(DevExt->KernelEvent);
        return ;
}
           
欢迎找bug.idb文件.c文件,源驱动都在这里
http://www.live-share.com/files/142696/NTProcDrv_sys_c.rar.html
--------------------------------------------------------
我是阿赖耶识

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (15)
LOCKLOSE 2 2007-1-22 13:19
2
0
完全不懂.学习学习..支持七七捏.
qiweixue 19 2007-1-22 13:19
3
0
谢谢,老大.这是偶第一篇在脱壳区的精华文章.
真惭愧.偶是灌水来的

抱歉!附件等论坛稳定在传上来!!!
KuNgBiM 66 2007-1-22 13:21
4
0
完全不懂,支持七七,支持小胃同学
sbright 2 2007-1-22 13:22
5
0
评精速度真快卡,支持...只能看花了....
kanxue 8 2007-1-22 13:24
6
0
qiweixue 太谦虚了。
加点注释就好了
xIkUg 9 2007-1-22 13:33
7
0
这个不是themida的驱动吧。。。这是监视进程创建与终止的。。。

网上有源代码
qiweixue 19 2007-1-22 13:41
8
0
最初由 xIkUg 发布
这个不是themida的驱动吧。。。这是监视进程创建与终止的。。。

网上有源代码


西裤...
这是闪电狼给我的具体我也不知道.themida壳真不懂的说.
偶扎说这么弱!就让偶菜鸟分析出来捏!这个驱动也保护的它的Exe!

我问问闪电狼兄.

有源代码不早说,害我命苦!!!

是谁的驱动不在呼,学习一下.
本来就是""里看花么!
cxlrb 5 2007-1-22 13:47
9
0
支持,我是水中望月!
xIkUg 9 2007-1-22 14:03
10
0
呵呵。。。谁知道你搞这个呀。。。
干之前先google
qiweixue 19 2007-1-22 14:21
11
0
最初由 kanxue 发布
qiweixue 太谦虚了。
加点注释就好了


老大.等论坛稳定我传上附件,里边的idb很详细的.
最好能有DDK文档或MSDN2003对着看看.
hawking 12 2007-1-22 17:30
12
0
好好向楼主学习。
luocong 9 2007-1-23 22:13
13
0
     case NTProcDrv_IOCTL_METHOD_BUFFERED:
  
         if(outBufLength<0x0C)break;  
         DevExt=(NTProcDrvDeviceExtension*)DeviceObject->DeviceExtension;
        *((PLONG)InOutBuf)=(ULONG) (DevExt->ParentId);
        *((PLONG)InOutBuf+1)=(ULONG)(DevExt->ProcessId);
        *((PLONG)InOutBuf+2)=(char)(DevExt->IsCreate);
         ntStatus=STATUS_SUCCESS;
     break;


这个case里貌似没有对Irp->IoStatus.Status和Irp->IoStatus.Information赋值哦,尤其是Information没有赋值,ring3能拿到正确的结构的话难道是传说中的运气?
xIkUg 9 2007-1-23 23:02
14
0
只要他的InOutBuf有足够的空间就是安全的,可以不对Irp->IoStatus.Status和Irp->IoStatus.Information赋值(size是固定的)
qiweixue 19 2007-1-24 08:32
15
0
谢谢老罗!!!
把上边的break;去掉再把//default:注释掉就可以.粗心一下!
       Irp->IoStatus.Status = ntStatus;  
       if(!NT_SUCCESS(ntStatus))
         {
           Irp->IoStatus.Information = outBufLength;  
         }     
     Irp->IoStatus.Information = outBufLength;  
dacui 2007-1-26 07:38
16
0
怎样进行逆向工程,楼上的老大能不能解释一下,或给点参考资料,小弟谢了
游客
登录 | 注册 方可回帖
返回