首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Wow64 栈回溯和模块枚举

Wow64 栈回溯和模块枚举

作者头像
信安之路
发布于 2019-03-01 09:11:26
发布于 2019-03-01 09:11:26
2.8K00
代码可运行
举报
文章被收录于专栏:信安之路信安之路
运行总次数:0
代码可运行

本文作者:Anhkgg(信安之路病毒分析小组成员)

很久没写驱动代码,最近又摸了一下。

在驱动中回溯调用栈,找到特定模块,获取模块地址、大小、路径等信息,然后...。

堆栈回溯

驱动中通常使用 RtlWalkFrameChain 来获取调用栈信息,接口如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ULONG
RtlWalkFrameChain(OUTPVOID*Callers, INULONGCount, INULONGFlags);
//Callers一个PVOID数组,保存栈中retaddr值
//Count表示数组大小
//Flags=0获取内核层栈信息,=1获取应用层栈信息
//返回值表示栈的层数

还有其他函数,未使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
VOID
RtlGetCallersAddress(
   OUTPVOID*CallersAddress, //address to save the first caller.
   OUTPVOID*CallersCaller  //address to save the second caller.
)
RtlCaptureStackBackTrace

其实对于单纯的 x86(ring3)->x86(ring0),和 x64(ring3)->x64(ring0) 没甚么好说的,就是普通的栈信息。

我这里要着重提的是 x86(ring3)->x64(ring0),也就是64位系统的32位程序在进行系统调用时的堆栈(称为 Wow64)。

先看看 CreateFile 的栈信息。Windbg 并不能直接通过 k 显示 wow64 到内核的所有栈信息,wow64 部分需要通过扩展指令切换,具体如下:

而 RtlWalkFrameChain(x, n, 1) 是可以完整获取到 wow64 到 nt 之前的所有应用层栈信息。如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
00000000`7796c08a//ntdll!ZwCreateFile+0xa
00000000`73c8c1ff
00000000`73c7d18f
00000000`73c02776
00000000`73c7d286
00000000`73c7c69e
00000000`7795f9b6
00000000`779bbb89
00000000`7794a0ee
//00000000`00000000 没有这层
76f1c76b//ntdll_77b00000!NtCreateFile+0x12
75583f66
755853c4
013259e2

需要注意的是,两个 ntdll 并不一样(ntdll_77b00000 是 32 位 dll),并且 ntdll 中间出现了 wow64 和 wow64cpu 两个模块,这就涉及到具体 x86 调用(wow64)如何切换到 x64 了,这里不展开。

进程模块枚举

可能大家都知道驱动中枚举模块的一种方法(非 ZwQuerySystemInformation、SystemModuleInformation ),使用进程 Peb->Ldr 链表枚举,可以获取到模块的路径、基址、大小等信息。

下面是通常驱动下获取模块信息的代码,适用于 x64 内核获取 x64 进程模块信息以及 x86 内核获取 x86 进程模块信息。

那特殊的 Wow64 又有什么不同呢?(x64 内核获取 x86 进程模块信息)。

对于 wow64 进程来说,EPROCESS 结构中有个特殊字段保存 wow64 的 peb 结构。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct_EPROCESS
{
PVOIDWow64Process;//
}

Win7 之前 Wow64Process 是 _WOW64_PROCESS 结构,内部包含字段位 wow64 的 peb,win7 后 Wow64Process 直接就是 wow64 的 peb。

直接就可以通过 PsGetProcessWow64Process(未文档化函数)来获取到该字段。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Peb=PsGetProcessWow64Process(Process); //Process->Wow64Process

