易语言远程线程注入

什么是远程线程

在一个进程中,调用CreateThread或CreateRemoteThreadEx函数,在另一个进程内创建一个线程(因为不在同一个进程中,所以叫做远程线程)。创建的线程一般为Windows API函数LoadLibrary,来加载一个动态链接库(DLL),从而达到在另一个进程中运行自己所希望运行的代码的目的。

可见,远程线程只是只不在同一个进程内创建的线程而已。

远程线程注入原理

远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的LoadLibrary()函数,进而将我们自己准备的DLL加载到远程进程空间中执行。

为什么选取API LoadLibrary

选 LoadLibrary 函数原因:

首先,它可以把一个Dll载入内存空间,并执行DLL初始化函数。

第二,LoadLibrary在Kernel32.dll中,Kernel32.dll的加载基址在每个进程中都是一样的所以,LoadLibrary在每个进程的地址就是一样的。

易语言远程线程注入步骤

1.获取窗口句柄

2.获得进程的PID

3.根据进程的PID,获得进程的句柄

4.根据进程的句柄,给进程申请额外内存空间

5.调用WriteProcessMemory,给进程写入DLL的路径

6.创建远程线程,执行我们的代码

7.调用退出代码,释放远程线程的dll

易语言远程线程注入用到的api

OpenProcess
根据进程PID,返回进程的句柄(OpenProcess,参数一,权限 参数二,句柄是否继承,参数三,进程的pid)

OpenProcess(
PROCESS_ALL_ACCESS,//参数一,选择所有权限,2035711
FALSE,参数二,不继承给false,
DwPid参数三,给我们上面获得的pid的值
);

VirtualAllocEx
给远程进程申请空间,并且返回空间的首地址(调用的API 是VirtualAllocEx)

VirtualAllocEx(hProHandle,NULL,0x1000,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
.版本 2
 
目标进程内存地址 = VirtualAllocEx (进程句柄, 0, 4096, 4096, 64)  ' 在远程进程中申请空间  存模块路径
' 0 自动分配保留页面的地址
' dwsize 欲分配内存的大小,是内存大小的整数倍

VirtualAllocEx说明:
第一个参数: 进程的句柄

第二个参数: 指定位置分配内存,给NULL为默认帮我们找块地方申请内存(不过这个地址会返回,所以不关心)

第三个参数: 内存分配多大,我们给了4096个字节大小,也就是一个分页(1000H)

第四个参数: 是否立即申请,还是保留这块内存,只能给我们用,但是还没申请,我们选择立即申请

第五个参数: 权限,你申请的这块内存是什么内存,只能读,还是只能写,还是只能执行,我们选择全部,可读可写可执行
WriteProcessMemory_文本型
调用WriteProcessMemory将我们的Dll路径,写入到远程进程中

WriteProcessMemory_文本型 (进程句柄, 目标进程内存地址, 模块名, 取字节集长度 (到字节集 (模块名)), 取变量地址 (成功写的字节))

WriteProcessMemory讲解:
第一个参数: 进程的句柄,可以用我们上面的OpenProcess返回的
第二个参数: 你要写入的地址,地址使我们VirtualAllocEx申请之后返回的(就是你要往哪个地址写内容)
第三个参数: 你写入的内容是什么,写入的内容使我们的Dll路径,上面已经拼接好了
第四个参数: 你写入的内容的大小是多大,这里我们用strlen求出来了
第五个参数: 实际写入的个数,我们不关心,如果你想知道,则定义一个变量,然后 取地址传入即可,因为是个指针
GetProcAddress
远程进程开辟线程,调用LoadLibrary,加载我们的dll,而你们知道,当dll被加载的时候,会有信息

所以我们在我们的dll里面写入我们自己的代码,比如这个dll被加载的时候,我们执行我们的代码,

LoadlibrarA地址 = GetProcAddress (GetModuleHandleA (“Kernel32.dll), “LoadLibraryA”)

CreateRemoteThread

CreateRemoteThread (进程句柄, 0, 0, LoadlibrarA地址, 目标进程内存地址, 0, 0)

核心代码就在这里,我们必须要知道,我们现在加载我们的DLL,而我们的DLL被加载的时候,就要执行自己的代码
所以这个时候就可以执行代码了
CreateRemoteThread讲解:
第一个参数: 进程的句柄(你要往哪个进程开辟线程)
第二个参数: 安全属性,句柄可否继承,不需要给NULL
第三个参数: 栈的大小,给0则默认
第四个参数: 函数执行,我们要开辟线程,开辟的线程叫做loadLibrary
第五个参数: 开辟线程传入的参数,我们知道,线程只有一个参数,而现在正好load也是一个参数,所以加载的参数就是我们的
写入远程进程内存的dll路径,而dll路径一旦启动,则会执行自己的代码(核心,一定掌握)
第六个参数: 创建的标志,默认给0
第七个参数: 线程的ID,不需要知道,给NULL


发布日期:

所属分类: 易语言 标签: