首页
社区
课程
招聘
内存驱动暴力搜索
发表于: 2008-8-25 12:59 9075

内存驱动暴力搜索

2008-8-25 12:59
9075
庆祝奥运会圆满成功,近日有些郁闷,来坛子上逛逛,放点血。

提到内存驱动的暴力搜索,大家想到最多的是搜索内存中的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);
    }
  }
}
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
学习。~~~
2008-8-25 13:46
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
占位学习
2008-8-25 20:51
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
忍不住了,出来透口气.
强人.
2008-8-25 20:58
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
5
很简洁,强大!学习了!
有个问题,为什么驱动的内存文件在内存起始处都是以1000的倍数开头的啊?
2008-8-25 22:26
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6


留下来学习一下。
2008-8-25 22:46
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这是我通过观察得到的啊,微软这样做我觉得是为了提高驱动加载及运行的速度,尾数是1000的倍数,运行会更快吧。类似于结构中的数据对齐?
2008-8-26 09:32
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
8
强大的观察力~~学习了。
不知道能不能改动驱动加载的位置
2008-8-26 12:07
0
雪    币: 147
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
LZ讲得这么隐讳干什么。。。。。
lkd> dt _driver_object 0x824738e0
nt!_DRIVER_OBJECT
   +0x000 Type             : 4
   +0x002 Size             : 168

这个0x002 Size             : 168
是什么大小,为什么是固定的呢?
2008-8-28 16:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
占坑
学习。。
thx
2008-8-28 19:08
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
//页面的提交以1k大小为单位,因此大循环以1k为步进长度,小循环以8为步进长度。缩短了运行时间。

PAGE_SIZE是0x1000  不是1000.  所以PAGE_SIZE是4KB而不是1KB。

至于位数是1000的倍数那也是为了按照页面对齐

btw:不算新方法了。现在驱动隐藏基本都是要抹特征码的。
2008-8-28 21:47
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
还是炉子兄牛,学习了。
2008-8-29 09:55
0
雪    币: 187
活跃值: (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
留个记号先。学习了。
2008-8-29 17:12
0
游客
登录 | 注册 方可回帖
返回
//