wow64 的 peb 结构不再是 _PEB,而是使用于 wow64 的 _PEB32,一大特点就是所有的地址都是 32 位的,为了在 x64 下定义这种字段,只好使用 ULONG。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma pack(push, 1)
typedefstruct_PEB32{
BOOLEANInheritedAddressSpace;      // These four fields cannot change unless the
BOOLEANReadImageFileExecOptions;   //
BOOLEANBeingDebugged;              //
BOOLEANSpareBool;                  //
ULONGMutant;                      // INITIAL_PEB structure is also updated.

ULONGImageBaseAddress;
ULONGLdr;//PPEB_LDR_DATA32
}PEB32, *PPEB32;
#pragma pack(pop)

结构中 Ldr 位 32 位地址指针,使用 ULONG 定义,Ldr 也是特殊的 _PEB_LDR_DATA32 结构,字段和普通的 _PEB_LDR_DATA 完全一致,只是地址全为 ULONG(32 位,x64 地址为 64 位)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedefstruct_PEB_LDR_DATA32{
ULONGLength;
ULONGInitialized;//bool
ULONGSsHandle;
LIST_ENTRY32InLoadOrderModuleList;
LIST_ENTRY32InMemoryOrderModuleList;
LIST_ENTRY32InInitializationOrderModuleList;
ULONGEntryInProgress;//pvoid
} PEB_LDR_DATA32, *PPEB_LDR_DATA32;

如此 wow64 进程模块信息获取的方法也出来了。

搞定。

参考:

http://www.cnblogs.com/welfear/archive/2010/11/16/1878503.html

http://www.kernelmode.info/forum/viewtopic.php?t=2516

