DLL 注入基本知识

DLL 介绍

程序调用的 动态链接库。

DLL注入说明

向正在运行的 进程强制插入DLL 文件, DLL 注入命令目标进程调用LoadLibrary() 函数,从而加载 指定的 DLL文件 从而能够访问进程的内存 (在DLL注入后的文件 被运行时 会自动执行 DllMain() 从而实现自己想要的 目的)
进程调用 FreeLibrary 对引用计数 清零,卸载DLL。

DLL 的 运行机制

DLL 和 内存管理

进程将 dll 加载到 其虚拟地址, 然后进程可以 调用导出的 dll 函数
系统会给 dll 引用计数,线程加载 dll 引用计数加1

调用入口函数

进程 或 线程 引起函数被调用时,系统会调用 入口函数,(相当于linux 调用libc, 在 windows 下 可以存在 延迟绑定也可能 不存在,要看编译选项)
从而 可以让 实现 (分配内存,打开进程访问句柄)

延迟加载不是由被调用dll决定,而是由调用者决定
https://blog.csdn.net/dazhi316/article/details/7107995
https://blog.csdn.net/qingzai_/article/details/80512984

调用方法

  1. 加载时动态链接:对导出的DLL函数 进行显示调用,相当于直接当作本地代码。需要导入库链接。
  2. 运行时动态链接:使用 LoadLibraryLoadLibraryEx 函数在运行时加载DLL,加载后 调用 GetProcAddress 函数来获取 DLL 函数的地址,不会使用导入库。

DLLMain入口函数

DLL 的入口函数,由BOOL WINAPI DllMain() 函数定义。
DllMain ----> 定义的 DLL 实际名称
系统会在 进程 启动期间或调用LoadLibrary 之后会 加载DLL列表。

在调用 入口函数时 Kernal32.dll 肯定会被加载,而且在调用 Kernal32.dll 时不会加载其他 DLL 的函数

找到我们要注入的进程

遍历,列举

Process Walking

使用 CreateToolhelp32Snapshot 函数, 会记录所有进程的信息。
然后 Process32First 函数得到第一个 进程信息, 再通过 Process32Next 函数 得到下一个 直到得到 我们需要的 进程
脚本地址 :https://github.com/MalwareSec/ProcessInjection/blob/master/enum.cpp

DLL 注入

  1. 找到目标进程然后 ATTACH (OpenProcess())
  2. 在进程中为 要注入的 DLL 分配一块内存 VirtualAllocEx()
  3. 复制 DLL , 然后 确定 需要注入到的 目标地址 WriteProcessMemory
  4. 让调用函数执行 DLL (CreateRemoteThread(),NtCreateThreadEx()......)等函数

获得 进程 句柄,调用 VirtualAllocEx 分配一处内存,WriteProcessMemory 对内存写入 DLL ,调用 GetModuleHandle 找到 kernel32.dll 的地址,再用GetProcAddress 得到 LoadLibraryA 的地址,再用到 CreateRempteThread 函数 让线程 加载 LoadLibraryA 从而让目标 进程使用 DLL_PROCESS_ATTACH 执行 DLL的DllMain 入口函数

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注