博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【旧文章搬运】暴搜内存查找PE镜像
阅读量:5079 次
发布时间:2019-06-12

本文共 1666 字,大约阅读时间需要 5 分钟。

原文发表于百度空间,2008-7-28

==========================================================================

前面介绍了修改PEB中已加载模块的双链,来隐藏指定的模块.

不过要对付这样隐藏,一个暴力搜索内存就够了.

实现思路如下:

地址以一个页的大小为单位从0x00000000到0x7FFFFFFF遍历,检查是否具有PE特征.
页的大小可以通过GetSystemInfo()得到,结果在SYSTEM_INFO结构的DWORD dwPageSize一项中,通常是0x1000.遍历时,并不是所有地址都是可以访问的,我们还需要先得到该地址是否可以访问的信息,否则将会引发内存访问错误.获取该信息可以使用函数VirturlQuery(),在得到的MEMORY_BASIC_INFORMATION结构中有足够多的信息.
    MEMORY_BASIC_INFORMATION在WinNT.h中定义如下:

typedef struct _MEMORY_BASIC_INFORMATION {          PVOID BaseAddress;       // 区域基地址。            PVOID AllocationBase;    // 分配基地址。            DWORD AllocationProtect; // 区域被初次保留时赋予的保护属性。            SIZE_T RegionSize;       // 区域大小(以字节为计量单位)。            DWORD State;             // 状态(MEM_FREE、MEM_RESERVE或 MEM_COMMIT)。            DWORD Protect;           // 保护属性。            DWORD Type;              // 类型。        } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

其中的State指明了该地址所在页的状态,分为MEM_FREE,MEM_COMMIT和MEM_RESERVE三种情况.

仅当页状态为MEM_COMMIT时才可以访问,否则将引发访问错误.
然后就可以检验是否是PE文件了,这个通常检查MZ头和PE头即可.

实现代码如下:

void SearchMemoryForPE(void){IMAGE_DOS_HEADER *dhead;MEMORY_BASIC_INFORMATION mbi;DWORD StartAddr=0;for (;StartAddr<0x7FFF0000;StartAddr+=dwpagesize){   VirtualQuery((PVOID)StartAddr,&mbi,sizeof(MEMORY_BASIC_INFORMATION));   if (mbi.State==MEM_COMMIT)   {    if ((*(char*)StartAddr=='M')&&(*((char*)StartAddr+1)=='Z'))    {     dhead=(IMAGE_DOS_HEADER*)StartAddr;     if (!lstrcmp((char*)dhead+dhead->e_lfanew,"PE"))     {      printf("Found PE at 0x%08x!\n",StartAddr);     }        }   }}}

对付内核中的隐藏驱动也可以使用类似的方法,关键只在于验证地址是否可以访问.

不过对付这种暴力搜索,只需要抹去相应的特征,使检测者无法匹配即可~
附本例结果:

转载于:https://www.cnblogs.com/achillis/p/10179856.html

你可能感兴趣的文章
顶点缓存与索引缓存
查看>>
PHP中获取文件扩展名的N种方法(转)
查看>>
setInterval循环设置并传入不同的参数
查看>>
bzoj 1013: [JSOI2008]球形空间产生器sphere【高斯消元】
查看>>
virtualenv 虚拟环境
查看>>
数的长度 NYOJ 69
查看>>
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
查看>>
TreeSet和Hashde、equals
查看>>
CIO的能力
查看>>
oracle存储过程
查看>>
poj2236 基础并查集
查看>>
Python异常处理
查看>>
精耕平台路径
查看>>
浅谈编译过程和符号表重定位问题
查看>>
String和Date 互相转换
查看>>
通过“四大行为”对WCF的扩展[原理篇]
查看>>
.NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?
查看>>
linux内核SPI总线驱动分析(一)(转)
查看>>
ASP.NET Core 认证与授权[5]:初识授权
查看>>
Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段...
查看>>