Windows程序设计学习笔记——线程(三)线程注入
来源:http://www.tudoupe.com时间:2022-08-01
1.C语言创建了一个线程:
頭部文件process.h
使用:
运行结果:

2.C++11线程
C++11将多个线程引入标准库,无需使用 CreateThread函数创建线程
参考 thread::thread - C++ Reference
线程构造函数如下:
等待线程结束:
std::thread::join() 类型void join()
注意:不能直接调system("pause")因为thread对象是一个与线程相关的对象,存储线程相关信息,所以析构时会认为绑定的线程没有结束而抛出异常
未绑定的线程对象到创建的线程中:
std:: thread ::detach() typevoid detach()
thread头文件的this_thread命名空间提供了其他一些访问和操作线程的相关函数,参考 this_thread - C++ Reference
获取线程id:
sleep
chrono是C++的事件库,duration是与时间有关的对象,参考 <chrono> - C++ Reference
使用示例:
其他时间度量如下:
全球变量和调制函数可以分类如下
使用 std::thread的优点是它可以跨平台,所以代码也运行在Linux上
3.远程线程注入
远程线程注入是其他进程中创建我们的线程,我们的线程将载入线程注入过程
创建远程线程API:
与CreateThread函数相比只是多了第一个参数进程句柄,比较如下两个函数
我们可以发现这两个功能形式基本上是相同的,所以我们可以用LoadLibrary作为调用线程的功能,但是我们不能直接通过LoadLibrary作为参数给CreateThread,然而,这是由于系统DLL(如内核32)。所有进程的地址是相同的(可能在重新启动后改变),我们可以使用下列函数来获取 LoadLibrary函数地址
注: LoadLibrary实际上是LoadLibraryA和LoadLibraryW,对于分别的ANSI和Unicode代码,当您得到函数地址时,您需要根据在DLL文件名中存储的编码格式选择哪一个 LoadLibrary函数才能得到
另一个问题是,指针到DLL文件路径是本地进程,而不是远程进程,我们把它作为参数传递到远程线程上,将远程线程转向负载库,因为每个过程都有自己的独立的虚拟内存空间,因此 loadlibrary无法从远程线程传递的参数地址中找到DLL文件路径,并可能导致远程进程因非法访问而崩溃,所以我们需要在远程进程的地址空间中存储DLL路径字符串,windows提供了下列功能,以便在其他进程中打开内存空间:
从上面可以看出,我们用远程线程将DLL注入分为以下步骤:
1.在远程过程的地址空间中打开一个内存空间
2.把DLL的路径写入打开的内存
3.获取 LoadLibraryW或LoadLibraryW函数地址(通过内核32)。(dll)
4.为输入参数创建远程线程
5.释放内存
6.使用GetProcAddress来获取在Kernel32.Addresses中的FreeLibrary功能
创建一个远程线程调用FreeLibrary来释放我们的DLL
示例:
cpp:
dll:
在实例中,DLL被注射到anantconc中,成功注射将在DLL主接收DLL_PROCESS_ATTACH之后执行
运行结果:

上一篇:win10 固定本机IP
相关新闻
- 2022-08-04 WPF的由来
- 2022-08-04 Win11勒索软件防护怎么打开?Win11安
- 2022-08-04 Windows系统jdk的配置
- 2022-08-04 Windows10 OneNote怎么重新登录?如何重
- 2022-08-04 超好用的 Windows 效率工具推荐
- 2022-08-04 Windows如何在CMD或PowerShell中配置代理
- 2022-08-04 powershell和cmd对比
- 2022-08-04 【QT】Windows下QT下载安装
- 2022-08-04 windows下 C++ 实现类属性的get和set方
- 2022-08-04 Win11快速助手在哪里?Win11打开快速
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
