线程注入

windows-CODE注入(远程线程注入) 远程线程注入 阅读详情

转载URL:http://www.cnblogs.com/ciey/archive/2009/03/22/1419242.html



先解释一下远程进程,其实就是要植入你的代码的进程,相对于你的工作进程(如果叫本地进程的话)它就叫远程进程,可理解为宿主。

首先介绍一下我们的主要工具CreateRemoteThread,这里先将函数原型简单介绍以下。

CreateRemoteThread可将线程创建在远程进程中。

函数原型
HANDLE CreateRemoteThread(
  HANDLE hProcess,                          // handle to process
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
  SIZE_T dwStackSize,                       // initial stack size
  LPTHREAD_START_ROUTINE lpStartAddress,    // thread function
  LPVOID lpParameter,                       // thread argument
  DWORD dwCreationFlags,                    // creation option
  LPDWORD lpThreadId                        // thread identifier
);
参数说明:
hProcess
[输入] 进程句柄
lpThreadAttributes
[输入] 线程安全描述字,指向SECURITY_ATTRIBUTES结构的指针
dwStackSize
[输入] 线程栈大小,以字节表示
lpStartAddress
[输入] 一个LPTHREAD_START_ROUTINE类型的指针,指向在远程进程中执行的函数地址
lpParameter
[输入] 传入参数
dwCreationFlags
[输入] 创建线程的其它标志

lpThreadId
[输出] 线程身份标志,如果为NULL,则不返回

返回值
成功返回新线程句柄,失败返回NULL,并且可调用GetLastError获得错误值。

接下来我们将以两种方式使用CreateRemoteThread,大家可以领略到CreateRemoteThread的神通,它使你的代码可以脱离你的进程,植入到别的进程中运行。

第一种方式,我们使用函数的形式。即我们将自己程序中的一个函数植入到远程进程中。

步骤1: 首先在你的进程中创建函数MyFunc,我们将把它放在另一个进程中运行,这里以windows

计算器为目标进程。
static DWORD WINAPI MyFunc (LPVOID pData)
{
//do something
//...
//pData输入项可以是任何类型值
//这里我们会传入一个DWORD的值做示例,并且简单返回
return *(DWORD*)pData;
}
static void AfterMyFunc (void) {
}
这里有个小技巧,定义了一个static void AfterMyFunc (void);为了下面确定我们的代码大小

步骤2: 定位目标进程,这里是一个计算器
HWND hStart = ::FindWindow (TEXT("SciCalc"),NULL);

步骤3: 获得目标进程句柄,这里用到两个不太常用的函数(当然如果经常做线程/进程等方面的 项目的话,就很面熟了),但及有用
DWORD PID, TID;
TID = ::GetWindowThreadProcessId (hStart, &PID);

HANDLE hProcess;
hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,PID);

步骤4: 在目标进程中配变量地址空间,这里我们分配10个字节,并且设定为可以读

写PAGE_READWRITE,当然也可设为只读等其它标志,这里就不一一说明了。
char szBuffer[10];
*(DWORD*)szBuffer=1000;//for test
void *pDataRemote =(char*) VirtualAllocEx( hProcess, 0, sizeof(szBuffer), MEM_COMMIT,

PAGE_READWRITE );

步骤5: 写内容到目标进程中分配的变量空间
::WriteProcessMemory( hProcess, pDataRemote, szBuffer,(sizeof(szBuffer),NULL);

步骤6: 在目标进程中分配代码地址空间
计算代码大小
DWORD cbCodeSize=((LPBYTE) AfterMyFunc - (LPBYTE) MyFunc);
分配代码地址空间
PDWORD pCodeRemote = (PDWORD) VirtualAllocEx( hProcess, 0, cbCodeSize, MEM_COMMIT,

PAGE_EXECUTE_READWRITE );

步骤7: 写内容到目标进程中分配的代码地址空间
WriteProcessMemory( hProcess, pCodeRemote, &MyFunc, cbCodeSize, NULL);

步骤8: 在目标进程中执行代码

HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) pCodeRemote,
pDataRemote, 0 , NULL);
DWORD h;
if (hThread)
{
::WaitForSingleObject( hThread, INFINITE );
::GetExitCodeThread( hThread, &h );
TRACE("run and return %d
",h);

::CloseHandle( hThread );
}

这里有几个值得说明的地方:
使用WaitForSingleObject等待线程结束;
使用GetExitCodeThread获得返回值;
最后关闭句柄CloseHandle。

步骤9: 清理现场

释放空间
::VirtualFreeEx( hProcess, pCodeRemote,
                cbCodeSize,MEM_RELEASE );

::VirtualFreeEx( hProcess, pDataRemote,
                cbParamSize,MEM_RELEASE );

关闭进程句柄
::CloseHandle( hProcess );

第二种方式,我们使用动态库的形式。即我们将自己一个动态库植入到远程进程中。

这里不再重复上面相同的步骤,只写出其中关键的地方.
关键1:
在步骤5中将动态库的路径作为变量传入变量空间.
关键2:
在步骤8中,将GetProcAddress作为目标执行函数.

hThread = ::CreateRemoteThread( hProcess, NULL, 0,
            (LPTHREAD_START_ROUTINE )::GetProcAddress(
             hModule, "LoadLibraryA"),
             pDataRemote, 0, NULL );

另外在步骤9,清理现场中首先要先进行释放我们的动态库.也即类似步骤8执行函数FreeLibrary

hThread = ::CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE )::GetProcAddress(
hModule, "FreeLibrary"),
(void*)hLibModule, 0, NULL );

