同学问过我进程体中EPROCESS的三条链断了怎么枚举模块,这也是也腾讯面试题。我当时听到也是懵逼的。

后来在网上看到了一些内存暴力枚举的方法ZwQueryVirtualMemory。

函数原型是

NTSTATUS NtQueryVirtualMemory(HANDLE ProcessHandle, //目标进程句柄

PVOID BaseAddress, //查询的基址 MEMORY_INFORMATION_CLASS MemoryInformationClass, //枚举宏 PVOID MemoryInformation, //接收信息的结构体 SIZE_T MemoryInformationLength, //缓冲区大小 PSIZE_T ReturnLength); //返回实际长度

//枚举宏

typedef enum _MEMORY_INFORMATION_CLASS {

MemoryBasicInformation,

MemoryWorkingSetList,

MemorySectionName,

MemoryBasicVlmInformation

} MEMORY_INFORMATION_CLASS;

R0通过遍历SSDT获得函数地址。

我们要枚举进程模块信息, 需要用到两类内存信息MemoryBasicInformation和MemorySectionName,

MemoryBasicInformation的缓冲结构体

typedef struct_MEMORY_BASIC_INFORMATION {

PVOID BaseAddress;//查询内存块所占的第一个页面基地址

PVOID AllocationBase; //内存块所占的第一块区域基地址,小于等于BaseAddress,

DWORD AllocationProtect; //区域被初次保留时赋予的保护属性

SIZE_T RegionSize; //从BaseAddress开始,具有相同属性的页面的大小,

DWORD State; //页面的状态,有三种可能值MEM_COMMIT、MEM_FREE和MEM_RESERVE

DWORD Protect; //页面的属性,其可能的取值与AllocationProtect相同

DWORD Type; //该内存块的类型,有三种可能值:MEM_IMAGE、MEM_MAPPED和MEM_PRIVATE

} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

MemorySectionName的缓冲结构体为

//MemorySectionName

typedef struct_MEMORY_SECTION_NAME {

UNICODE_STRING Name;

WCHAR Buffer[260];

}MEMORY_SECTION_NAME,*PMEMORY_SECTION_NAME;

前者返回内存的基本信息, 比如: 内存区的基址,大小以及页面的各种属性等等, 而后者则返回内存段的名字,

也就是我们所要找的模块名.

利用前者我们可以过滤出类型为MEM_IMAGE的内存段并得到内存段的基址和属性, 利用后者我们可以得到模块名.

此时的模块名是NT Path需要转成Dos Path,代码如下

BOOLEAN NtPathToDosPathW(WCHAR* wzFullNtPath,WCHAR*wzFullDosPath);externNTSTATUS

NTAPI

ZwQueryDirectoryObject (

__in HANDLE DirectoryHandle,

__out_bcount_opt(Length) PVOID Buffer,

__in ULONG Length,

__in BOOLEAN ReturnSingleEntry,

__in BOOLEAN RestartScan,

__inout PULONG Context,

__out_opt PULONG ReturnLength

);

typedefstruct_OBJECT_DIRECTORY_INFORMATION

{

UNICODE_STRING Name;

UNICODE_STRING TypeName;

} OBJECT_DIRECTORY_INFORMATION,*POBJECT_DIRECTORY_INFORMATION;

ULONG

NtQueryDosDevice(WCHAR* wzDosDevice,WCHAR*wzNtDevice,

ULONG ucchMax);

BOOLEAN NtPathToDosPathW(WCHAR* wzFullNtPath,WCHAR*wzFullDosPath)

{

WCHAR wzDosDevice[4] = {0};

WCHAR wzNtDevice[64] = {0};

WCHAR*RetStr =NULL;

size_t NtDeviceLen= 0;short i = 0;if(!wzFullNtPath||!wzFullDosPath)

{returnFALSE;

}for(i=65;i<26+65;i++)

{

wzDosDevice[0] =i;

wzDosDevice[1] = L‘:‘;if(NtQueryDosDevice(wzDosDevice,wzNtDevice,64))

{if(wzNtDevice)

{

NtDeviceLen=wcslen(wzNtDevice);if(!_wcsnicmp(wzNtDevice,wzFullNtPath,NtDeviceLen))

{

wcscpy(wzFullDosPath,wzDosDevice);

wcscat(wzFullDosPath,wzFullNtPath+NtDeviceLen);returnTRUE;

}

}

}

}

}

ULONG

NtQueryDosDevice(WCHAR* wzDosDevice,WCHAR*wzNtDevice,

ULONG ucchMax)

{

NTSTATUS Status;

POBJECT_DIRECTORY_INFORMATION ObjectDirectoryInfor;

OBJECT_ATTRIBUTES oa;

UNICODE_STRING uniString;

HANDLE hDirectory;

HANDLE hDevice;

ULONG ulReturnLength;

ULONG ulNameLength;

ULONG ulLength;

ULONG Context;

BOOLEAN bRestartScan;

WCHAR* Ptr =NULL;

UCHAR szBuffer[512] = {0};

RtlInitUnicodeString (&uniString,L"\\??");

InitializeObjectAttributes(&oa,&uniString,

OBJ_CASE_INSENSITIVE,

NULL,

NULL);

Status= ZwOpenDirectoryObject(&hDirectory,DIRECTORY_QUERY,&oa);if(!NT_SUCCESS(Status))

{return 0;

}

ulLength= 0;if (wzDosDevice !=NULL)

{

RtlInitUnicodeString (&uniString,(PWSTR)wzDosDevice);

InitializeObjectAttributes(&oa,&uniString,OBJ_CASE_INSENSITIVE,hDirectory,NULL);

Status= ZwOpenSymbolicLinkObject(&hDevice,GENERIC_READ,&oa);if(!NT_SUCCESS (Status))

{

ZwClose(hDirectory);return 0;

}

uniString.Length= 0;

uniString.MaximumLength= (USHORT)ucchMax * sizeof(WCHAR);

uniString.Buffer=wzNtDevice;

ulReturnLength= 0;

Status= ZwQuerySymbolicLinkObject (hDevice,&uniString,&ulReturnLength);

ZwClose(hDevice);

ZwClose(hDirectory);if (!NT_SUCCESS (Status))

{return 0;

}

ulLength= uniString.Length / sizeof(WCHAR);if (ulLength

{

wzNtDevice[ulLength]=UNICODE_NULL;

ulLength++;

}else{return 0;

}

}else{

bRestartScan=TRUE;

Context= 0;

Ptr=wzNtDevice;

ObjectDirectoryInfor=(POBJECT_DIRECTORY_INFORMATION)szBuffer;while(TRUE)

{

Status= ZwQueryDirectoryObject(hDirectory,szBuffer,sizeof (szBuffer),TRUE,bRestartScan,&Context,&ulReturnLength);if(!NT_SUCCESS(Status))

{if (Status ==STATUS_NO_MORE_ENTRIES)

{*Ptr =UNICODE_NULL;

ulLength++;

Status=STATUS_SUCCESS;

}else{

ulLength= 0;

}break;

}if (!wcscmp (ObjectDirectoryInfor->TypeName.Buffer, L"SymbolicLink"))

{

ulNameLength= ObjectDirectoryInfor->Name.Length / sizeof(WCHAR);if (ulLength + ulNameLength + 1 >=ucchMax)

{

ulLength= 0;break;

}

memcpy(Ptr,ObjectDirectoryInfor->Name.Buffer,ObjectDirectoryInfor->Name.Length);

Ptr+=ulNameLength;

ulLength+=ulNameLength;*Ptr =UNICODE_NULL;

Ptr++;

ulLength++;

}

bRestartScan=FALSE;

}

ZwClose(hDirectory);

}returnulLength;

}

网上都有代码我就不贴了,发个帖记录一下学习

这是别人的代码链接

http://www.cnblogs.com/kedebug/archive/2010/12/22/2791753.html

html页面枚举 暴力,暴力枚举进程模块(示例代码)相关推荐

  1. hc sr04流程图_HC-SR04超声模块示例代码/原理图/说明书等全套资料

    本设计分享的是HC-SR04超声模块实例代码/原理图/说明书等全套资料.HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm:该HC-SR04超声模块包括 ...

  2. html自动缩放不出现滚动条,HTML页面缩小后显示滚动条的示例代码

    这里记录一下如何使得HTML页面缩小之后,底部出现滚动条,使得可以通过滚动滚动条来浏览由于界面缩小而被掩盖的地方. 说一下这样做的好处. 首先,一般界面缩小之后不出现滚动条,用户就不能访问被隐藏的地方 ...

  3. php怎么实现打印预览,JavaScript_js实现局部页面打印预览原理及示例代码,最近有朋友问js 如何打印预览 - phpStudy...

    js实现局部页面打印预览原理及示例代码 最近有朋友问js 如何打印预览,今天就来讲解一下,首先了解一下打印原理,其实局部打印页面很简单.就是把你需要打印的部分做一个起始标记,至于标记如何写,随便你写什 ...

  4. html页面在微信分享php,详解html静态页面实现微信分享思路的示例代码分析

    微信分享网页的时候,希望分享出来的链接是标题+描述+缩略图,微信开发代码示例里已提供了方法,但只适用于动态页面.由于dedecms是生成了静态文件,其实我想使用ajax获取jssdk参数也能也能实现微 ...

  5. python精灵模块示例代码

    精灵 模块是一个基于pygame的游戏模块,可以让我们使用python时轻松实现动画效果和游戏,下面给出一些例子: 背景化身弹球.rar: https://url18.ctfile.com/f/771 ...

  6. html流星雨页面,纯CSS流星雨背景的示例代码

    插件预览图 使用教程代码展示 vue页面使用 Style .space { width: 100%; height: 100vh; background: #121212; } .planet { w ...

  7. android+xposed+实例,Android Studio 上第一个 Xposed 模块(示例代码)

    环境: 已root手机一枚 Android Studio一枚 官方文档参考 这里 . 准备工作 我们需要事先下载一个 Xposed installer 安装在手机上,用来管理所有的模块. 安装完成后打 ...

  8. 如何将html页面导出到excel,html页面表格导出到excel总结(示例代码)

    html 表格导出道Excel 列标题1 列标题2 类标题3 列标题4 列标题5 aaa bbb ccc ddd eee AAA BBB CCC DDD EEE FFF GGG HHH III JJJ ...

  9. ZwQueryVirtualMemory暴力枚举进程模块

    0x01 前言 同学问过我进程体中EPROCESS的三条链断了怎么枚举模块,这也是也腾讯面试题.我当时听到也是懵逼的. 后来在网上看到了一些内存暴力枚举的方法ZwQueryVirtualMemory. ...

  10. 2013蓝桥杯C++A:排它平方数(递归,枚举,暴力解法)

    二.题目: 排它平方数 小明正看着 203879 这个数字发呆. 原来,203879 * 203879 = 41566646641 这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位 ...

最新文章

  1. 公司inur php id_,PHP——个人信息管理系统
  2. 如何知道是否开启opcode_你知道如何查询企业是否有ICP经营许可证吗?
  3. jq封装post请求数据_GitHub - xiaohange/JQHttpRequest: GET/POST / PUT / DELETE 网络请求的封装...
  4. 呕心沥血为小白总结13个学习网站-错过了你注定绕弯!
  5. 对渠道流量异常情况的分析
  6. Python | 程序从列表中删除范围内的所有元素
  7. linux服务器无法识别xml文件,linux上重启服务器提示找不到smartbi-config.xml文件
  8. DrawIndexedPrimitiveUP这个函数
  9. 徐州医科大学党委书记夏有兵一行莅临云创
  10. matlab生成低通滤波,用matlab设计低通滤波器
  11. 百度网盘视频加速播放
  12. 想搬去苏州生活了。。
  13. Unity Serialization 序列化
  14. 程序员如何改善精神内耗?
  15. 利用 eutils 实现自动下载序列文件(python实现)
  16. 《信息处理技术》知识点整理
  17. 把房子卖了,把工资发了
  18. 九龙证券|一夜暴跌36%,美股走势分化,标普指数创近2月最差周度表现
  19. unittest安装教程_unittest模块使用方法
  20. OCR二次开发宝典:飞桨联合多家企业和高校发布《OCR产业范例20讲》

热门文章

  1. Valve员工手册,一部震惊世界的“人生攻略”
  2. 监管科技崛起:从FinTech到RegTech
  3. Rust : Pointer......to be continued
  4. (转)去中心化:关于区块链的争论
  5. Julia:和Julia相关的经济学网站 和初学者网站
  6. 【车牌识别】基于matlab GUI字符匹配车牌识别(18省份)【含Matlab源码 1617期】
  7. 【TWVRP】基于matlab遗传算法求解送货且带时间窗的车辆路径规划问题【含Matlab源码 1074期】
  8. 【人脸表情识别】基于matlab GUI CNN人脸表情识别【含Matlab源码 787期】
  9. 【人脸表情识别】基于matlab PCA+SVM人脸表情识别评分系统【含Matlab源码 593期】
  10. 妲己机器人功能_来自机器人影响者的5个功能强大的Instagram教训