如何防止第三方库显示MessageBox?

时间:2010-02-01 20:04:18

标签: .net winapi

我正在将第三方基于C的SDK集成到我的.NET应用程序中。该应用程序将作为服务器上的Windows服务运行,因此它不应以任何方式与用户交互。

不幸的是,在某些错误情况下,它坚持调用MessageBoxA,可能是为了报告发生了一些不好的事情。发生这种情况时,服务停止响应。我猜它正等着有人按Ok?

供应商无法为我更改代码。

有没有办法让这个调用成为无操作,所以我的代码可以自动处理这种情况?

编辑:可能很重要的是,在我的特定情况下,如果服务崩溃,服务将自动重启。对于在我的情况下显示MessageBox的情况,优雅(尽可能)和突然退出可能是最佳解决方案。

3 个答案:

答案 0 :(得分:10)

结帐Detours from Microsoft Research。它允许您绕过任意Windows API函数。需要C / C ++编程才能使其工作。你不需要太多。

答案 1 :(得分:3)

您可以使用编辑器查找此位置并从其二进制文件中删除该调用。但根据软件的使用限制,这可能允许也可能不允许。当然,如果您重新分发它可能会导致问题 - 您应该询问供应商并将其报告为缺陷,并建议您有自己使用的解决方法。

对于曾经做过这种事情的人(破解许可证或其他逆向工程),这非常简单,但真正的问题是,如果被忽略会发生什么 - 它是否仍然继续有用?

答案 2 :(得分:0)

这不是很容易。我认为唯一的方法是编写一个消息钩子来捕获泵送到系统上所有Windows消息循环的消息。但我甚至不确定服务是否可以创建消息挂钩,因为它无法访问默认凭据(LocalSystem)下的默认窗口站。所以第一个任务就是看看它是否真的有效。

但这里有一个粗略的草图,我将如何尝试在服务上下文之外进行,你可以看看它是否适用:

  1. 创建一个窗口hook,以捕获系统上所有Windows消息队列的消息。
  2. 捕获所有WM_CREATE消息,并探测CREATESTR束参数以查找可能来自您的第三方库的消息。您可能必须记录所有WM_CREATE消息,然后分析数据,以了解如何将库的对话框与系统上的任何其他对话框区分开来。 (很多时候,“lpszName”成员在对话框实现之间有所不同。)
  3. 如果你认为特定的WM_CREATE来自你的库,则从你的消息钩子返回一个“处理”响应,不要调用链中的下一个消息处理程序。
  4. 这对你来说是非常冒险的,但它似乎对我有任何机会。