DLL注入(英语:DLL injection)是一种涉及计算机信息安全的特殊编程技术,它可以强行使一个进程加载某个动态链接库以在其私有地址空间内运行指定代码(往往是恶意代码)。[1]DLL注入的常见手段是用外部DLL库覆盖一个程序原先的DLL库,目的是实现该程序的作者未预期的结果。[2][3]比如,注入的代码可以挂钩(Hook)系统消息或系统调用[4][5],以达到读取密码框的内容等危险目的,而一般编程手段无法达成这些目的。[6]


能将任意代码注入任意进程的程序被称为DLL注入器(DLL injector)。

实现方式

编辑

Windows平台

编辑
  • 先利用恶意TSR程序调用恶意DLL,在恶意DLL初始化时,由TSR定位待注入目标程序并将其句柄传递至DLL中的注入函数,注入函数会绕过安全权限并向目标程序的私有地址空间申请一块预留空间,并在该空间内展开后续恶意操作[7]

Unix平台

编辑
  • 类Unix操作系统上,基于ld.so(在BSD上)和ld-linux.so(在Linux上)的动态链接器,可以通过在LD_PRELOAD环境变量中指定库的路径名,将任意库链接到新进程中,该变量可以全局设置或单独为某个进程设置。[8]

例如,在Linux系统上,这条命令会在启动时将文件"test.so"中的共享库链接到命令"prog"中:

LD_PRELOAD="./test.so" prog

这样的库可以像其他共享对象一样创建。在GCC中,这涉及到使用-fpic或-fPIC选项编译包含要链接的新全局变量的源文件[9],并使用-shared选项进行链接。[10]该库可以像其他库一样访问程序中声明的外部符号。

  • macOS上,以下命令会在启动时将文件"test.dylib"中的共享库链接到命令"prog"中:[11]
    DYLD_INSERT_LIBRARIES="./test.dylib" DYLD_FORCE_FLAT_NAMESPACE=1 prog
    
    在类Unix系统上,也可以使用基于调试器的技术。[12]

参考资料

编辑
  1. ^ James Shewmaker. Analyzing DLL Injection (PDF). GSM Presentation. Bluenotch. 2006 [2008-08-31]. (原始内容 (PDF)存档于2008-12-03). 
  2. ^ Iczelion. Tutorial 24: Windows Hooks. Iczelion's Win32 Assembly Homepage. August 2002 [2008-08-31]. (原始内容存档于2008-08-01). 
  3. ^ Rocky Pulley. Extending Task Manager with DLL Injection. CodeProject. CodeProject. 2005-05-19 [2008-09-01]. (原始内容存档于2009-02-06). 
  4. ^ Nasser R. Rowhani. DLL Injection and function interception tutorial. CodeProject. CodeProject. 2003-10-23 [2008-08-31]. (原始内容存档于2008-06-15). 
  5. ^ Ivo Ivanov. API hooking revealed. CodeProject. CodeProject. 2002-12-02 [2008-08-31]. (原始内容存档于2008-10-14). 
  6. ^ Robert Kuster. Three Ways to Inject Your Code into Another Process. CodeProject. CodeProject. 2003-08-20 [2008-08-31]. (原始内容存档于2008-07-20). 
  7. ^ Tutorial 24: Windows Hooks. [2018-04-14]. 原始内容存档于2008-08-01. 
  8. ^ UNIX man pages : ld.so (8). web.archive.org. 2009-02-06 [2024-06-10]. 
  9. ^ Code Gen Options - Using the GNU Compiler Collection (GCC). gcc.gnu.org. [2024-06-10]. 
  10. ^ Link Options - Using the GNU Compiler Collection (GCC). gcc.gnu.org. [2024-06-10]. 
  11. ^ Goldsborough, Peter. The LD_PRELOAD trick. Peter Goldsborough. [2024-06-10]. 
  12. ^ Code Injection into Running Linux Application. CodeProject. 2009-02-12 [2024-06-10] (美国英语). 

Category:计算机程序库 Category:线程 Category:Windows管理