原理 | 进程注入 - 远程线程注入
2022-9-18 21:5:23 Author: 猫因的安全(查看原文) 阅读量:7 收藏

最近研究进程注入,也是边学边记录。以下是个人记录
1
前置知识
  • 提起远程线程注入,大家有可能会理解为我在广西,你在北京,我注入你的线程。其实并不是这个样子。

  • 系统在每次运行一个exe 程序的时候系统会默认分配一个4G 的地址空间,给这个exe 程序。

  • 然而,我们的系统有16G、32G等等。那岂不是只能运行几个exe 程序了?

  • 其实我们在给exe 程序分配地址空间的时候,是一个虚拟地址空间。

  • 通过映射的方式,映射到我们的真实机上。

  • 每个exe 程序之间是不能互相访问的。比如QQ 和 微信不能互相访问。如果可以访问,就会非常不安全。

2
注入初识

DLL文件,是动态链接库,我们执行程序的时候最后调用的都是这个DLL文件。

  每一个进程中都会有多个线程。远程线程注入,简单来说,就是指在一个指定的进程中,开辟一个线程的内存地址空间,然后用来执行加载我们的DLL文件,或者是我们想做的事情。

3
注入原理
  • 我们的程序在执行的过程中,都会创建一个进程、线程,然后通过进程线程加载DLL文件,从而执行我们想要的功能。

  • 在我们的系统程序中, 有两个DLL程序Kernel32.dlluser32.dll在大部分程序上都会调用的DLL

  • 其中Kernel32.dll 文件中有一个LoadLibraryW函数。这个函数是用来应用程序调用动态链接库的函数。

  • 为什么使用这两个函数呢?

  • 因为同一个DLL,在不同的进程中,不一定被映射(加载)到同一个内存地址下

    • 有的加载的是同一个DLL文件的A函数

    • 有的加载的是同一个DLL文件的B函数

  • 但是Kernel32.dlluser32.dll 是例外的,他们总是被映射到进程的内存首选地址。

  • 因此在所有使用这个DLL文件的进程中,这两个DLL的内存地址是相同的

4
注入思路

思路一:

  • 获取一个目标线程的句柄

  • 在我们的进程中得到LoadLibrary 函数的地址,因为加载时这个DLL文件的内存地址相同,所以这个地址也是目标进程中的地址

  • 传入我们想要注入进去的DLL的地址

  • 开启一个线程(开辟一块内存地址空间)

  • 让这个线程,在我们想要注入的目标进程中工作,这个线程的作用就是使用LoadLibrary 这个函数加载我们想注入的DLL

思路二:

  • 提升进程的权限:因为我们要将程序注入到别的进程中,所有我们的权限一定要够,比如说我们的系统有system用户和administrator用户等

  • 查看我们获得到的特权信息是什么

  • 调节进程权限

  • 查找窗口,就是获得指定程序的进程,可以理解为就是获取窗口句柄

  • 根据窗口句柄获取进程的PID(Process ID)

  • 根据PID获取进程句柄。由于PID只是一个进程的序号,不够强大,所以我们需要获取一个更加强大的控制进程的东西,叫做进程句柄。这个进程句柄可以控制exe的关闭、暂停、执行等等行为。

  • 根据进程句柄在指定的进程中申请一块内存地址空间。拿到进程句柄后,就可以对exe进行操作了。由于我们想要学习的进程注入,所以演示进程注入

  • DLL的路径写入到远程进程中

  • 在远程进程中开辟一个线程

5
项目实战

好了,经过上面的学习,我们对远程线程注入有了一个基本的了解。虽然有了了解,但是还是对远程线程注入的过程、原理以及使用有一些模糊,不太理解。(个人学习过程中的感悟)

我们需要配合一些远程线程注入的实战来进一步了解

项目一:

要求:编写一个程序,在程序中,指定注入的DLL的文件的路径以及被注入进程的信息。当我们点击注入后,就可以将DLL程序注入到进程中。

成果展示:

项目二:

要求:编写一个工具,我们可以自己选择路径,可以自己选择要注入的进程。点击注入可以完成注入

成果展示:

完整项目步骤

远程线程注入文件分享

文中所涉及完整代码以及详细笔记。关注本公众号,回复8003领取。

本文参考一些哔哩哔哩上的顿开教育的里奇老师的视频。


文章来源: http://mp.weixin.qq.com/s?__biz=Mzk0NjMyNDcxMg==&mid=2247496630&idx=1&sn=ed87d049ebd5b0aa06b61c8bf147555d&chksm=c3056631f472ef27bed3ffe8f073673de8a06af0a69e5d0c2e00b40de4f153762f2f791d4c0a#rd
如有侵权请联系:admin#unsafe.sh