原文发表于百度空间,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镜像的更多相关文章

  1. 【旧文章搬运】Idle进程相关的一些东西

    原文发表于百度空间,2009-05-13========================================================================== Idle进 ...

  2. 【旧文章搬运】PE重定位表学习手记

    原文发表于百度空间,2008-11-02========================================================================== 先定义一下 ...

  3. 【旧文章搬运】PE感染逆向之修复(Serverx.exe专杀工具出炉手记)

    原文发表于百度空间,2008-10-4看雪论坛发表地址:https://bbs.pediy.com/thread-73948.htm================================== ...

  4. 【旧文章搬运】加载PE文件时IAT的填充时机

    原文发表于百度空间,2011-06-20========================================================================== 大致过程如 ...

  5. 【旧文章搬运】《从PEB获取内存中模块列表》的补充

    原文发表于百度空间,2008-7-26========================================================================== 继续研究PE ...

  6. 【旧文章搬运】从PEB获取内存中模块列表

    原文发表于百度空间,2008-7-25========================================================================== PEB中的L ...

  7. 【旧文章搬运】再谈隐藏进程中的DLL模块

    原文发表于百度空间,2009-09-17========================================================================== 相当老的话 ...

  8. 【旧文章搬运】Windbg+Vmware驱动调试入门(四)---VirtualKD内核调试加速工具

    原文发表于百度空间,2009-01-09========================================================================== 今天又想起 ...

  9. 【旧文章搬运】深入分析Win7的对象引用跟踪机制

    原文发表于百度空间及看雪论坛,2010-09-12 看雪论坛地址:https://bbs.pediy.com/thread-120296.htm============================ ...

随机推荐

  1. Nginx负载均衡配置实例(转)

    1.轮询 轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器.配置的例子如下: http{ upstream sampleapp { serv ...

  2. binary-tree-preorder-traversal——前序遍历

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  3. groovy入门 第05章 基本输入输出

    基本输入输出 5.1基本输出 print XXX    //同一行输出 println XXX //换行输出 输出字符串: def message ="My name is Michael& ...

  4. OpenStack源码系列---nova-compute

    nova-compute运行的节点为计算节点,虚拟机运行于计算节点上.例如对于创建虚拟机请求,nova-api接收到客户端请求后,经过nova-scheduler调度器调度,再将请求发送给某个选定的n ...

  5. 性能问题案例02——sybase连接堵塞问题

    现象:近期现场反馈一个问题.系统在审批的时候,常常卡死.整个系统全然用不了,浏览器訪问处于loading的状态. 排查: 1.一般系统挂了首先想到内存问题,可是现象是loading,也就是说没有挂,线 ...

  6. 5. TCP客户/服务器程序示例

    signal 信号是一种软件中断,异步发生,在进程运行的时候随时可能发生.信号可以: 由一个进程发给另一个进程,或发给自身 由内核发给某个进程 信号的action: signal handler,在信 ...

  7. gRPC错误码 http状态码 provide your APIs in both gRPC and RESTful style at the same time

    How gRPC error codes map to HTTP status codes in the response https://github.com/grpc-ecosystem/grpc ...

  8. Pattern: Microservice Architecture

    Microservice Architecture pattern http://microservices.io/patterns/microservices.html Context You ar ...

  9. Record is locked by another user

    Oracle修改表中记录时出现record is locked by another user的问题 在操作表时没有commit,导致表被锁,只要执行下面两行语句,就可以了将行锁解锁了. Select ...

  10. java 监听文件或者文件夹变化的几种方式

    1.log4j的实现的文件内容变化监听 package com.jp.filemonitor; import org.apache.log4j.helpers.FileWatchdog; public ...