好了,限于篇幅不能够介绍的很细,在使用过程中如有疑问可向作者咨询.(开发环境:windows2000/vc6.0)

注:以上方法1主要是利用进程地址空间映射实现代码和数据的注入,然后使用CreateRemoteThread在目标进程地址空间中创建一新线程执行注入的代码,方法二是在新线程中执行LoadLibrary调用装入DLL。可在这个DLL的入口函数中编写相关代码,如果需要驻留可以创建工作线程并返回true,类似IST;如果无需驻留可以直接返回false,目标进程会自动卸载DLL,然后终止注入的线程。这个技术也可以实现跨进程回调,如在驱动的IST中可以使用这种方法通过调用目标进程的某个回调函数通知其某个事件的到来。
Windows-注入技术学习总结 目录 1.远程线程注入 2.消息钩子注入 3.输入法注入 4.注册表注入 5.EIP注入 6.APC注入 7.SSDT替换 总结 1.远程线程注入 原理:利用CreateRemoteThread()函数,将自己创建的的线程加载到远程空间进程里去执行。 CreateRemoteThread function (processthreadsapi.h) - Win32 apps | Microsoft Docs 注入流程: OpenProcess 打开被注入进程句柄。 Vir 阅读详情

相关推荐

远程线程注入

文章目录一、流程二、演示三、完整代码 DLL程序: 一、流程 1、获取进程句柄 2、计算Dll路径名长度,并且要加上0结尾的长度 3、在目标进程分配内存 4、拷贝DLL路径名到目标进程的内存 5、获取模块地址 6、获取LoadLibraryA函数地址 7、创建远程线程,加载DLL 8、关闭句柄 二、演示 1、获取进程句柄 //获取进程句柄 hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID); if(hProcess == NUL

qq_41232519的博客 954

一文读懂远程线程注入

在红队行动中,红队的目的都是要在不暴露自身行动的前提下,向蓝队发动攻击。他们使用各种技术和程序来隐藏C2连接和数据流。攻击活动的第一步是获得初始访问权。他们会使用定制的恶意软件和有效载荷来躲避防杀软和EDR等防御工具。本文涉及知识点实操练习:[DLL注入型病毒实验](https://www.hetianlab.com/expc.do?wemedia)(通过实验了解DLL注入型病毒的攻击过程)进程注入是用来逃避防御机制的重要技术之一。

Karka_的博客 660

12-远程线程注入

远程线程注入

https://www.yuque.com/onlyxiu-123com 727

代码注入(线程注入)

代码注入概念 代码注入是一种向目标进程插入独立运行代码并使之运行的技术,其一般调用CreateRemoteThread() API以远程线程的形式运行插入的代码,亦称为线程注入。代码以线程过程(ThreadProcedure)形式插入,而代码中使用的数据则以线程参数的形式插入,即代码和数据是分别注入的。   代码注入与DLL注入的区别 DLL注入适用于代码量大且复杂的情况,而代码注入适用于...

Mi1k7ea 7434

从零构建RK3568视频处理管线:C++ V4L2捕获与RKMPP硬编解码实战

本文详细介绍了在RK3568平台上,使用C++语言从零构建高性能视频处理管线的实战过程。核心内容包括通过V4L2接口高效捕获摄像头视频流,并利用RKMPP硬件编码器实现零拷贝的H.264/H.265硬编码。文章深入讲解了设备初始化、DMA缓冲区管理、编码器参数配置以及主循环协同工作等关键步骤,旨在帮助开发者构建低延迟、高效率的嵌入式视频应用。

weixin_29193359的博客 87

开关电源环路补偿--开关电源进阶知识补充1

笔记 一 . 做开关电源环路补偿时候为了使得环路更加稳定。 1 .-- > 希望开关电源的相位裕量在45° 以上, 2. – > 希望开关电源的增益裕量在10db 以上 3. – > 希望开关电源增益曲线在过0db 时候以20db /dec 斜率下降(体现1个极点) 4. – > 希望开关电源补偿之后的带宽达到开关频率的是1/5 ~1/10,用以原理开关电源的开关噪音。 左边图示电源瞬态拉载和释放负载的时候输出电压存在明显的振铃,说明这个目前的环路相位裕量(phase m

qq_29776365的博客 1万+

Windows程序设计学习笔记——线程(三)线程注入

本文先介绍了C中的线程创建操作,再介绍了C++标准库的多线程操作,最后着重介绍了远程线程注入技术,远程线程注入就是在其他进程中创建我们的线程,我们的线程会把我们的dll载入到注入进程中,这便是远程线程注入技术,接着介绍了相关api,最后介绍了线程注入的相应步骤...

weixin_48088263的博客 1480

Pytorch(一) Pytorch 的安装

安装步骤 1.检查是否有合适的GPU, 若有安装Cuda与CuDNN 2.下载pytorch安装文件,进行pytorch的安装 检查电脑是否有合适的GPU 在桌面上右击如果能找到NVIDA控制面板,则说明该电脑有GPU。控制面板如下,并通过查看系统信息获取支持的Cuda版本 点击 帮助->点击 系统信息 弹出下面的对话框,在驱动程序版本那一栏就能看到该计算机使用的驱动版本。 ...

开开心心 25万+

DLL注入_远程线程注入

什么是线程注入? 线程注入,是通过开启远程线程的方式,将DLL加载到目标宿主进程中的常用方式。 什么是动态链接库? 首先Windows中链接库分为两种:动态链接库DLL、静态链接库LIB。 ① 静态链接库:在运行的时候就直接把代码全部加载到程序中,调用方式比如: #prama comment (lib,"Psapi.lib") ② 动态链接库:在需要的时候加载,加载方式为...

VI___ 4081

PCB测试点

PCB测试点

qq_31444421的博客 1万+

值得苦练的100道Python经典练手题(全网最全,附详细答案,建议收藏)

这100道Python练习题涵盖了从基础语法到高级算法、从数据库操作到Web开发的各个方面,是备考数据库系统工程师的绝佳素材。建议按照章节顺序逐一练习,遇到难点可反复钻研,真正掌握每一道题背后的知识点。通过这些练习,不仅能提升Python编程能力,还能加深对数据库系统原理的理解,为考试和实际工作打下坚实基础。

yue_yun_的博客 9397

windows线程注入

shellcode:本质上也是一段普通的代码,只不过特殊的编程手法,可以在任意环境下,不依赖于原有的依赖库执行。

m0_55282610的博客 716

实验室LIMS系统选型指南:从赛默飞到金现代,5大主流方案横评

本文深入分析了实验室LIMS系统选型的5大核心维度,包括架构选择、行业适配性、合规性设计、智能化程度和成本模型。通过对比赛默飞、金现代等主流厂商的优劣势,提供实战避坑策略,帮助实验室管理者做出明智决策,提升运营效率和合规水平。

plum99的博客 259

远线程注入

远线程注入是指一个进程在另一个进程中创建线程的技术,是一种病毒木马所青睐的注入技术,同时也是一种很巧妙、很经典的DLL注入技术。 远线程注入主要有以下几个步骤 1.OpenProcess函数 打开现有的本地线程对象 函数声明 HANDLE WINAPI OpenProcess( _In_ DWORD dwDesiredAccess, _In_ BOOL bInheritHandle, _In_ DWORD dwProcessId ); 2.VirtualAllocEx函数 向我们要指定的进.

苞米地里捉小鸡的博客 791

【系统架构设计师-2026上半年真题】案例分析-参考答案及详解(回忆版)

架构评估与设计:通过入侵检测系统的案例分析,阐述质量属性(性能/可用性/安全性/可修改性)的匹配方法,推荐管道-过滤器风格处理实时数据流,并设计8个核心构件实现数据采集到告警的全流程处理。 高并发优化方案: 分析悲观锁(排他锁/共享锁)与乐观锁的特性差异,提出乐观锁通过版本号/CAS实现,悲观锁适用于强一致性场景。 给出Redis优化三手段:分布式锁控制临界资源、Lua脚本保证原子操作、热点数据多级缓存,结合消息队列削峰填谷。 分层架构实践: 智

数据知道的博客 1689

手把手教你用 Cursor 写一个完整的 Web 应用(含前后端 + 部署)

本文介绍如何利用Cursor AI工具从零开发一个完整的全栈待办事项Web应用。文章针对开发者常见痛点——无法独立完成项目闭环,提供了一套AI驱动的全栈开发范式。通过Vue3+Node.js+MySQL技术栈,全程由Cursor自动生成项目架构、前后端代码、数据库设计,并解决联调、部署等关键问题。重点展示了如何用AI完成:项目规划与架构设计、后端接口开发、前端页面实现、跨域联调、打包优化及云端部署全流程。该方法将传统需要3-5天的开发工作压缩至1小时内完成,产出规范可上线的项目,特别适合想突破"碎

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 640

什么是远程线程注入?

远程线程注入 首先,要说明白远程线程注入,必须得弄明白什么是远程线程以及什么是注入! 远程线程 这里的远程指的是别的进程空间,大家应该都在自己代码中或多或少运用过多线程,这里给出常见的win32创建线程接口的使用,如下: 本地线程创建 1 、官方给的接口: HANDLE CreateThread( [in] LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全描述符,一般填NULL [in] SIZE_T dwStac

航行的土豆的博客 7854

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

DLL注入之使用远程线程注入

原理分析: 远程线程注入是很常见且古老的注入方式之一。其原理是根据Win32函数CreateRemoteThread在目标进程中创建一个线程,然后加载注入DLL。无巧不成书,创建线程的所需的回调函数恰恰与LoadLibrary声明结构几乎一模一样。 //Thread PROC DWORD WINAPI ThreadProc(_In_ LPVOID lpParameter); //显式加载D...

even的博客 1249

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Dll注入技术之远程线程注入

Dll注入技术之远程线程注入测试环境系统:Windows 10 64bit注入目标: win7 64bit 计算器(这个软件用着习惯,所以我从win7上拷贝到win10上了)主要思路:1.使用进程PID打开进程,获得句柄2.使用进程句柄申请内存空间3.把dll路径写入内存4.创建远程线程,调用LoadLibrary5.释放收尾工作或者卸载dll主要函数://打开进程HANDLE WINAPI Op...

Hades的博客 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Windows】远程线程注入

将一个不属于某进程的DLL文件加载到该进程当中,称之为DLL注入。Dll注入初衷是给第三方的应用程序进行一个功能的扩展。从技术细节来说,DLL注入就是命令目标进程自行调用API,加载用户指定的DLL文件。下图描述了DLL注入的概念。从图中可以看到,myhack.dll已被强制插入notepad进程(本来notepad并不会加载myhack.dll加载到进程中的myhack.dll与已经加载到进程中的DLLuser32.dll) —样,拥有访问。

一点一点变好 1013

VC++ 实现线程注入

在基于黑客软件、杀毒软件、系统应用软件开发过程中,需要使用一种方式:将外部DLL通过线程形式注入到其他进程中。这样的过程就叫注入线程或者叫线程注入。  #include "stdafx.h"    #include "windows.h"          // ========== 定义一个代码结构,本例为一个对话框============    struct MyData   {    cha

尹成的技术博客 3199

6-DLL注入之远程线程注入

原因是对于kernel32.dll这种系统dll,是进程创建时最先被加载的,所以kernel32.dll中的所有导出函数,其函数地址对于所有相同位数的进程都是相同的。通过本进程获取的LoadLibraryA函数地址也就是另一个相同位数的进程LoadLibraryA函数的地址。第二:通过CreateRemoteThread函数给指定进程创建线程执行LoadLibraryA函数时,传入的LoadLibraryA函数地址是LoadLibraryA函数在本进程中的地址,而不是在指定进程中的地址。

weixin_40332490的博客 1477
上一篇: 说说汇编
下一篇: 全局变量重定位
Matrix_Designer
博客等级 码龄16年 58粉丝 296原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值