HanDs
管理员

[Visual Studio文章] 内存驱动暴力搜索 



庆祝奥运会圆满成功,近日有些郁闷,来坛子上逛逛,放点血。

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



学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
内存 驱动 暴力 搜索
#1楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:0
游客组
快速回复