| 内存驱动暴力搜索 |
| 内存驱动暴力搜索 |
作者:佚名 文章来源:网络 点击数: 更新时间:2008-8-27 14:05:24  |
|
庆祝奥运会圆满成功,近日有些郁闷,来坛子上逛逛,放点血。
提到内存驱动的暴力搜索,大家想到最多的是搜索内存中的PE格式文件,同时比对某些特征来判断是否是sys文件,今天我放出来的这个,原理上和这个类似,但我搜的不是MZ,PE等,我是从0x00A80004开始搜索的,什么是0x00A80004? 看了代码你就知道了。
判断pe文件的合法性以及最后的处理函数就不用放了,提了一下思路,Ark就多了一种检测病毒的方法。
//////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// //2008.06.11 /* 通过搜索高端内存的驱动指针来查找内存中的驱动,基本上,是不可能有驱动能够在这种模式下隐藏的。
判断此处是否是一个Driver_Object结构,如果是,进一步判断DriverStart所指的内存是否是一个PE文件,如果是,那么他就是一个驱动程序的指针。 */
VOID SearchDriverByMemoryDriverObjectPointer(void) { DWORD *pMemoryStart = (DWORD *)0x80000000; DWORD *pMemoryEnd = (DWORD *)0xFFFFF000; DWORD *Begin; DWORD *End; int i = 0;
DWORD * DriverStart = NULL; DWORD Tail = 0;
PDRIVER_OBJECT pDriver; PLDR_DATA_TABLE_ENTRY pdte; ANSI_STRING aString; DRIVER_ARRAY da; PDRIVER_ARRAY pda = &da;
MxxPrint("Enter SearchDriverByMemoryDriverObjectPointer entry.");
for(pMemoryStart; pMemoryStart != pMemoryEnd; pMemoryStart += 1024) { //DbgPrint("%08x\n", pMemoryStart); //页面的提交以1k大小为单位,因此大循环以1k为步进长度,小循环以8为步进长度。缩短了运行时间。 if(MmIsAddressValid(pMemoryStart) == 0) continue;
End = pMemoryStart + 1024;
for(Begin = pMemoryStart; Begin != End; Begin += 2) {
//Type and Size if( *(DWORD *)Begin != 0x00A80004) continue;
//驱动的大小不能是0 if( *(DWORD *)((DWORD)Begin + 0x10) == 0) continue;
DriverStart = (DWORD *)(*(DWORD *)((DWORD)Begin + 0x0C)); if((DriverStart == NULL)|(DriverStart < (DWORD *)0x80000000)) continue; //驱动的内存文件在内存起始处都是以1000的倍数开头的,因此判断尾部是否是3个0,就能判断该地址是否合法 Tail = (DWORD)DriverStart << 20; if(Tail != 0) continue;
if(Check_PE_File(DriverStart) == FALSE) continue;
pDriver = (PDRIVER_OBJECT)Begin; pdte = (PLDR_DATA_TABLE_ENTRY)(pDriver->DriverSection);
if(pdte == NULL) continue;
RtlUnicodeStringToAnsiString(&aString, &pdte->FullDllName,TRUE);
pda->pDriver = pDriver; pda->DriverStart = pdte->DllBase; pda->DriverSize = pdte->SizeOfImage; pda->Flag = FLAG_LINK_MEMORY_DRIVER_POINTER; strcpy(pda->DriverName, aString.Buffer);
RtlFreeAnsiString(&aString);
//ProcessDriver(pda); } } } //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// |
|
| 文献录入:admin 责任编辑:admin |
|
上一篇文献: 感染网页文件的一个程序
下一篇文献: 没有了 |
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |