我使用的内存转储来自在 VirtualBox VM 内运行的 Windows XP SP2。我使用 vboxmanage debugvm dumpguestcore --filename dump.vmem 获取内存转储。窗口分页被禁用。
我的想法是识别在通过例如 LoadLibrary() 调用创建进程之后创建的可执行 vad。因为这些 vad 不应该对应于任何导入的 dll。
因此,我递归地遍历进程/模块导入目录(DIRECTORY_ENTRY_IMPORT 和 DIRECTORY_ENTRY_DELAY_IMPORT)。每当我找到一个新的 dll 时,我都会将相应的 vad 标记为已导入并从那里开始扫描。
我使用波动性插件 ProcExeDump 转储模块和 peFile 从转储模块读取导入目录。
这样的递归行走看起来像这样:
PID: 600, services.exe
msvcrt.dll - 0x77c10000
kernel32.dll - 0x7c800000
ntdll.dll - 0x7c900000
advapi32.dll - 0x77dd0000
secur32.dll - 0x77fe0000
netapi32.dll - 0x5b860000
ws2_32.dll - 0x71ab0000
ws2help.dll - 0x71aa0000
user32.dll - 0x77d40000
cant parse delay import directory
rpcrt4.dll - 0x77e70000
userenv.dll - 0x769c0000
authz.dll - 0x776c0000
cant parse delay import directory
ole32.dll - 0x774e0000
gdi32.dll - 0x77f10000
oleaut32.dll - 0x77120000
scesrv.dll - 0x758e0000
cant parse delay import directory
umpnpmgr.dll - 0x758c0000
winsta.dll - 0x76360000
ncobjapi.dll - 0x5f770000
msvcp60.dll - 0x76080000
可以看到,虽然模块有目录且目录大小不为0,但有时会读取延迟导入的目录。
在上面的示例中,我能够识别与导入模块对应的 20 个可执行 vad。(总共 38 个可执行 vad 中的 20 个)
在其他 18 个可执行 vad 中,有许多属于其他 dll,例如 version.dll、uxtheme.dll 或 apphelp.dll
例子:
Start: 2008285184, 0x77b40000L
Flags: CommitCharge: 1, ImageMap: 1, Protection: 7
ControlArea @8a3f4bf8 Segment e15392a0
Dereference list: Flink 00000000, Blink 00000000
NumberOfSectionReferences: 1 NumberOfPfnReferences: 12
NumberOfMappedViews: 4 NumberOfUserReferences: 5
WaitingForDeletion Event: 00000000
Control Flags: Accessed: 1, File: 1, HadUserReference: 1, Image: 1
FileObject @8a4fc660, Name: \WINDOWS\system32\apphelp.dll
First prototype PTE: e15392d8 Last contiguous PTE: fffffffc
Flags2: Inherit: 1
为什么无法解析导入目录的任何想法?或者对我的想法有任何其他评论吗?也许是另一种方式来达到同样的目的......
非常感谢任何帮助,谢谢!