windows - 为什么加载到内存中的DLL与原始DLL文件不完全对应?

标签 windows debugging reverse-engineering windbg ida

如有错误,请指正...

我想做的事情: 我想在通过 WinDBG 进行远程内核调试期间,在某个 DLL 中找到某个由 Windows 服务加载的函数。 (使用 Windows 10 x64 的 IDA + VirtualKD + VMWare VM 中的 WinDBG 插件)。 我需要在内核模式下进行,因为我需要切换进程并查看所有内存

我做了什么:

  1. 我在 IDA 中找到了函数的偏移量(不幸的是,DLL 没有调试符号)。
  2. 已在内核模式下连接到虚拟机。
  3. 通过迭代 svchost 进程 ( !process 0 0 svchost.exe ) 并查看其 PEB 中的 CommandLine 字段 ( C:\Windows\system32\svchost.exe -k ... ) 找到服务进程。
  4. 切换到进程 ( .process /i <address>; g ),刷新模块列表 ( .reload )
  5. 在用户模块列表中找到目标DLL并获取其基地址。

问题: 加载到内存中的 DLL 与原始 DLL 文件不完全对应,因此我在那里找不到该函数。 当我跳转到像 <dll_base_address> + <function_offset> 这样的地址时那里和周围什么都没有。但我发现其他一些函数也使用这种方法,所以它看起来是正确的。 然后我试图根据原始DLL文件找到属于该函数的字节序列,但也一无所获。 该函数使用我在数据部分找到的字符串,但没有它们的外部引用。 看来这个功能已经完全消失了...

我做错了什么?

P.S.:我还从 <dll_start> 转储了内存至<dll_end>并与原始文件进行比较。除了不同的跳转地址和偏移量之外,有时汇编代码会完全丢失......

最佳答案

内存页面似乎已被调出。 .pagein 命令成功了

关于windows - 为什么加载到内存中的DLL与原始DLL文件不完全对应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67586771/

相关文章:

serial-port - 逆向工程黑盒串行协议(protocol)

c# - 调试 Windows 窗体应用程序 C# 添加监视

python - pipenv shell在虚拟环境中启动子shell… 'powershell.exe'无法识别为内部或外部命令,可操作程序或

windows - Jenkins 不能很好地处理私有(private) GitHub 存储库 (Windows)

java - 从 Eclipse 中的 Debug 视角激活 Java 视角

python - 反编译导入的模块(例如使用 uncompyle2)

c# - 使用 C# 检测 Windows 操作系统是否具有无效许可证

asp.net - 如何自动附加VS到另一个进程进行调试?

c - Visual Studio调试执行路径

reverse-engineering - Hibernate - 将注释从属性(方法)级别移动到字段级别