搜素隐藏驱动的一个BSOD问题

 

以前没做过,所以尝试一下,摸索中BSOD了N久, 今天终于有时间调试驱动,于是花了2个小时解决掉了.

细节问题总结下,以警示自己:
   1. 犯下了一个低级错误,导致在内存访问上出问题,在那个Lib封装函数中,把计数i调整成局部变量即可.
   2. 发IOCTL中,拷贝数据时分配的内存不够导致出现乱码
   3. 驱动中代码流程要明晰,容错处理要强大,以便即时发现出错代码,跟进调试

VOID
Thread_SearchHiddenSys (
     IN PVOID StartContext
     )
{
    ULONG i;
   
    // 初始化信息,分配内存
     g_Event_SearchHiddenSys = ExAllocatePool( NonPagedPool, sizeof(KEVENT) );
     g_Event_SearchHiddenSys_completed = ExAllocatePool( NonPagedPool, sizeof(KEVENT) );
     psudami = (PMODULE_INFOR)ExAllocatePoolWithTag( NonPagedPool, 300*sizeof(MODULE_INFOR),'suda' );

     KeInitializeEvent(g_Event_SearchHiddenSys, NotificationEvent, FALSE);
     KeInitializeEvent(g_Event_SearchHiddenSys_completed, NotificationEvent, FALSE);
    memset( (PVOID)psudami, 0, 150*sizeof(MODULE_INFOR) );


    // 若申请内存失败,则退出系统进程
    if ( !g_Event_SearchHiddenSys || !g_Event_SearchHiddenSys_completed /*|| !psudami*/ ) {

         ExFreePool( g_Event_SearchHiddenSys );     
         ExFreePool( g_Event_SearchHiddenSys_completed );

        if ( psudami ) {
             ExFreePool(psudami) ;
         }

         DbgPrint("SearchHidenSys - ExAllocatePool(g_Event_SearchHiddenSys) failed/n");
         PsTerminateSystemThread( STATUS_SUCCESS );
     }


    while (TRUE) {

        // 系统线程结束时要清理申请的内存
        if ( FALSE == g_bRepeat_SearchHiddenSys ) {
             DbgPrint("SearchHidenSys - Terminate Our Thread");

             ExFreePool( g_Event_SearchHiddenSys );
             ExFreePool( g_Event_SearchHiddenSys_completed );

            if ( psudami ) {
                 ExFreePool(psudami) ;
             }

             PsTerminateSystemThread( STATUS_SUCCESS );
         }

        // 循环一次,便重新设置EVENT为"未受信"状态.让线程等待激活
         KeClearEvent( g_Event_SearchHiddenSys );
         KeClearEvent( g_Event_SearchHiddenSys_completed );

    //     DbgPrint("SearchHidenSys - I'm Waiting.../n");
        // 等待事件,一直到"受信"状态
         KeWaitForSingleObject( g_Event_SearchHiddenSys, Executive,
             KernelMode, FALSE, NULL );

        if ( NULL == psudami ) {
             DbgPrint("SearchHidenSys - ExAllocatePoolWithTag Failed/n");
         } else {
            memset( (PVOID)psudami, 0, 300*sizeof(MODULE_INFOR) );
             SearchHidenSys( psudami, 0 ) ;

        //     DbgPrint("SearchHidenSys - Already done/n");
             KeSetEvent( g_Event_SearchHiddenSys_completed, 0, FALSE ); // 设置为“受信”状态,唤醒等待者
         }
     }
}

现在越来越喜欢把常用函数封装到Lib里面,再供其他模块频繁调用了,于是把这个小模块的功能封装成了LIB,我的头文件格式是这样写的,贴一下, 方便诸位参考,具体代码可参见Debugman上MJ发的搜索隐藏驱动的Demo,无壳无花,拖到IDA中就是code了,然后自己整合下,就可用于自己的程序啦:

#ifndef _MSKQ_H
#define _MSKQ_H 1

#include <ntddk.h>

#ifdef __cplusplus
extern "C" {
#endif


/

typedef struct _MODULE_INFOR {
  CHAR   ImageName[255] ;  // 模块全路径
  PVOID   Base ;            // 模块基址
  ULONG   Size ;            // 模块大小
  BOOL   bIsHiden ;        // 是否是隐藏模块
} MODULE_INFOR, *PMODULE_INFOR;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VOID SearchHidenSys(
   PMODULE_INFOR pModuleInfor,
  BOOL bPrintAll
   );
/*++

Author: sudami [sudami@163.com]
Time   : 2008/09/16 [16:9:2008 - 21:26]

Routine Description:
     lib调用接口,负责搜索内核空间,寻找尽可能多的PE特征,让你抹掉了也可以找到隐藏的驱动. 其他模块调用此函数时:

     // 调用语句
     PMODULE_INFOR psudami ;

     psudami = (PMODULE_INFOR)ExAllocatePoolWithTag(0,200*sizeof(MODULE_INFOR),'suda');
     if ( NULL == psudami ) {
       DbgPrint("SearchHidenSys - ExAllocatePoolWithTag Failed/n");
     } else {
       SearchHidenSys( psudami, TRUE ) ;
     }

       // 驱动卸载时必须释放申请的内存:
     if ( psudami ) {
       ExFreePool(psudami) ;
     }
  
   这个Lib主要把信息收集起来,其他模块调用完后,可传到R3,显示出来
    
Arguments:

     pModuleInfor - [IN][OUT] 传进来的结构体指针,负责存储模块信息(ImageName, Base, Size)

   bPrintAll - [IN] 是否打印出查找到的信息

Return Value:

--*/


/


#ifdef __cplusplus
}
#endif

#endif

///    END OF FILE    ///

另外,明天是自己入职某公司进行实习的第一天,该好好表现了...

----------------------------------------------

PS: 相关链接请参考这里:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值