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

PEB中的Ldr部分包含有当前进程所加载的模块信息.
lkd> dt _peb
ntdll!_PEB
   +0x000 InheritedAddressSpace : UChar
   +0x001 ReadImageFileExecOptions : UChar
   +0x002 BeingDebugged    : UChar
   +0x003 SpareBool        : UChar
   +0x004 Mutant           : Ptr32 Void
   +0x008 ImageBaseAddress : Ptr32 Void
   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA
.....
其结构定义如下:

typedef struct _PEB_LDR_DATA
{
ULONG Length;
BOOLEAN Initialized;
PVOID SsHandle;
LIST_ENTRY InLoadOrderModuleList; //按加载顺序
LIST_ENTRY InMemoryOrderModuleList; //按内存顺序
LIST_ENTRY InInitializationOrderModuleList; //按初始化顺序
} PEB_LDR_DATA,*PPEB_LDR_DATA;

另一个重要结构就是存储每个模块信息的LDR_MODULE部分,其定义如下:

typedef struct _LDR_MODULE
{
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
void* BaseAddress;
void* EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
SHORT LoadCount;
SHORT TlsIndex;
HANDLE SectionHandle;
ULONG CheckSum;
ULONG TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;

这两者的关系呢,引用别人的两张图来说明一下吧,看了图应该一目了然.

第二张图太大了,放个缩略图吧.
结构搞清楚之后,要遍历就很简单了,主要就是遍历一个双向环状链表.

PEB_LDR_DATA *pPEBLDR;
LDR_MODULE *pLdrMod;
LIST_ENTRY *pListEntry,*pStart;
void *p,*BaseAddress,*FullDllName;
_asm
{
mov eax,fs:[0x30] //TEB->PEB
mov eax,[eax+0xC] //PEB->Ldr
mov pPEBLDR,eax
}
printf("PEB_LDR_DATA:0x%08x\n",pPEBLDR);
printf("LDR->Length:0x%08x\n",pPEBLDR->Length);
printf("LDR->InLoadOrderModuleList:\t\t0x%08x\n",pPEBLDR->InLoadOrderModuleList);
printf("LDR->InMemoryOrderModuleList:\t\t0x%08x\n",pPEBLDR->InMemoryOrderModuleList);
printf("LDR->InInitializationOrderModuleList:\t0x%08x\n",pPEBLDR->InInitializationOrderModuleList);
//遍历双链表
pListEntry=(LIST_ENTRY*)(PUCHAR)&(pPEBLDR->InLoadOrderModuleList);
pStart=pListEntry;
printf("BaseAddress\t\tFullDllName\n====================================\n");
do
{
pListEntry=pListEntry->Flink;
pLdrMod=(LDR_MODULE*)pListEntry;
printf("0x%08x\t\t",pLdrMod->BaseAddress);
wprintf(L"%s\n",pLdrMod->FullDllName.Buffer); } while(pListEntry!=pStart);

效果图:

【旧文章搬运】从PEB获取内存中模块列表的更多相关文章

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

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

  2. 【旧文章搬运】暴搜内存查找PE镜像

    原文发表于百度空间,2008-7-28========================================================================== 前面介绍了修 ...

  3. 【旧文章搬运】改PEB中的映像路径可以这样~

    原文发表于百度空间,2008-7-26========================================================================== 用常用的几个 ...

  4. 【旧文章搬运】KeUserModeCallback用法详解

    原文发表于百度空间及看雪论坛,2010-01-10 看雪论坛地址:https://bbs.pediy.com/thread-104918.htm  代码及附件可到这里下载=============== ...

  5. 【旧文章搬运】无Device的驱动如何通信

    原文发表于百度空间,2009-07-14========================================================================== 标准的驱动 ...

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

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

  7. 【旧文章搬运】CsrssWalker学习笔记

    原文发表于百度空间及看雪论坛,2009-05-13 看雪论坛地址:https://bbs.pediy.com/thread-89708.htm============================= ...

  8. [工具类]获取url中参数列表

    写在前面 在项目中经常用到解析url中参数的逻辑,今天先下载就自己封装了一个方法,方便以后使用的时候,信手拈来.当然这里给出的方法是针对常见的url参数类型的,对于重写url,或者路由格式的不考虑. ...

  9. 【旧文章搬运】获取并修改PEB中的映像路径,命令行和当前目录

    原文发表于百度空间,2008-7-24 当时对UNICODE_STRING的使用还有点问题,导致最终效果图中字符串被截断了======================================= ...

随机推荐

  1. Java中Class.this和this的区别(转)

    当inner class(内部类)必顺使用到outer class(外部类)的this instance(实例)时,或者匿名内部类要使用外部类的实例. 例: class Outer{ String d ...

  2. BS版代码生成器 简介

    自用的代码生成器 核心:JdbcTemplate+freemarker 目前支持sqlserver和mysql 演示: 1.首界面 2.读数据库中的所有表 3.打开某数据库下的所有表.视图.存储过程 ...

  3. Maven学习在Elipse中发布一个Maven项目到Tomcat

    原文:http://www.cnblogs.com/quanyongan/archive/2013/04/26/3044618.html 对于maven初学者的我,经常遇到一个问题就是,maven项目 ...

  4. 王立平--GUI与GUILayout的差别

    GUI.Button (new Rect(0,0,5,5,"哈哈"); GUILayout.Button ("heheh"); 1.以上代码都是现实一个butt ...

  5. jQuery的ajax,当async为false时,同步操作失败。解决方式

    引发失败时代码: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POS ...

  6. Git多账号登陆

        最近工作上遇到了使用git+repo的情况,需要用公司的邮箱和账号名重新申请ssh公私密钥,而我本身在github上也有一些开源项目,这里就是记录一下我是如何实现git多账号登陆的.   取消 ...

  7. Office转SWF的一些感想(Office2007和Office2010)

    Office2007需要借助SaveAsPDFandXPS的插件完成,Office2010可以直接兼容. Office2PDF主要采用的是 Microsoft.Office.Interop的方式进行, ...

  8. Effective C++ 条款四 确定对象被使用前已被初始化

    1.对于某些array不保证其内容被初始化,而vector(来自STL)却有此保证. 2.永远在使用对象前初始化.对于无任何成员的内置类型,必须手工完成.      int x = 0;      c ...

  9. centos安装时各个版本的含义

    Desktop :基本的桌面系统,包括常用的桌面软件,如文档查看工具.Minimal Desktop :基本的桌面系统,包含的软件更少.Minimal :基本的系统,不含有任何可选的软件包.Basic ...

  10. jquery 深入学习笔记之中的一个 (事件绑定)

    [jquery 事件绑定] 1.加入元素事件绑定 (1) 加入事件为当前元素 $('p').on('click',function(){ //code here ... }); (2) 加入事件为未来 ...