【问题标题】:Attempted to read or write protected memory when calling native C DLL调用本机 C DLL 时尝试读取或写入受保护的内存
【发布时间】:2010-10-09 15:27:35
【问题描述】:

我有一个本机 C dll,它可以导出除 DllEntryPoint、FuncX 之外的一个函数。我试图找出 FuncX 如何与它的调用者通信,因为它有一个 void 返回类型并且没有参数。当我从 C# 工具调用它时,我得到一个 AccessViolationException - 试图读取或写入受保护的内存。

我有一种预感,它的客户端应用程序可能会分配一个缓冲区来发送或接收来自 dll 的值。这是一个有效的预感吗?

我无法调试客户端应用程序,因为由于某种原因它没有运行,所以我无法启动它并附加到进程。但是,我可以在 IDA Pro 中对其进行反汇编,但如果可以的话,我不知道如何尝试在其中进行调试。

【问题讨论】:

    标签: debugging winapi dll reverse-engineering


    【解决方案1】:

    如果有问题的 DLL 有任何静态或全局符号,则所有通信都可能通过这些符号完成。您是否有任何看起来可能会执行此操作的 API 代码?

    DLL 不太可能使用客户端提供的缓冲区,因为客户端和服务器都需要知道该缓冲区的基地址,并且您不能在调用时向 calloc 或 malloc 询问“首选”地址.

    您也可以尝试运行 link /dump /symbols 并将其指向您的 DLL。这将向您显示 DLL 中导出的符号列表。祝你好运!

    【讨论】:

      【解决方案2】:

      我会尝试将 DLL 本身加载到 IDA Pro 中。希望 C# 保留本机调用堆栈,您可以查看 DLL 崩溃的代码。

      旁注:Decompiler plugin 非常棒。

      【讨论】:

      • 我只在 IDA Pro 上的 300 页教程的第 20 页左右,并且已经订购了 600 页的书,但是现在,我将如何在 IDA Pro 中加载 DLL 并仍然调用它来自 C#?我正在检查 Decompiler 插件,谢谢。
      • 哎呀,反编译器的价格我亲眼看到了。以目前的汇率,那是我房款的三倍!如果我从事更多的逆向工程工作,这可能是一笔值得的投资。
      • 不知道,我自己从来没有参与过 IDA。只看到它在我以前的工作中使用过。但是当您遇到崩溃时,请查看 AccessViolationException 并查看是否可以找到内存地址。我知道你可以直接跳转到一个内存地址,看看那里有什么。也许这会让你开始。
      猜你喜欢
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多