最近研究进程注入,也是边学边记录。
以下是个人记录
-
提起远程线程注入,大家有可能会理解为我在广西,你在北京,我注入你的线程。其实并不是这个样子。
-
系统在每次运行一个exe 程序的时候系统会默认分配一个4G 的地址空间,给这个exe 程序。
-
然而,我们的系统有16G、32G等等。那岂不是只能运行几个exe 程序了?
-
其实我们在给exe 程序分配地址空间的时候,是一个虚拟地址空间。
-
通过映射的方式,映射到我们的真实机上。
-
每个exe 程序之间是不能互相访问的。比如QQ 和 微信不能互相访问。如果可以访问,就会非常不安全。
DLL文件,是动态链接库,我们执行程序的时候最后调用的都是这个DLL文件。
每一个进程中都会有多个线程。远程线程注入,简单来说,就是指在一个指定的进程中,开辟一个线程的内存地址空间,然后用来执行加载我们的DLL文件,或者是我们想做的事情。
-
我们的程序在执行的过程中,都会创建一个进程、线程,然后通过进程线程加载DLL文件,从而执行我们想要的功能。
-
在我们的系统程序中, 有两个DLL程序
Kernel32.dll
和user32.dll
在大部分程序上都会调用的DLL -
其中
Kernel32.dll
文件中有一个LoadLibraryW函数。这个函数是用来应用程序调用动态链接库的函数。 -
为什么使用这两个函数呢?
-
因为同一个DLL,在不同的进程中,不一定被映射(加载)到同一个内存地址下
-
有的加载的是同一个DLL文件的A函数
-
有的加载的是同一个DLL文件的B函数
-
但是
Kernel32.dll
和user32.dll
是例外的,他们总是被映射到进程的内存首选地址。 -
因此在所有使用这个DLL文件的进程中,这两个DLL的内存地址是相同的
思路一:
-
获取一个目标线程的句柄
-
在我们的进程中得到
LoadLibrary
函数的地址,因为加载时这个DLL文件的内存地址相同,所以这个地址也是目标进程中的地址 -
传入我们想要注入进去的DLL的地址
-
开启一个线程(开辟一块内存地址空间)
-
让这个线程,在我们想要注入的目标进程中工作,这个线程的作用就是使用LoadLibrary 这个函数加载我们想注入的DLL
思路二:
-
提升进程的权限:因为我们要将程序注入到别的进程中,所有我们的权限一定要够,比如说我们的系统有system用户和administrator用户等
-
查看我们获得到的特权信息是什么
-
调节进程权限
-
查找窗口,就是获得指定程序的进程,可以理解为就是获取窗口句柄
-
根据窗口句柄获取进程的PID(Process ID)
-
根据PID获取进程句柄。由于PID只是一个进程的序号,不够强大,所以我们需要获取一个更加强大的控制进程的东西,叫做进程句柄。这个进程句柄可以控制exe的关闭、暂停、执行等等行为。
-
根据进程句柄在指定的进程中申请一块内存地址空间。拿到进程句柄后,就可以对exe进行操作了。由于我们想要学习的进程注入,所以演示进程注入
-
DLL的路径写入到远程进程中
-
在远程进程中开辟一个线程
好了,经过上面的学习,我们对远程线程注入有了一个基本的了解。虽然有了了解,但是还是对远程线程注入的过程、原理以及使用有一些模糊,不太理解。(个人学习过程中的感悟)
我们需要配合一些远程线程注入的实战来进一步了解
项目一:
要求:编写一个程序,在程序中,指定注入的DLL的文件的路径以及被注入进程的信息。当我们点击注入后,就可以将DLL程序注入到进程中。
成果展示:
项目二:
要求:编写一个工具,我们可以自己选择路径,可以自己选择要注入的进程。点击注入可以完成注入
成果展示:
完整项目步骤
远程线程注入文件分享
文中所涉及完整代码以及详细笔记。关注本公众号,回复8003领取。
本文参考一些哔哩哔哩上的顿开教育的里奇老师的视频。
原文始发于微信公众号(猫因的安全):原理 | 进程注入 - 远程线程注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论