http://rce.co/category/wow64/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 信安之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
你好,转换成csv格式的代码在哪呀
你好,转换成csv格式的代码在哪呀
回复回复点赞举报
推荐阅读
ubuntu18.04安装pycharm记录「建议收藏」
https://www.jetbrains.com/pycharm/download/#section=linux
全栈程序员站长
2022/09/27
1.1K0
ubuntu18.04安装pycharm记录「建议收藏」
ubuntu中pycharm卸载与安装
去官网下载Professional版,拷贝到ubuntu里解压后,进入里面的pycharm-community-2018.1/bin 文件夹下 执行如下命令安装:
全栈程序员站长
2022/09/25
9060
centos7安装Pycharm_pycharm安装库
Download PyCharm: Python IDE for Professional Developers by JetBrains
全栈程序员站长
2022/09/27
4600
centos7安装Pycharm_pycharm安装库
ubuntu安装pycharm快捷图标_pycharm快捷方式找不到了
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/174661.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
1.6K0
ubuntu安装pycharm快捷图标_pycharm快捷方式找不到了
Linux – CentOS7下安装PyCharm2019「建议收藏」
通过wget命令下载pycharm-community-2019.2.3.tar.gz ,下载地址为官方网站,可以访问官网下载其他版本的pycharm
全栈程序员站长
2022/09/26
1.1K0
Linux – CentOS7下安装PyCharm2019「建议收藏」
pycharm2018.3.7安装教程_linux安装pycharm
网页下载:http://www.jetbrains.com/pycharm/download/#section=linux
全栈程序员站长
2022/09/27
1.5K0
pycharm2018.3.7安装教程_linux安装pycharm
Ubuntu 18.04.4 安装 PyCharm 并生成快捷方式
PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性,鉴于目前最新版 PyCharm 使用教程较少,我们这篇文章来介绍一下 PyCharm 在 Ubuntu 18.04.4下是如何安装的。
知忆
2021/06/12
5070
卸载pycharm重新安装_乌班图怎么下载pychsrm
首先要去pycharm的官方网站下载Linux版本的pycharm安装包。 如果想要下载以前版本的pycharm可以登录下方的网站去下载。
全栈程序员站长
2022/09/28
1.7K0
卸载pycharm重新安装_乌班图怎么下载pychsrm
Ubuntu 18.04.4 安装 PyCharm 并生成快捷方式
PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性,鉴于目前最新版 PyCharm 使用教程较少,我们这篇文章来介绍一下 PyCharm 在 Ubuntu 18.04.4下是如何安装的。
用户4988085
2021/09/18
8500
termux安装kali图形界面_kali如何创建shell脚本
1、pycharm的安装包下载地址: https://www.jetbrains.com/pycharm/download/#section=linux
全栈程序员站长
2022/09/25
1.7K0
如何用ubuntu命令打开pycharm_ubuntu安装pycharm教程
在Linux终端进入pycharm 安装路径下的bin目录下,输入如下命令:./pycharm.sh
全栈程序员站长
2022/09/27
2.6K0
如何用ubuntu命令打开pycharm_ubuntu安装pycharm教程
ubuntu上设置pycharm快捷方式详细贴图步骤
当我安装好pycharm后,就是用sh ./pycharm.sh启动后,我再把应用关掉,我就找不到了,真是很奇怪,原来还要另外单独设置快捷方式才行。
川川菜鸟
2021/10/18
1.3K0
Linux学习桌面系统生成快捷方式与普通用户权限
说了这么多其实还是建议如果有环境的话,程序员还是在Linux环境下开发的好。虽然刚开始有点难,但是后面会发现有很多好处。那么我们在Linux系统下开发首先会遇到的一个问题就是快捷方式。
用户2196435
2018/08/10
1.6K0
Linux学习桌面系统生成快捷方式与普通用户权限
python笔记:#003#PyCharm 的初始设置
PyCharm 的初始设置(知道) 目标 恢复 PyCharm 的初始设置 第一次启动 PyCharm 新建一个 Python 项目 设置 PyCharm 的字体显示 PyCharm 的升级以及其他 PyCharm 的官方网站地址是:https://www.jetbrains.com/pycharm/ 01. 恢复 PyCharm 的初始设置 PyCharm 的 配置信息 是保存在 用户家目录下 的 .PyCharmxxxx.x 目录下的,xxxx.x 表示当前使用的 PyCharm 的版本号 如果要恢复
_gongluck
2018/03/08
1.8K0
python笔记:#003#PyCharm 的初始设置
Python+PyCharm下载安装教程「建议收藏」
网址如下:https://www.python.org/downloads/ 单击Download进入下载页面,根据所用操作系统类型选择相应的Python安装文件进行下载(例如Windows 7的32位操作系统选择Windows x86 executable installer进行下载、 64位操作系统选择Windows x86-64 executable installer )
全栈程序员站长
2022/09/27
1.9K0
Python+PyCharm下载安装教程「建议收藏」
Ubuntu18.04安装Anaconda+PyCharm+VS Code[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/174997.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
8830
Ubuntu18.04安装Anaconda+PyCharm+VS Code[通俗易懂]
Linux中的pycharm配置问题「建议收藏」
这两行分别表示运行文件和图标的路径,要根据个人情况进行更改 .sh文件相当于windows下的.exe
全栈程序员站长
2022/09/25
8520
Linux中的pycharm配置问题「建议收藏」
linux配置pycharm环境_创建桌面快捷方式是什么意思
Download PyCharm: Python IDE for Professional Developers by JetBrains
全栈程序员站长
2022/11/02
2.4K0
linux配置pycharm环境_创建桌面快捷方式是什么意思
linux安装pycharm后找不到了_ubuntu pycharm安装
pycharm 安装到linux(ubuntu、linuxmint) 先说本人使用的工作环境 win10家庭版 使用vmware 和vbox 两款虚拟机, ubuntu 16.04 linuxmint 一样的 废话少说。
全栈程序员站长
2022/11/02
2.9K0
Ubuntu 18.04 安装 PyCharm[通俗易懂]
部分摘抄自:https://blog.csdn.net/zhuanshu666/article/details/73554885
全栈程序员站长
2022/09/14
1K0
Ubuntu 18.04 安装 PyCharm[通俗易懂]
推荐阅读
相关推荐
ubuntu18.04安装pycharm记录「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档