为什么加载到内存中的DLL与原来的DLL文件不完全对应?
Why the DLL loaded in memory doesn't fully correspond to the original DLL file?
如有不妥请指正...
我想做的事情:
在通过 WinDBG 进行远程内核调试期间,我想在某些 DLL 中找到某个函数,该函数正在由 Windows 服务加载。 (IDA + VirtualKD + VMWare VM 中的 WinDBG 插件 Windows 10 x64)。
我需要在内核模式下进行,因为我需要切换进程并查看所有内存
我做了什么:
- 我在 IDA 中找到了函数的偏移量(不幸的是,DLL 没有调试符号)。
- 已在内核模式下连接到 VM。
- 通过遍历 svchost 进程 (
!process 0 0 svchost.exe
) 并查看其 PEB 中的 CommandLine 字段 (C:\Windows\system32\svchost.exe -k ...
) 找到了服务进程。
- 切换到进程(
.process /i <address>; g
),刷新模块列表(.reload
)
- 在用户模块列表中找到了目标DLL并得到了它的基地址。
问题:
加载到内存中的 DLL 与原始 DLL 文件不完全对应,所以我在那里找不到函数。
当我跳转到 <dll_base_address> + <function_offset>
这样的地址时,那里和周围什么都没有。但是我发现了一些使用这种方法的其他功能,所以它看起来是正确的。
然后我试图根据原始 DLL 文件找到属于该函数的字节序列,但也一无所获。
该函数使用我在数据部分找到的字符串,但没有对它们的外部参照。
看起来那个功能已经完全消失了...
我做错了什么?
P.S.: 另外我将内存从 <dll_start>
转储到 <dll_end>
并将其与原始文件进行比较。除了不同的跳转地址和偏移量,有时汇编代码会完全丢失...
似乎内存页面被调出。 .pagein
命令成功了
看起来,一些内存页面被调出(移动到辅助存储)。此命令从辅助存储加载页面,它们出现在反汇编中:
.pagein /f /p <process_address> <memory_page_address>
查看更多:
如有不妥请指正...
我想做的事情: 在通过 WinDBG 进行远程内核调试期间,我想在某些 DLL 中找到某个函数,该函数正在由 Windows 服务加载。 (IDA + VirtualKD + VMWare VM 中的 WinDBG 插件 Windows 10 x64)。 我需要在内核模式下进行,因为我需要切换进程并查看所有内存
我做了什么:
- 我在 IDA 中找到了函数的偏移量(不幸的是,DLL 没有调试符号)。
- 已在内核模式下连接到 VM。
- 通过遍历 svchost 进程 (
!process 0 0 svchost.exe
) 并查看其 PEB 中的 CommandLine 字段 (C:\Windows\system32\svchost.exe -k ...
) 找到了服务进程。 - 切换到进程(
.process /i <address>; g
),刷新模块列表(.reload
) - 在用户模块列表中找到了目标DLL并得到了它的基地址。
问题:
加载到内存中的 DLL 与原始 DLL 文件不完全对应,所以我在那里找不到函数。
当我跳转到 <dll_base_address> + <function_offset>
这样的地址时,那里和周围什么都没有。但是我发现了一些使用这种方法的其他功能,所以它看起来是正确的。
然后我试图根据原始 DLL 文件找到属于该函数的字节序列,但也一无所获。
该函数使用我在数据部分找到的字符串,但没有对它们的外部参照。
看起来那个功能已经完全消失了...
我做错了什么?
P.S.: 另外我将内存从 <dll_start>
转储到 <dll_end>
并将其与原始文件进行比较。除了不同的跳转地址和偏移量,有时汇编代码会完全丢失...
似乎内存页面被调出。 .pagein
命令成功了
看起来,一些内存页面被调出(移动到辅助存储)。此命令从辅助存储加载页面,它们出现在反汇编中:
.pagein /f /p <process_address> <memory_page_address>
查看更多: