DLL远线程注入基础

1、进程和线程的区别

1).什么是进程

(来源:百度百科)
计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。

什么是线程

(来源:百度百科)
是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

总结:

进程就是一个正在运行的应用程序,是资源分配的最小单位,而一个进程中有着多个线程共同协作来完成一个进程中的不同功能。举个简单的例子,做饭是一个进程,而洗菜,放调料,翻炒这些则为线程。

DLL远线程注入基础

CreateRemoteThread函数及说明

在另一个进程的虚拟地址空间中创建一个线程。

CreateRemoteThread函数原型:

HANDLE WINAPI CreateRemoteThread(
__in HANDLE hProcess,
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out LPDWORD lpThreadId
);

参数说明:(来源:百度百科)

hProcess [in]

线程所属进程的进程句柄.
该句柄必须具有 PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE,和PROCESS_VM_READ 访问权限.

lpThreadAttributes [in]

一个指向 SECURITY_ATTRIBUTES 结构的指针, 该结构指定了线程的安全属性.

dwStackSize [in]

线程栈初始大小,以字节为单位,如果该值设为0,那么使用系统默认大小.

lpStartAddress [in]

在远程进程的地址空间中,该线程的线程函数的起始地址.远程进程中线程的起始位置。

lpParameter [in]

传给线程函数的参数.

dwCreationFlags [in]

线程的创建标志.
值————含义
0------------线程创建后立即运行
CREATE_SUSPENDED 0x00000004——————————线程创建后先将线程挂起,直到 ResumeThread 被调用.
STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000————————dwStackSize 参数指定为线程栈预订大小,如果STACK_SIZE_PARAM_IS_A_RESERVATION没有被指定,dwStackSize 参数指定为线程栈分配大小.

lpThreadId [out]

指向所创建线程ID的指针,如果创建失败,该参数为NULL.

进行DLL远程注入
#include <iostream>
#include <Window.h>

void Inject(int pid,char* Path)
{
	// 1.打开需要注入的进程,成功则返回目标进程的句柄
	// 打开目标进程,成功则返回进程的句柄,失败则返回NULL;第一个参数为获取当前进程可能的所有权限,第二个为是否继承句柄,第三个为进程ID(ProcessId)
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACESS,FALSE,pid);

	// 2.申请一块内存给自己写好的DLL的路径
	LPVOID pReturnAddress = VirtualAllocEx(hProcess, NULL, strlen(Path) + 1, MEN_CONMMIT, PAGE_READWRITE);
	
	// 3.将路径写入pReturnAddress中,并将此内存写入目标进程中
	WriteProcessMemory(hProcess, pReturnAddress, Path, strlen(Path) + 1, Null);

	// 4.将DLL加载到调用该进程的地址空间中,并获取LoadLibraryA的句柄,参数为LoadLibraryA所在库的DLL。
	HMODULE hModule = LoadLibrary("kernel132.dll");
	
	// 5.需要远程的调用LoadLibraryA方法去加载自己的DLL,所以要先得到LoadLibraryA的函数地址。
	LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTIINE)GetProcAddress(hModule, "LoadLibraryA");

	// 6.创建一个远程线程,并将DLL注入。成功则返回新线程句柄,失败则返回NULL。
	HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, pReturnAddress, 0, NULL);

	// 7.等待线程返回句柄,防止阻塞
	WaitForSingleObject(hThread, 2000);

	// 8.防止内存泄漏
	CloseHandle(hThread);
	CloseHandle(hProcess);
}

int main()
{
	 // Inject();
	system("pause");
	return 0;
}
卸载残留的dll模块
// 语法如下
FreeLibrary(HMODULE);
补充:HANDLE、HMODULE的区别:

Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。
系统对内核对象以链表的形式进行管理,载入到内存中的每一个内
核对象都有一个线性地址,同时相对系统来说,在串列中有一个索引位置,这个索引位置就是内核对象的handle。
HMODULE 是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址。

结束语

本文为个人看视屏的学习笔记,功力不足,仅供参考,如发现不足还望指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值