我最近在浏览互联网时,偶然发现了 Dll 注入。
我认为这是一个有趣的主题,但我不知道它的目的是什么?
我读到它可以用于破解/黑客游戏和软件,但也可以用它做一些积极的事情吗?
如果可以的话,它可以用来做什么?
哪些语言支持此功能?
郑重声明,我不会尝试用所获得的知识破解/破解任何游戏,无意做任何非法的事情!
谢谢您的时间,
艾默里恩
ps:有关此主题的网站/书籍将不胜感激!
我想到了几种用途:
热修补:允许您更新/修补部分代码,而无需实际关闭进程或重新启动。 Microsoft 本身通过在函数前添加 5 字节 NOP 块来确保 Windows 的大部分内容都是可热修补的。为什么?因为您可以在 5 个字节中 JMP 到代码的任何其他部分,所以热修补基本上会使用 JMP 覆盖更新/修补代码的前缀字节,瞧,您的代码做了一些全新的事情。这通常与 DLL 注入一起使用,将新代码加载到目标进程中,虽然不是强制性的,但这是它的用途之一。
日志记录:本着同样的精神,绕行代码通常用于为函数添加前缀以用于日志记录目的,即查看调用的参数是什么。此外,一些记录 DirectX 应用程序屏幕输出的应用程序通过绕过 DirectX 调用来实现此目的,这又涉及将 DLL 注入到监视调用的进程中。
子类化:不是 OOP 意义上的,而是 Windows 意义上的,即为现有窗口提供一个新的 WndProc 来改变其行为。虽然您可以通过SetWindowLongPtr简单地设置不同的消息处理例程,但限制因素是该函数需要驻留在目标进程地址空间中。这就是注入再次出现的地方:您在 DLL 中提供一个新的实现,将其注入到目标进程中并调用
SetWindowLongPtr
。例如,这可用于在外部窗口上提供自定义的附加绘图。我个人过去在常规业务应用程序中必须处理上述所有用例,从使用热补丁来确保医疗服务中关键通知系统的正常运行时间,到使用绕道/日志记录来允许专有记录管理(由当时已经倒闭的软件商店开发)与成熟的 CRM 解决方案实时对话。
一如既往,它只是你盒子里的一个工具,并没有什么本质上的“邪恶”。无论您使用它的目的是什么,这才是最重要的。
微软研究院针对这个主题完成了一个非常好的项目,重点是通过使用 dll 注入拦截对 WinAPI 函数的调用。
这是链接,应该会让你忙一阵子:Detours
在计算机编程中,DLL 注入是一种通过强制另一个进程加载动态链接库来在另一个进程的地址空间中运行代码的技术。[1]第三方开发人员经常使用 DLL 注入来以作者未预料到或无意的方式影响程序的行为。例如,注入的代码可能会捕获系统函数调用,或读取密码文本框的内容,这是无法通过通常的方式完成的。
来源和更多信息在这里:http://en.wikipedia.org/wiki/DLL_injection您还可以找到一些对外部来源的很好的参考。
当您有一个没有源代码的遗留系统并且您需要更改其行为时,可以充分利用 Dll 注入。不过,这是一个肮脏的黑客行为,应该作为最后的手段,IMO。
我添加了一些冗长的源代码,使用一种非常优雅的方法将外部进程中的任意代码注入维基百科。这是:
https://en.wikipedia.org/wiki/DLL_injection#Sample_Code
我的母语不是英语,所以你可能想让我的英语变得流畅。
作为使用 DLL 注入的高效方法的示例,开源项目 MacType/GDI++ 基于 Detours 和注入。这是一种显着改进 Windows 使用的类型/字体渲染的方法。一旦我在一台 Windows 机器上安装了 MacType,除非安装注入的字体引擎,否则我现在几乎无法使用它。请参阅https://github.com/snowie2000/mactype