技术笔记:retrowin32:重做系统调用

这是一篇关于 retrowin32 的系列文章的一部分,主要介绍了 Windows API 的实现及相关改进。

  • 功能实现:retrowin32 实现了 Windows API,如 WriteFile 函数,在 Rust 中编写了其实现,并通过代码生成器处理参数传递和栈操作。
  • DLL 调用机制:在 Windows 中,通过“导入地址表”(IAT)处理对 DLL 函数的调用,执行代码在加载时将所需的 DLL 地址写入 IAT。
  • retrowin32 的过去与现在:过去 retrowin32 通过在 IAT 中插入魔术数来识别调用,存在一些问题,如在 x86 - 64 模式下无法拦截所有调用等。现在通过创建真实的系统库 DLL 并加载它们来解决这些问题,每个存根函数触发 retrowin32 处理内置函数的代码。
  • Vtables:COM 库如 DirectDraw 暴露 vtables,之前需在使用 DLL 时分配内存来存储函数指针,现在可将 vtables 作为静态数据从 DLL 中暴露。
  • 构建 DLL:使用 clang - cl 工具链生成存根 DLL,虽需引入单独的编译器工具链,但目前较方便,也尝试过其他方法但遇到问题。
  • 动态链接思考:动态链接的相关机制复杂,Go 尝试避免动态链接,作者也反思自己对动态链接的工程价值的看法。
  • 附录:dllimport 调用:在 stub DLL 中最初生成的代码通过 IAT 进行调用时存在额外的间接跳转,通过修改生成的汇编代码可消除此间接跳转。
阅读 13
0 条评论