木马核心技术剖析读书笔记之Windows 64 位系统下的木马技术
对比 | 32位系统 | 64位系统 |
---|---|---|
物理内存最大容量 | 4GB | 2TB |
单进程地址空间最大容量 | 3GB | 8TB |
Windows 64 位系统
当前64位平台上只实现了48位的线性地址空间,0-47位是地址,48-63保持与第47位相同。低地址范围:0x0000000000000000-0x00007FFFFFFFFFFF,高地址范围:0xFFFF800000000000-0xFFFFFFFFFFFFFFFF。Windows 64 位系统内核使用高地址范围,用户态使用低地址范围
Wow 64 子系统
Wow64 是 Windows 64 位系统的一个子系统,负责在 Windows 64 位系统上执行 32 位的应用程序
木马要同时支持 32 位系统和 64 位系统,需要针对 Wow64 的实现与运行机制,进行有针对性的处理,才能更好地适应 Windows64 位环境,并进行有效的防护。木马使用 IsWow64Process 函数判断其是否运行在 Wow64 子系统中,由于 32 位的 Windows 系统也实现了该函数,故该函数只能判断进程是否运行在 Wow64 中,而不能判断所在系统为 64 位系统。要获取是否为 64 位系统,需要使用 GetNativeSystemInfo 函数
Wow64 子系统主要由用户模式下的一组 DLL 及系统内核中的部分功能组成
Wow 64 中执行 64 位代码
32 位进程中执行 64 位指令
在 Wow64 子系统中,32 位应用程序使用的 32 位系统功能 API,都是 Wow64 子系统的组件通过调用对应的 64 位版本 API 实现的。这一过程后,Wow64 会从 32 位处理器模式切换到 64 位处理器模式,待 64 位函数执行完成后,再切换回 32 位处理器模式
32 位进程中调用 64 位 API
对于运行在 Wow64 中的 32 位进程,只加载了 ntdll.dll 这个 64 位的 DLL,该 DLL 的导出函数基本上能满足大部分木马的功能要求。要调用 64 位版本 ntdll.dll 中的函数,首先需要找到该 ntdll.dll 在内存中的镜像,然后通过解析该函数的导出表,找到相应的函数地址,再进行调用