【旧文章搬运】暴搜内存查找PE镜像
原文发表于百度空间,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=;
for (;StartAddr<0x7FFF0000;StartAddr+=dwpagesize)
{
VirtualQuery((PVOID)StartAddr,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
if (mbi.State==MEM_COMMIT)
{
if ((*(char*)StartAddr=='M')&&(*((char*)StartAddr+)=='Z'))
{
dhead=(IMAGE_DOS_HEADER*)StartAddr;
if (!lstrcmp((char*)dhead+dhead->e_lfanew,"PE"))
{
printf("Found PE at 0x%08x!\n",StartAddr);
} }
}
}
}
对付内核中的隐藏驱动也可以使用类似的方法,关键只在于验证地址是否可以访问.
不过对付这种暴力搜索,只需要抹去相应的特征,使检测者无法匹配即可~
附本例结果:

【旧文章搬运】暴搜内存查找PE镜像的更多相关文章
- 【旧文章搬运】Idle进程相关的一些东西
原文发表于百度空间,2009-05-13========================================================================== Idle进 ...
- 【旧文章搬运】PE重定位表学习手记
原文发表于百度空间,2008-11-02========================================================================== 先定义一下 ...
- 【旧文章搬运】PE感染逆向之修复(Serverx.exe专杀工具出炉手记)
原文发表于百度空间,2008-10-4看雪论坛发表地址:https://bbs.pediy.com/thread-73948.htm================================== ...
- 【旧文章搬运】加载PE文件时IAT的填充时机
原文发表于百度空间,2011-06-20========================================================================== 大致过程如 ...
- 【旧文章搬运】《从PEB获取内存中模块列表》的补充
原文发表于百度空间,2008-7-26========================================================================== 继续研究PE ...
- 【旧文章搬运】从PEB获取内存中模块列表
原文发表于百度空间,2008-7-25========================================================================== PEB中的L ...
- 【旧文章搬运】再谈隐藏进程中的DLL模块
原文发表于百度空间,2009-09-17========================================================================== 相当老的话 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(四)---VirtualKD内核调试加速工具
原文发表于百度空间,2009-01-09========================================================================== 今天又想起 ...
- 【旧文章搬运】深入分析Win7的对象引用跟踪机制
原文发表于百度空间及看雪论坛,2010-09-12 看雪论坛地址:https://bbs.pediy.com/thread-120296.htm============================ ...
随机推荐
- 《Java虚拟机原理图解》1.4 class文件中的字段表集合--field字段在class文件中是怎样组织的
0.前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述 ...
- IntelliJ IDEA删除项目
删除项目一向比较奇葩,因为当你点击到该项目名称右键时,并没有delete选项,导致我们不知道怎么删除,查找多方文档,得到以下解决: 1.将鼠标移到要删除的项目名称上,单击并按“Delete”按钮删除项 ...
- MD5进行文件完整性校验的操作方法
我组产品包含大量音频和图片资源,MD5主要就用来检测这些资源文件的完整性.主要思路是:先计算出所有资源文件的MD5值,存到一个xml文件中,作为标准的MD5值.然后把这个xml文件放到我们的产品中,每 ...
- iOS 内存管理实践
内存管理实践 尽管基本的概念在内存管理策略文章中简单得阐述了,但是还有一些实用的步骤让你更容易管理内存:有助于确保你的程序最大限度地减少资源需求的同时,保持可靠和强大. 使用“访问器方法”让内存管理更 ...
- 在Ubuntu 10.10下安装JDK配置Eclipse及Tomcat
1.安装JDK 1.1.到官网下载相关的JDK 这里下载的是 jdk-6u23-linux-i586.bin. 下载地址:http://www.oracle.com/technetwork/java/ ...
- uwsgi 热启动
uwsgi文件每次启动都要kill进程,这样非常麻烦,理想的情况是须要改动文件就自己主动生效,经查阅资料.发现uwsgi是自带该功能的,该功能的配置节例如以下 <uwsgi> <py ...
- 生活娱乐 360安全卫士和QQ大战
360安全卫士指控QQ侵犯用户隐私 [提要]9月26日晚上11点16分,安全软件商360在他们的论坛中发布了最新公告:<360安全卫士发布隐私保护器 专门曝光"窥私"软件&g ...
- iOS设计模式 - (3)简单工厂模式
iOS设计模式 - (3)简单工厂模式 by Colin丶 转载请注明出处: http://blog.csdn.net/hitwhylz/article/ ...
- 面向对象五大原则_1.单一职责原则&2.里氏替换原则
单一职责原则:Single Responsibility Principle (SRP) 一个类.仅仅有一个引起它变化的原因.应该仅仅有一个职责.每个职责都是变化的一个轴线.假设一个类有一个以上的职责 ...
- linux led子系统(一)
就像学编程第一个范例helloworld一样,学嵌入式,单片机.fpga之类的第一个范例就是点亮一盏灯.对于庞大的linux系统,当然可以编写一个字符设备驱动来实现我们需要的led灯,也可以直接利用g ...