Windows:如何创build自定义的appcompat填充(应用程序修补程序)?

Windows有能力将垫片应用于错误的应用程序 。 Shims用于拦截API调用并对其进行更改。 例如,垫片可以用来:

  • 改变传入的参数
  • 说谎返回值
  • 改变它来调用别的东西

应用程序兼容性Tookit有相当多的现有垫片可以应用于您自己的错误行为应用程序。 下面是一个忽略你的API调用的例子,而是调用一个完全不同的API:

替代文字http://img.zgserver.com/windows/5n5h5c.png

我需要一个不是微软已经写过的数百个垫片之一的垫片。 我需要一个自定义的垫片 。

在我的情况下,我想拦截调用:

GetSystemMetrics(0x1000) 

所以它返回0 。 我找不到任何有关如何给Windows我自己的DLL,将有我需要的修复程序的任何信息。 我甚至不知道你是否可以创build自定义的垫片。

Windows是否支持自定义填充?

我没有意识到除了Microsoft实施appcompat shim以外的任何其他方式。

你可能想要调查Detours ,它可能会提供你想要的功能。

你必须从雷蒙德的观点来考虑这一点。 想象一下,如果微软以外的其他人能够编写兼容性垫片。 然后,无论微软什么时候做出突破性改变,除了所有其他的兼容性工作外,他们还必须为第三方填充垫片写入垫片,这些垫片做错了事情。 保持向后兼容性已经足够困难了。

这是可能的,但它需要一些工作。

你使用自己的启动程序生成应用程序,该应用程序将应用垫片。 您可以通过让您的启动程序创建具有足够权限的进程来编辑其内存。 大多数API函数都以两个字节的nop开头,前面有更多的nops。 你可以改变两个字节的nop为一个短暂的跳跃,前面的nops是你想去的一个长跳跃。

我过去使用的另一种解决方案是将可执行文件作为DLL加载,但是这可能会导致更多的工作,因为取决于应用程序的挑剔程度。 在我的情况下,我不得不加载可执行文件作为一个数据专用的DLL,并做我自己的进口,但不幸的是,以前的解决方案不是我的选择。

我也曾经写过一个使用类似原理的挂钩DLL,但如果您可以修改源以加载DLL,或者如果该过程支持DLL插件,那么这只是一个选项。

你总是可以使用逆向工程来解决它:),让我知道如果你需要任何帮助