远程线程注入(简单样例以及原理)

远程线程注入(简单样例以及原理)

注入的目标是将我们的代码注入到目标进程的地址空间中

注入通常可以根据注入的内容分为两种类型:

  1. shellcode注入
    :这种注入是将我们的代码直接注入到目标内存中,这就要保证我们的代码在贴到其他地址上后仍然能够正常执行
    :这种方式优点是不容易检测,因为他的特征并不明确,缺点也很明显就是代码比较麻烦也不容易维护
  2. 模块注入
    :模块注入的原理是通过在目标进程中创建一个新的线程让他帮我们执行loadlibrary的方式去加载一个新的模块到地址空间中
    优点就是这种代码很好写,并且不需要我们自己做重定位等pe文件的加载动作,缺点则是特征比较明显

我们今天通过一个简单的测试代码来了解一下模块注入的大体流程

  1. 找到目标进程
  2. 获取目标进程的handle
  3. 在目标进程的地址空间中写入我们要加载的模块的文件名
  4. 为目标进程创建新的线程

下面来看一下我们要注入的模块代码
这个模块中主要是创建了一个静态线程对象,循环打印内容

// pch.cpp: 与预编译标头对应的源文件#include "pch.h"
#include <stdio.h>DWORD WINAPI threadProc(LPVOID lpThreadParameter
) {for (size_t i = 0; i < 10; i++){printf("%d", i);Sleep(1000);}return 0;
}class MyClass
{
public:MyClass();~MyClass();private:HANDLE t = { 0 };
};MyClass::MyClass()
{DWORD threadid;t = CreateThread(NULL, 0, threadProc, NULL, 0, &threadid);
}MyClass::~MyClass()
{CloseHandle(t);
}static MyClass c;

然后是我们要注入的目标进程的代码
这个代码也很简单,就是循环打印

#include <Windows.h>
#include <stdio.h>int main() {//LoadLibrary(L"Dll1.dll");for (size_t i = 0; i < 1000; i++){printf("-------%d-------\n", i);Sleep(1000);}return 0;
}

然后是存放我们的注入动作的代码

int main() {UINT PID = 10744;// 这边可以通过tlhelp32或者psapi.dll提供的函数来找到pid//这边暂时不做提权,正常的话应该通过processtoken提权一下,可以查msdn上有详细说明HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);const WCHAR* dllName = L"Dll1.dll";LPVOID addr = VirtualAllocEx(h, NULL, 0x100, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);if (addr == NULL) return -1;DWORD realBytes = 0;WriteProcessMemory(h, addr, dllName, MAX_PATH + 1, &realBytes);DWORD threadId;// 这边简单说一下,能够直接将loadlibrary函数作为线程的起始地址有三个原因// 1:loadlibrary这个函数是kernel32.dll中的基本所有的win32进程都会存在这个dll// 2:因为kernel32.dll这类的win32dll都是提前做了地址绑定并且imagebase都是在比较高的位置基本上不会触发重定位,// 所以在每个进程内的函数地址都是一样的// 3:可以发现loadlibrary的函数的声明结构跟createthread所需的函数结构是一样的所以可以直接用HANDLE hThread = CreateRemoteThread(h, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibrary, addr, 0, &threadId);if (hThread == NULL) return -1;WaitForSingleObject(hThread, -1);VirtualFreeEx(h, addr, NULL, MEM_RELEASE);CloseHandle(h);CloseHandle(hThread);system("pause");return 0;
}

接下来我们来看一下注入的效果
首先是没有注入的时候就是一直在打印
在这里插入图片描述
这是注入后的进程控制台打印效果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/46760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交叉熵--损失函数

目录 交叉熵&#xff08;Cross Entropy&#xff09; 【预备知识】 【信息量】 【信息熵】 【相对熵】 【交叉熵】 交叉熵&#xff08;Cross Entropy&#xff09; 是Shannon信息论中一个重要概念&#xff0c; 主要用于度量两个概率分布间的差异性信息。 语言模型的性能…

Azure静态网站托管

什么是静态网站托管 Azure Blob的静态网站托管是一项功能&#xff0c;它允许开发人员在Azure Blob存储中托管和发布静态网站。通过这个功能&#xff0c;您可以轻松地将静态网页、图像、视频和其他网站资源存储在Azure Blob中&#xff0c;并直接通过提供的URL访问这些资源。 官…

使用VisualStudio制作上位机(一)

文章目录 使用VisualStudio制作上位机(一)写在前面第一部分:创建应用程序第二部分:GUI主界面设计使用VisualStudio制作上位机(一) Author:YAL 写在前面 1.达到什么目的呢 本文主要讲怎么通过Visual Studio 制作上位机,全文会以制作过程来介绍怎么做,不会去讲解具体…

css 实现svg动态图标效果

效果演示&#xff1a; 实现思路&#xff1a;主要是通过css的stroke相关属性来设置实现的。 html代码: <svgt"1692441666814"class"icon"viewBox"0 0 1024 1024"version"1.1"xmlns"http://www.w3.org/2000/svg"p-id"…

操作符详解(1)

1. 操作符分类&#xff1a; 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 2. 算术操作符 - * / % 1. 除了 % 操作符之外&#xff0c;其他的几个操作符可以作用于整数和浮点数。 2. 对…

Redis中的缓存穿透、雪崩、击穿的原因以及解决方案

一&#xff0c;什么是缓存穿透、雪崩、击穿&#xff1f; 1、缓存穿透&#xff1a; 是指用户查询数据&#xff0c;在数据库没有&#xff0c;自然在缓存中也不会有。这样就导致用户查询的时候&#xff0c;在缓存中找不到&#xff0c;每次都要去数据库再查询一遍&#xff0c;然后…

宇宙原理:黑洞基础。

宇宙原理&#xff1a;黑洞基础TOC 黑洞的数理基础&#xff1a;一个由满数组成的数盘&#xff0c;经过自然演进&#xff0c;将会逐步稀疏化、最终会向纯数方案发展&#xff1b;纯数方案虽然只有{2}、无数&#xff08;虚拟&#xff09;、{0,1,2,3}&#xff08;虚拟&#xff09;、…

1.82亿南沙区“数字城市”城市运营中心建设项目采购需求

1. 总体技术需求 项目整体框架 遵循“一个中枢、两大中台、基础底座”的总体架构&#xff0c;构建全区城市治理中枢&#xff0c;实现连通上下、衔接左右、分拨处置和协同指挥等作用。 本项目系统的总体架构分为一个中枢、两大中台、基础底座共五部分&#xff0c;在政务云平台…

Kubernetes介绍和部署,使用

1.k8s kubernetes来自希腊语舵手,google, 8是ubernete 1.管理docker容器 go写的(并发) 2.用于微服务 3.cncf云原生基金会 2.mater(管理节点)和nodes(微服务节点) 3.部署 1.minikube kind官网在线测试语句 2.kubeadm(官方)(安装比较方便 添加) 3.github下载二进制包 4.yum(老) …

netty(一):NIO——处理消息边界

处理消息边界 为什么要处理边界 因为会存在半包和粘包的问题 1.客户端和服务端约定一个固定长度 优点&#xff1a;简单 缺点&#xff1a;可能造成浪费 2.客户端与服务端约定一个固定分割符 *缺点 效率低 3.先发送长度&#xff0c;再发送数据 TLV格式&#xff1a; type…

查询Oracle和MySQL数据库中当前所有连接信息

查询Oracle当前所有连接信息&#xff1a; SELECTs.sid AS 会话ID,s.serial# AS 序列号,s.username AS 用户名,s.osuser AS 操作系统用户,s.machine AS 客户端机器,s.program AS 客户端程序,s.status AS 会话状态,s.sql_id AS 正在执行的SQL_ID,t.sql_text AS 正在执行的SQL文本…

[前端系列第7弹]Vue:一个渐进式的 JavaScript 框架

Vue 是一个用于构建用户界面的 JavaScript 框架&#xff0c;它具有以下特点&#xff1a; 渐进式&#xff1a;Vue 可以根据不同的使用场景&#xff0c;灵活地选择使用库或者框架的方式&#xff0c;从而实现渐进式的开发。响应式&#xff1a;Vue 通过数据绑定和虚拟 DOM 技术&am…

【ROS】参数服务器--理论模型与参数操作(C++)

一、概念介绍 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据。 作用&#xff1a;存储一些多节点…

C语言:库函数atoi及其模拟实现

atoi&#xff1a; atof是C语言标准库中的一个函数&#xff0c;用于将字符串转换为对应的浮点数/整形数。 函数接受一个参数str&#xff0c;该参数是一个指向以null结尾的字符串的指针。atof函数会尝试将这个字符串转换为一个浮点数&#xff0c;并返回转换后的结果。 要注意的是…

LeetCode 面试题 01.01. 判定字符是否唯一

文章目录 一、题目二、C# 题解 一、题目 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同&#xff0c;点击此处跳转。 示例 1&#xff1a; 输入: s “leetcode” 输出: false 示例 2&#xff1a; 输入: s “abc” 输出: true 限制&#xff1a; 0 < le…

飞机打方块(五)游戏音乐

一、新建节点 1.在Start场景中新建Music节点&#xff0c;绑定canvas 2.在Game场景中新建Music节点 3.新建节点 4.新建Music脚本&#xff0c;绑定Canvas Music.ts const { ccclass, property } cc._decorator;ccclass export default class NewClass extends cc.Component {p…

[Go版]算法通关村第十三关白银——数组实现加法和幂运算

目录 数组实现加法专题题目&#xff1a;数组实现整数加法思路分析&#xff1a;复杂度&#xff1a;Go代码 题目&#xff1a;字符串加法思路分析&#xff1a;复杂度&#xff1a;Go代码 题目&#xff1a;二进制加法思路分析&#xff1a;复杂度&#xff1a;Go代码 幂运算专题题目&a…

*args无疑是解决函数重载的一大创新利器--我用可变数量参数解决了函数重载问题

需求分析 最近遇到这样一个需求&#xff1a;根据用户传递的不同参数数量执行不同的功能。我这几天一直在思考这个问题&#xff1a;如何根据参数数量去执行不同的功能&#xff0c;最初的设想是把不需要的参数设置为NONE或者""再或者" "(后两者引号均表示传空…

Flink 流式读写文件、文件夹

文章目录 一、flink 流式读取文件夹、文件二、flink 写入文件系统——StreamFileSink三、查看完整代码 一、flink 流式读取文件夹、文件 Apache Flink针对文件系统实现了一个可重置的source连接器&#xff0c;将文件看作流来读取数据。如下面的例子所示&#xff1a; StreamExe…

【无标题】QT应用编程: QtCreator配置Git版本控制(码云)

QT应用编程: QtCreator配置Git版本控制(码云) 感谢&#xff1a;DS小龙哥的文章&#xff0c;这篇主要参考小龙哥的内容。 https://cloud.tencent.com/developer/article/1930531?areaSource102001.15&traceIdW2mKALltGu5f8-HOI8fsN Qt Creater 自带了git支持。但是一直没…