以前没做过,所以尝试一下,摸索中BSOD了N久, 今天终于有时间调试驱动,于是花了2个小时解决掉了.
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: 相关链接请参考这里: