3.1 DLL注入:常规远程线程注入
动态链接库注入技术是一种特殊的技术,它允许在运行的进程中注入DLL动态链接库,从而改变目标进程的行为。DLL注入的实现方式有许多,典型的实现方式为远程线程注入,该注入方式的注入原理是利用了Windows系统中提供的CreateRemoteThread()这个API函数,该函数第四个参数是准备运行的线程,我们将LoadLibrary()函数填入其中,这样就可以执行远程进程中的LoadLibrary()函数,进而将我们自己准备的DLL加载到远程进程空间中执行,DLL在被装载后则会自动执行初始化部分。
远程线程注入的实现可以总结为如下流程;
- 1.OpenProcess 打开进程获取进程句柄
- 2.VirtualAllocEx 在目标进程申请一块内存
- 3.WriteProcessMemory 将注入DLL路径写出到内存中
- 4.GetProcAddress 获得LoadLibraryA函数的内存地址
- 5.CreateRemoteThread 创建远线程,实现DLL注入
远程注入的核心实现原理是利用了CreateRemoteThread函数,CreateRemoteThread是Windows系统的一个函数,能够在指定的进程上下文中创建一个线程。该函数可以使一个进程在另一个进程中执行任意代码,并返回新线程的句柄。在DLL注入中,我们可以使用该函数在目标进程的上下文中创建一个新线程,从而使我们的DLL代码被加载和运行。该函数的声明如下所示;
HANDLE WINAPI CreateRemoteThread(
HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
参数说明:
- hProcess: 目标进程的句柄。
- lpThreadAttributes: 线程安全描述符,通常为NULL。
- dwStackSize: 新线程的初始化栈大小,通常为0。
- lpStartAddress: 线程入口点,指向要在新线程中执行的代码。
- lpParameter: 传递给线程入口点的参数。
- dwCreationFlags: 线程创建标志,通常为0。
- lpThreadId: 如果非NULL,返回新线程的ID号。
在DLL注入中,我们可以使用它来在指定的进程上下文中执行我们的DLL代码,使其被加载和运行。这段代码的实现很容易理解,我们以注入32为DLL为例,代码如下所示;
#include <windows.h>
#include <iostream>
#include <TlHelp32.h>
#include <tchar.h>
// 传入进程名称返回该进程PID
DWORD FindProcessID(LPCTSTR szProcessName)
{
DWORD dwPID = 0xFFFFFFFF;
HANDLE hSnapShot = INVALID_HANDLE_VALUE;
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
Process32First(hSnapShot, &pe);
do
{
if (!_tcsicmp(szProcessName, (LPCTSTR)pe.szExeFile))
{
dwPID = pe.th32ProcessID;
break;
}
} while (Process32Next(hSnapShot, &pe));
CloseHandle(hSnapShot);
return dwPID;
}
// 远程线程注入
BOOL CreateRemoteThreadInjectDll(DWORD Pid, char* DllName)
{
HANDLE hProcess = NULL;
SIZE_T dwSize = 0;
LPVOID pDllAddr = NULL;
FARPROC pFuncProcAddr = NULL;
// 打开注入进程
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
if (NULL == hProcess)
{
return FALSE;
}
// 得到注入文件的完整路径
dwSize = sizeof(char) + lstrlen(DllName);
// 在对端申请一块内存
pDllAddr = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
if (NULL == pDllAddr)
{
return FALSE;
}
// 将注入文件名写入到内存中
if (FALSE == WriteProcessMemory(hProcess, pDllAddr, DllName, dwSize, NULL))
{
return FALSE;
}
// 得到LoadLibraryA()函数的地址
pFuncProcAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
if (NULL == pFuncProcAddr)
{
return FALSE;
}
// 启动线程注入
HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFuncProcAddr, pDllAddr, 0, NULL);
if (NULL == hRemoteThread)
{
return FALSE;
}
// 关闭句柄
CloseHandle(hProcess);
return TRUE;
}
int main(int argc, char *argv[])
{
DWORD pid = FindProcessID("lyshark.exe");
std::cout << "进程PID: " << pid << std::endl;
bool flag = CreateRemoteThreadInjectDll(pid, (char *)"d://hook.dll");
std::cout << "注入状态: " << flag << std::endl;
return 0;
}
3.1 DLL注入:常规远程线程注入的更多相关文章
- 安全之路 —— 无DLL文件实现远程线程注入
简介 在之前的章节中,笔者曾介绍过有关于远程线程注入的知识,将后门.dll文件注入explorer.exe中实现绕过防火墙反弹后门.但一个.exe文件总要在注入时捎上一个.dll文件着 ...
- windows-CODE注入(远程线程注入)
远程线程注入(先简单说,下面会详细说)今天整理下代码注入(远程线程注入),所谓代码注入,可以简单的理解为是在指定内进程里申请一块内存,然后把我们自己的执行代码和一些变量拷贝进去(通常是以启线程的方式) ...
- 安全之路 —— 借助DLL进行远程线程注入实现穿墙与隐藏进程
简介 大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文 ...
- 详细解读:远程线程注入DLL到PC版微信
一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以 ...
- 远程线程注入dll,突破session 0
前言 之前已经提到过,远线程注入和内存写入隐藏模块,今天介绍突破session 0的dll注入 其实今天写这个的主要原因就是看到倾旋大佬有篇文章提到:有些反病毒引擎限制从lsass中dump出缓存,可 ...
- 远程线程注入DLL突破session 0 隔离
远程线程注入DLL突破session 0 隔离 0x00 前言 补充上篇的远程线程注入,突破系统SESSION 0 隔离,向系统服务进程中注入DLL. 0x01 介绍 通过CreateRemoteTh ...
- 远程线程注入DLL
远程线程注入 0x00 前言 远程线程注入是一种经典的DLL注入技术.其实就是指一个新进程中另一个进程中创建线程的技术. 0x01 介绍 1.远程线程注入原理 画了一个图大致理解了下远程线程注入dll ...
- 远程线程注入突破SESSION 0
远程线程注入突破SESSION 0 SESSION 0 隔离 在Windows XP.Windows Server 2003,以及更老版本的Windows操作系统中,服务和应用程序使用相同的会话(Se ...
- 远程线程注入方法CreateRemoteThread
最近在整理学习Windows注入方面的知识,这个远程注入前面早写过,现在看看人家博客的理解整理,整理, 需要源码的可以到我的github上下载. 链接是 https://github.com/Ars ...
- 安全之路 —— 无DLL文件实现远程进程注入
简介 在之前的章节中,笔者曾介绍过有关于远程线程注入的知识,将后门.dll文件注入explorer.exe中实现绕过防火墙反弹后门.但一个.exe文件总要在注入时捎上一个.dll文件着实是怪麻烦的,那 ...
随机推荐
- 4个工具,让 ChatGPT 如虎添翼!
LightGBM中文文档 机器学习统计学,476页 机器学习圣经PRML中文版 经典著作<机器学习:概率视角 让 ChatGPT 如虎添翼! ChatGPT 很好用,其核心是prompt的运用, ...
- Spring 学习笔记(3)控制反转 IoC
本篇文章主要对 Spring 框架中的核心功能之一控制反转 (IOC,Inversion of Control)进行介绍,采用理论 + 实战的方式给大家阐述其中的原理以及明确需要注意的地方. 控制反转 ...
- POJ 3159 :Candies 【线性差分约束 链式前向星 栈优化SPFA】
Candies POJ - 3159 题意: 给N个小朋友分糖, 给出M组约束a, b, c表示b的糖果不能比a多c个以上, 求1号和N号的最大糖果差异数 题解: 非常显然的线性查分约束问题 对于a, ...
- POJ 1236 Network of Schools (连通图 - Garbow 算法)
POJ 1236 Network of Schools 校园网:给定N所学校和网络,目标是分发软件其他学校都可收到,求①所需最少分发学校数:②若任选学校都能收到,最低新增边数. 思路:同一个强连通 ...
- Codeforces Round #736 (Div. 2) A~D
比赛链接:Here 1549A. Gregor and Cryptography 不难,观察一下就容易得知要想使得 \(p\pmod a = p\pmod b\) 令 \(a = 2,b=p - 1\ ...
- Codeforces Round #713 (Div. 3) Person Editorial
补题链接:Here 1512A - Spy Detected! 题意:找到唯一不同数的下标 复制数组然后比较 \(a_1\) int main() { ios_base::sync_with_stdi ...
- cookie和token验证区别
- qq快速打开邮箱的设置
登陆qq想快速进入邮箱,发现没有入口
- 理解 Kubernetes volume 和 共享存储
1. Kubernetes volume 文章 介绍了 Docker volume.与 docker volume 类似的,在 kubernetes 中存在 Pod 级别的 volume,Pod 的 ...
- 每天学五分钟 Liunx 011 | sudo
回顾前两节,在 001 中介绍了怎么添加用户及用户组,在 010 中介绍了从 client 端 ssh 到 server 的详细过程,那么接下来要介绍的就是是登陆到 server 之后如何切换用户了. ...