核态获取PsLoadedModuleList地址的稳定方法
转载: https://blog.csdn.net/celestialwy/article/details/1261407
由于Windows 2003 Server SP1开始不再支持用户态访问Physical Memory,所以我这介绍一种在内核态获取PsLoadedModuleList地址的稳定方法。次方法已在Windows XP SP2和Windows 2003 SP1下测试通过。
代码如下:
typedef struct _LDR_DATA_TABLE_ENTRY {
LIST_ENTRY InLoadOrderLinks;
LIST_ENTRY InMemoryOrderLinks;
LIST_ENTRY InInitializationOrderLinks;
PVOID DllBase;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
USHORT LoadCount;
USHORT TlsIndex;
union {
LIST_ENTRY HashLinks;
struct {
PVOID SectionPointer;
ULONG CheckSum;
};
};
union {
struct {
ULONG TimeDateStamp;
};
struct {
PVOID LoadedImports;
};
};
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
extern PLIST_ENTRY g_PsLoadedModuleList ;
PLIST_ENTRY FindPsLoadedModuleList (IN PDRIVER_OBJECT DriverObject)
{
PLDR_DATA_TABLE_ENTRY pModuleCurrent = NULL;
PLDR_DATA_TABLE_ENTRY PsLoadedModuleList = NULL;
if (DriverObject == NULL)
return 0;
pModuleCurrent = *((PLDR_DATA_TABLE_ENTRY*)(DriverObject->DriverSection));
if (pModuleCurrent == NULL)
return 0;
PsLoadedModuleList = pModuleCurrent;
while ((PLDR_DATA_TABLE_ENTRY)pModuleCurrent->InLoadOrderLinks.Flink != PsLoadedModuleList)
{
if (((pModuleCurrent->SizeOfImage == 0x00000000)
&& (pModuleCurrent->FullDllName.Length == 0))
|| (pModuleCurrent->FullDllName.Buffer == NULL))
{
return (PLIST_ENTRY) pModuleCurrent;
}
pModuleCurrent = (PLDR_DATA_TABLE_ENTRY)pModuleCurrent->InLoadOrderLinks.Flink;
}
return NULL;
}
我在测试中发现了这样一个有趣的现象,在Windows 2003 Server SP1下PsLoadedModuleList满足((pModuleCurrent->SizeOfImage == 0x00000000)&& (pModuleCurrent->FullDllName.Length == 0))而在WindowXP SP2下PsLoadedModuleList满足(pModuleCurrent->FullDllName.Buffer == NULL)。
转载请注明出处!
jpg改rar
最新文章
- linux 纯字符界面显示中文
- 又爱又恨系列之枚举enum
- [转]解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离
- [C++] 几行代码生成漂亮图片,数学家就是牛!
- 如何写计算机会议的rebuttal
- A Simple Problem with Integers 多树状数组分割,区间修改,单点求职。 hdu 4267
- Mysql中查找并删除重复数据的方法
- 如何在linux中搭建JEECMS系统
- (转)如何在Excel2013中制作条形码
- Objective-C MRC多个对象相互引用的内存管理
- hdoj 1564 Play a game
- jQuery 事件 方法
- 构造NFS
- android 界面悬浮框实现
- 201521123107 《Java程序设计》第11周学习总结
- Linux转发性能评估与优化(转发瓶颈分析与解决方式)
- 从程序员的角度设计一个Java的神经网络
- Python 函数式编程和面向对象编程
- 关于Http协议,你必须要知道的
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器
热门文章
- .net core程序中使用微软的依赖注入框架
- ERROR: While executing gem … (Gem::RemoteFetcher::FetchError)
- Android 编程下 WebView 加载一个网页如何得到网页的 Cookie 值
- HTML5 background-color和background-image问题共用问题
- Spring Boot中CrudRepository与JpaRepository Dao中JpaRepository和JpaSpecificationExecutor查询
- escape()、encodeURI()、encodeURIComponent()区别详解 (转)
- Dictionary简洁
- 原创:vsphere概念深入系列三:vSphere命令行管理
- 〖Linux〗Kubuntu 14.04的Eclipse 崩溃解决方法总结
- 使用quicklz缩小程序体积