导出地址表保护缓解措施的一种实现,类似于导出地址过滤(EAF)
本项目由三个二进制文件组成,编译后可在 EATGuard\bin\ 中找到。它们是:
EATGuardApplication.exe - 一个“恶意”应用程序,它将 EATGuardDll.dll 加载到进程中,然后执行一些可执行代码(shellcode),这些代码会运行 notepad.exe。EATGuardDll.dll - 提供用户态与内核态之间“桥梁”的 DLL。该 DLL 注册了一个向量化异常处理程序(VEH),用于将对 kernel32.dll 导出地址表(EAT)的访问检测发送给 EATGuardDriver.sys 驱动。该 DLL 在 kernel32.dll 的 EAT 上分配一个保护页,当在 EATGuardApplication.exe 进程空间内访问 EAT 时会触发异常。这会路由执行到已注册的 VEH,由其处理这些异常,并在分析完成后负责继续执行。EATGuardDriver.sys - 内核模式设备驱动程序,用于验证对 kernel32.dll EAT 的访问。目前,作为一个 POC,它检查访问 kernel32.dll 的内存是否有磁盘后备。请注意,EATGuardApplication.exe 是从 EATGuardApplication.exe 的相对路径加载 EATGuardDll.dll 的。这意味着执行时 .exe 和 .dll 必须位于同一目录中。另外请注意,不要 在启用了内核调试的机器上运行此项目。这可能会导致问题,因为 EATGuardDll.dll 使用单步异常来继续执行。以下是该项目的一个使用示例:
C:\Users\ANON\Desktop>sc create EATGUARD type= kernel binPath= C:\Users\ANON\Desktop\EATGuardDriver.sys
[SC] CreateService SUCCESS
C:\Users\ANON\Desktop>sc start EATGUARD
SERVICE_NAME: EATGUARD
TYPE : 1 KERNEL_DRIVER
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
PID : 0
FLAGS :
C:\Users\ANON\Desktop>EATGuardApplication.exe
[+] KERNEL32.dll EAT: 0x00007FFB1D83F898
[+] Number of functions in the KERNEL32.dll EAT: 1678
[+] EATGuard analysis complete!
[+] Target address: 0x24AA138005C
[>] IsRipRwxMemory: TRUE
[>] IsRipMappedSection: FALSE
[>] IsRipBackedByImage: FALSE
[>] HasPageProtectionChanged: FALSE
[>] RegionBaseAddress: 0x24AA1380000
[>] MemoryRegionSize: 0x1000
[>] MemoryCommtSize: 0x1000
[+] EATGuard analysis complete!
[+] Target address: 0x24AA138005F
[>] IsRipRwxMemory: TRUE
[>] IsRipMappedSection: FALSE
[>] IsRipBackedByImage: FALSE
[>] HasPageProtectionChanged: FALSE
[>] RegionBaseAddress: 0x24AA1380000
[>] MemoryRegionSize: 0x1000
[>] MemoryCommtSize: 0x1000
[+] EATGuard analysis complete!
[+] Target address: 0x24AA138008F
[>] IsRipRwxMemory: TRUE
[>] IsRipMappedSection: FALSE
[>] IsRipBackedByImage: FALSE
[>] HasPageProtectionChanged: FALSE
[>] RegionBaseAddress: 0x24AA1380000
[>] MemoryRegionSize: 0x1000
[>] MemoryCommtSize: 0x1000
[+] EATGuard analysis complete!
[+] Target address: 0x24AA138009B
[>] IsRipRwxMemory: TRUE
[>] IsRipMappedSection: FALSE
[>] IsRipBackedByImage: FALSE
[>] HasPageProtectionChanged: FALSE
[>] RegionBaseAddress: 0x24AA1380000
[>] MemoryRegionSize: 0x1000
[>] MemoryCommtSize: 0x1000
[+] EATGuard analysis complete!
[+] Target address: 0x24AA13800A2
[>] IsRipRwxMemory: TRUE
[>] IsRipMappedSection: FALSE
[>] IsRipBackedByImage: FALSE
[>] HasPageProtectionChanged: FALSE
[>] RegionBaseAddress: 0x24AA1380000
[>] MemoryRegionSize: 0x1000
[>] MemoryCommtSize: 0x1000
(...)TRUNCATED(...)
此项目是一个 POC,模仿了 导出地址过滤 的功能。