搜素隐藏驱动的一个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=ea |
相关文章推荐
- ios6.1&ios7&ios9判断沙盒文件或者目录是否存在,以及判断是文件还是目录的一个隐藏问题
- iOS6.1 & iOS 7 & iOS8 判断沙盒文件或者目录是否存在,以及判断是文件还是目录的一个隐藏问题
- subsonic隐藏得很深的一个Bug以及另一个未解决的问题
- NavigationBar隐藏后 返回上一个界面黑框问题解决
- 又一个恶心的驱动的问题
- (2)int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
- MSSQL/SQLSERVER 2000 2005 2008 2008R2 jar包驱动问题 一个sqljdbc4.jar就OK了
- firefox浏览器下用getElementById取一个隐藏表单域内容时发现的问题
- MySQL的新版JDBC驱动(5.1.7)一个超级恶心的问题
- jtds驱动更新对一个老问题的解决。
- 调用手机数字键盘,QQ浏览器兼容性(输入一个数字,键盘就会隐藏的问题)
- 解决微信公众号页面的按返回键隐藏弹框,而不是跳回到上一个页面的问题
- 终于解决了一个动画的问题:setFillAfter(true)后不可以隐藏
- 关于table中一个隐藏的tr,改为显示后与其他tr样式不一样的问题
- 安装驱动时“此设备的一个安装程序此时无法执行安装”一系列问题
- 今天的问题:一个简单的例子,请帮我解开“接口实现Java‘隐藏实现细目’”的迷惑。
- 关于驱动--多块pci板卡识别的问题(收集到的一个资料)
- 摄像头驱动问题 由于设备驱动程序的前一个实例仍在内存中,Windows 无法加载这个硬件的设备驱动程
- STM32之SPI驱动液晶屏的一个问题
- 解决安装Intel各种驱动提示“安装程序未能安装一个或多个设备驱动程序”的问题