查找进程的导入 dll 和可执行 vad 的相关性

逆向工程 视窗 记忆 数字取证
2021-07-09 15:28:09

我使用的内存转储来自在 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

为什么无法解析导入目录的任何想法?或者对我的想法有任何其他评论吗?也许是另一种方式来达到同样的目的......

非常感谢任何帮助,谢谢!

0个回答
没有发现任何回复~