目录

注入专题二:远线程注入CreateRemoteThread--论注入的多种方式

注入专题二:远线程注入CreateRemoteThread–论注入的多种方式

微尘网络安全

01远线程注入

今天 咱们来聊聊远线程注入,这种注入方式也是最常见 最方便的一种方式,他的原理是通过 使用 API CreateRemoteThread 这个函数来实现往某个程序里面注入一个线程。成功后 咱们就可以把被注入程序当成自己家了。但是也是有缺点的,有可能检测你代码段的地址位置,你是自己独立启动的线程,和正常走的流程肯定是不一样的。

02实现代码

1
2
3
4
5
6
7
8
9
HANDLE CreateRemoteThread(
  [in]  HANDLE                 hProcess,	//目标进程句柄
  [in]  LPSECURITY_ATTRIBUTES  lpThreadAttributes,	//指针,一般设置为NULL
  [in]  SIZE_T                 dwStackSize,	//纯种堆栈大小,一船设置为0,表示默认为1M
  [in]  LPTHREAD_START_ROUTINE lpStartAddress,	//线程函数的地址(目标进程代码地址)
  [in]  LPVOID                 lpParameter,	//线程参数
  [in]  DWORD                  dwCreationFlags,	//线程的创建标志
  [out] LPDWORD                lpThreadId	//输出参数,记录创建的远程线程的ID,不输出可传NULL
);

上面是API原型

第一个参数 传入进程句柄

第二个参数 可以传入安全描述符的结构体的,所有内核对象的通性,当然也可以NULL

第三个参数 栈空间大小,可以默认0

第四个参数 填写要注入的函数地址

第五个参数 函数的参数

第六个参数 标志位相关

第七个参数 线程ID

说到底 注入其实就是这个API 调用一下就实现了,但是大家可以先去思考一个问题 :我们是在A程序里面 写CreateRemoteThread函数的,那我们填写的函数地址和参数都是A程序里面的。 但是创建线程之后呢?

这个线程是要在B程序里面执行的。B程序 怎么能够获取到A空间地址里面的函数地址和内容呢?

解决了这个问题 远线程注入 这个事情就算是搞定了!!!

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/6fbc9e9d1af3109bbdca3568219ed2698f9bec62.png@942w_537h_progressive.png

1 进程句柄 没啥好说的把。。。可以用OpenProcess获取 窗口类目 标题 句柄啥的 各种方式都可以获取到

2.VirtualAllocEx 这个函数是在目标程序里面申请一段内存空间,然后用WriteProcessMemory写入 目的是为了存放咱们远线程的参数的 也就是为了存放我们要注入的是哪个DLL呀

3.我们启动的这个线程的函数地址就是Loadlibrary ,这个函数就是加载DLL 并且运行他,他是在kernel32.dll里面的,所以所有的程序都是有他的函数地址的

4 用完记得还原释放

这也是最轻松的方式了

核心代码也就这么些行 理解有问题的话可以来找我要源码或者和我探讨

公众号:微尘网络安全

专注分享网络安全 x64 c++ 逆向 反汇编 反调试 HOOK 注入 封包 内存等技术

感兴趣的人多我会继续更新此系列,把每种注入方式都讲一遍 并且附上源码