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插件,那么这只是一个选项。
你总是可以使用逆向工程来解决它:),让我知道如果你需要任何帮助