您的位置:首页 > 其它

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

2008-10-16 17:28 302 查看
以前没做过,所以尝试一下,摸索中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: 相关链接请参考这里:

VXK:有关驱动隐藏的一点事情
http://www.debugman.com/read.php?tid=1993&page=e&#a
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