如何在远程线程中创建新的线程

创建远程线程实现DLL注入 最近在学逆向,学到了DLL注入。DLL注入有三种方式:创建远程线程(该方法不适用于win7及以上的OS),使用注册表(APPInit_DLLs,该方法不适用于xp及以上的OS)。消息勾取(SetWindowsHookEx()API )。下面介绍一下关于创建远程线程的实验。 远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateT 阅读详情
 
如何在远程线程中创建新的线程
对待这个问题,首先要考虑一个重要因素。即远程线程已经不是原先进程中的线程,由其创建的线程,必然存在于远程线程所在的进程当中。所以应该按照对待创建远程线程这个问题一样处理。也就是说,也要为这个线程在远程进程中开辟一段内存空间。
首先,定义一个结构体,其中包含与远程线程和远程线程要创建的线程的相关项目:
typedef struct _RemoteParam{
       FARPROC             LoadLibrary;
       FARPROC             GetProcAddress;
       FARPROC             CreateThread;
       LPVOID                Injection;
       char        lpszLibFileName[16];
       char        lpszMessageBox[64];
       char        lpszTextThread1[8];
       char        lpszTextThread2[8];
}REMOTEPARAM,*PREMOTEPARAM;
 
而后,将相应API进行映射,写入相应得参数:
REMOTEPARAM RemoteParam;
ZeroMemory(&RemoteParam,sizeof(REMOTEPARAM));
hModule =LoadLibrary("kernel32.dll");
RemoteParam.LoadLibrary                         = GetProcAddress(hModule,"LoadLibraryA");
RemoteParam.GetProcAddress                   = GetProcAddress(hModule,"GetProcAddress");
RemoteParam.CreateThread                       = GetProcAddress(hModule,"CreateThread");
strcpy(RemoteParam.lpszLibFileName,"user32.dll");
strcpy(RemoteParam.lpszMessageBox,"MessageBoxA");
strcpy(RemoteParam.lpszTextThread1,"Test1");
strcpy(RemoteParam.lpszTextThread2,"Test2");
 
然后,将远程线程要创建之线程的线程函数的地址写入该结构体:
RemoteParam.Injection = (LPVOID)VirtualAllocEx(hProcess,
                                                                         0,
                                                                         4*1024,
                                                                         MEM_COMMIT|MEM_RESERVE,
                                                                         PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess,
                             RemoteParam.Injection,
                             &Injection,
                             4*1024,
                             0);
然后再按照创建远程线程的步骤,创建第一个远程线程:
PREMOTEPARAM pRemoteParam      =
(PREMOTEPARAM)VirtualAllocEx( hProcess,
                                                                  0,
                                                                  sizeof(REMOTEPARAM),
                                                                  MEM_COMMIT | MEM_RESERVE,
                                                                  PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess,
                             pRemoteParam,
                             &RemoteParam,
                             sizeof(REMOTEPARAM),
                             0)
 
PVOID pRemoteThread =VirtualAllocEx(hProcess,
                                                         0,
                                                         (SIZE_T)RemoteThreadProc/1024,
                                                         MEM_COMMIT | MEM_RESERVE,
                                                         PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess,
                             pRemoteThread,
                             &RemoteThreadProc,
                             (SIZE_T)RemoteThreadProc/1024,
                             0)
 
CreateRemoteThread(hProcess ,
                             NULL,
                             0,
                             (LPTHREAD_START_ROUTINE)pRemoteThread,
                             pRemoteParam,
                             0,
                             &dwThreadID);
 
在远程线程中则需要进行如下几个步骤,以创建新的线程,其中MessageBox仅仅是起到提示作用并不影响线程创建:
DWORD __stdcall RemoteThreadProc(PREMOTEPARAM lpParam)
{
       typedef  HMODULE     (WINAPI *PLoadLibraryA)(LPCTSTR);
typedef  FARPROC      (WINAPI *PGetProcAddress)(HMODULE,LPCSTR);
       typedef    int                  (WINAPI *PMessageBoxA)
(HWND hWnd,LPCTSTR,LPCTSTR,UINT);
              typedef    HANDLE (WINAPI *PCreateThread)
(LPSECURITY_ATTRIBUTES,
SIZE_T,
LPTHREAD_START_ROUTINE,
LPVOID,
DWORD,
LPDWORD);
 
       HMODULE            hUser             = NULL;
 
       PLoadLibraryA                            pLoadLibraryA;
       PGetProcAddress                        pGetProcAddress;
       PCreateThread                                   pCreateThread;
       PMessageBoxA                           pMessageBoxA;
 
       pLoadLibraryA                     = (PLoadLibraryA)lpParam->LoadLibrary;
       pGetProcAddress                 = (PGetProcAddress)lpParam->GetProcAddress;
       pCreateThread                            = (PCreateThread)lpParam->CreateThread;
      
       hUser                                  = pLoadLibraryA(lpParam->lpszLibFileName);
       pMessageBoxA                    = (PMessageBoxA)pGetProcAddress(hUser,lpParam->lpszMessageBox);
 
       pMessageBoxA(NULL,
lpParam->lpszTextThread1,
lpParam->lpszTextThread1,
MB_OK);
 
       pCreateThread(NULL,
                             0,
                             (LPTHREAD_START_ROUTINE)lpParam->Injection,
                             lpParam,
                             0,
                             NULL);
      
       return 0;
}
 
新的线程函数Injection则可以如此编写:
void Injection(PREMOTEPARAM lpParam)
{
       typedef  HMODULE     (WINAPI *PLoadLibraryA)(LPCTSTR);
typedef  FARPROC      (WINAPI *PGetProcAddress)(HMODULE,LPCSTR);
       typedef    int                  (WINAPI *PMessageBoxA)
(HWND hWnd,LPCTSTR,LPCTSTR,UINT);
 
       HMODULE            hModule         = NULL;
 
       PLoadLibraryA                            pLoadLibraryA;
       PGetProcAddress                        pGetProcAddress;
       PMessageBoxA                           pMessageBoxA;
 
       pLoadLibraryA                            = (PLoadLibraryA)lpParam->LoadLibrary;
       pGetProcAddress                        = (PGetProcAddress)lpParam->GetProcAddress;
 
       hModule                              = pLoadLibraryA(lpParam->lpszLibFileName);
       pMessageBoxA                    = (PMessageBoxA)pGetProcAddress(hModule,lpParam->lpszMessageBox);
 
       pMessageBoxA(NULL,
lpParam->lpszTextThread2,
lpParam->lpszTextThread2,
MB_OK);
}
 
(由于这些片断都是从我的程序摘抄下来并且修改过的,所以没有进过测试)
程序很简单,构思也不是很复杂,希望能跟朋友们一起分享我的这一点点经验。其他API的调用我想,也不外乎是使用类似的方法。本人水平有限,希望广大编程爱好者多加指正!
 
创建远程线程 (1)用VirtualAllocEx函数在远程进程的地址空间中分配一块内存。 (2)用WriteProcessMemory函数反映Dll的路径名复制到第1步分配的内存中 (3)用GetProcAddress函数来得到LoadLibrary W(或A)函数在Kernel32.dll的真实地址。 (4)用CreateRemoteThread函数在远程进程中创建一个线程,让新线程调用正确的Lo... 阅读详情

相关推荐

远程线程的创建步骤(附源码)

(1)用VirtualAllocEx函数在远程进程的地址空间中分配一块内存。(2)用WriteProcessMemory函数反映Dll的路径名复制到第1步分配的内存中(3)用GetProcAddress函数来得到LoadLibrary W(或A)函数在Kernel32.dll的真实地址。(4)用CreateRemoteThread函数在远程进程中创建一个线程,让新线程调用正确的LoadLibrar...

KnightOnHorse的博客 1134

fastapi后台任务中使用多线程调用数据库session报错

望着代码陷入自我怀疑,再三确认了多线程的代码没问题,想起来如题的坑,于是在子线程的函数中加入try catch,通过logging主动捕获并打印出异常。批量耗时任务创建的api,最开始采用for循环串行执行耗时任务,使用的是请求初始化时的数据库session,技术上没问题。于是修改子线程函数,增加参数,接受一个新创建的会话。上来直接改造多线程,发现子线程很快stoped,根本没执行。但业务上需要优化成并发。终于,世界恢复平静!

NQS__的博客 910

远程线程注入

文章目录一、流程二、演示三、完整代码 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

fastapi 实践(四)非阻塞启动

参考: https://www.cnblogs.com/selfcs/p/17240902.html。

cliffordl的专栏 3100

014年8月—研习创建远程线程.e

研习创建远程线程 CreateRemoteThread 函数的调用

易语言创建远程线程

易语言创建远程线程源码,创建远程线程,CALL,GetProcessID,OpenProcess,VirtualAllocEx,WriteProcessMemoryByte,CreateRemoteThread,WaitForSingleObject,CreateToolhelp32Snapshot,Process32Next,Process32First,ExitProcess,CloseHandle,VirtualFreeEx

fastapi执行环境

普通函数 fastapi使用多线程执行, 注意全局数据加锁问题。async函数 使用协程运行,注意使用 异步函数,不然容易卡住。

牟涛的博客 990

【Fluent】太阳辐射模型—Solar Ray Tracing

一、引言Fluent提供了一个太阳能负载模型,可用于计算进入计算域的太阳光线的辐射效应。该模型可以分为:太阳光线追踪和太阳辐照。其中太阳辐照需要使用DO或MC模型,直接向辐射模型提供外光束方向和强度参数。太阳光线追踪不限制辐射模型,可以独立于辐射方程使用,甚至可以在辐射模型off的情况下使用。本文主要介绍太阳光线追踪模型。该模型非常适用于以下领域汽车气候控制 (ACC) 应用建筑物中的人体热舒适建模应用该模型使用着色算法进行太阳光线追踪。光线会透过半透明的面加载在照射面上。

a5567899的博客 7590

关于fastapi的协程与多线程设置

关于fastapi中的协程与多线程设置

laomao9112的博客 3599

[pytorch] MedicalNet 3D Resnet预训练模型迁移学习实战:从分割到分类的代码改造

本文详细介绍了如何利用PyTorch对MedicalNet 3D ResNet预训练模型进行迁移学习,从分割任务改造为分类任务。通过解析模型结构、调整分类头、加载预训练权重及优化训练策略,帮助开发者在医疗影像领域快速实现高效模型部署。文章还涵盖了数据预处理、增强技巧及模型轻量化等实用内容。

kmeans3miner的博客 246

PyTorch 深度学习实战(28):对比学习(Contrastive Learning)与自监督表示学习

本文实现了基于对比学习的自监督表征学习框架,通过 InfoNCE 损失在 CIFAR-10 数据集上学习到具有判别性的特征表示。实验表明,仅使用线性分类器即可达到 82% 以上的验证准确率,证明了对比学习的有效性。在下一篇文章中,我们将深入计算机视觉的核心任务之一——《目标检测与 YOLO 实战》,探讨如何利用深度学习实现高效的目标检测系统。

m0_60414444的博客 2385

python fastAPI 多线程使用

python fastAPI 多线程使用

m0_37684144的博客 4605

Materials - UE5中的PivotPainter

可以使用3DS Max Script中的脚本(Pivot Painter)对模型进行处理,让每个Element都有自己的Pivot Point,来方便控制和制作一些特殊的顶点动画效果;

GT的虚幻引擎文档 1289

"SYSTEM"用户创建进程

sysrun.ccl sysrun.cpp Shlwapi.lib advapi32.lib#include #include 

975

【R语言-生存分析之观察生存率计算】

全人群肿瘤登记资料常用的统计分析指标包括发病率、死亡率、现患率以及生存率等,其中肿瘤生存率是评估肿瘤治疗效果和肿瘤负担的必要指标,其计算涉及肿瘤患者的发病、 死亡和随访三个方面的资料, 数据整理和计算过程均较为复杂, 如何及时、 准确地计算肿瘤生存率, 并使其可以在不同地区、 不同人群、不同时期间被客观公正地比较和评价,仍然是统计学家们一直在研究的主题。

weixin_46579654的博客 5441

汽车电子开发必看:AUTOSAR MCAL层SPI驱动配置全解析(基于EB tresos)

本文深入解析了AUTOSAR MCAL层SPI驱动的核心配置,基于EB tresos工具详细阐述了通道、外部设备、作业与序列等关键概念。重点剖析了多设备共享总线时的资源管理与实时性调优策略,特别是SpiJobPriority参数的决定性影响,并提供了常见配置陷阱的实战排查指南,旨在帮助汽车电子工程师高效完成SPI驱动配置。

weixin_29188043的博客 293

【笔记】【Java并发编程实战】1Introduction(附线程安全的代码示例)

注:本文为笔者阅读《JAVA并发编程实战》(Brian Goetz等注)一书的学习笔记,如有错漏,敬请指出。 线程无处不在 即使程序没有显式地创建任何线程,框架也可能为你创造了一些线程。 每一个Java应用程序都使用线程。当JVM启动后,它创建一些线程来进行自身的常规管理(垃圾回收、终结处理),以及运行一个main函数的主线程。 Timer创建执行延迟的任务线程。(线程安全的) servlet(线程安全的)和RMT等组件框架会创建线程池,池中线程调用组件方法。RMI使你能够调用在另一个JVM上运行的对象的方

julia_xueli的博客 367

Vue2 - 最新实现接入使用天地图及卫星视图切换功能,在国家天地图上自由切换地图显示类型(卫星视图/地形视图/卫星混合/地形混合/普通视图)vue天地图切换视图显示改成卫星风格,切换地图图层完整代码

vue2,nuxt2,天地图,视图,卫星,地图类型切换,vue天地图,改成卫星视角,在线地图切换,来回切换卫星图,天地图如何实现来回切换卫星图,地形图,卫星视图,vue中使用天地图自定义样式切换地图图层,切换报错,加载出错,卫星图太卡,地图图层更换,vue安装集成天地图详细示例源码,切换地图的样式,在天地图中如何将地图的类型随意更换,提供多种视图模式用户自由点击更换,VUE引入天地图卫星版,详细教程示例源码代码,天地图切换卫星用什么api,卫星视角API方法,vue2卫星天地图,能改地图的显示方式,图层类型

🏆 前端领域优质创作者 4143

webservice以及线程应用

new Thread() { public void run() { Client client=null; try{ URL url = new URL(urlS...

sxcailjy的博客 116

跟踪雷达点迹处理

1,点迹定义: 假设研究对象为位置x和速度v,预测值是根据这一时刻的x值、v值来预测下一时刻的x、v;测量值是根据传感器也就是雷达得到的,因为各种误差的存在,这两个值都不准确,所以把他们加权融合,得到一个新的量—状态值。 点迹就是所谓的测量值,由雷达对同一个目标探测到的一系列点(假设目标静止,但由于误差的存在,会扫描出不止一个点),航迹对应状态值,是点迹和预测轨迹的加权融合。 2,雷达信号和点迹处理关系: 3,点迹航迹处理流程 4,仿真 clear all; RealData=G

wangjie36的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

git删除分支和新建分支

Git删除分支和新建分支

五更依旧朝花落的博客 753

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

监视远程线程的创建

监视远程线程的创建作者: 一块三毛钱邮件: zhongts@163.com日期: 2004.12.29    远程线程技术被大量的使用在木马、蠕虫等软件当中,通过在别的进程中插入线程的方式运行代码,具有相当高的隐蔽性。比如常见的 Explorer.exe 进程中有十几个线程同时运行,在其中插入一个线程后,谁也分辨不出来哪个就是插入的远程线程。本文提供了一种方法可以监视远程线程的创建活动,记录下来远

老裴 1337

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

(转载)监视远程线程的创建

作者: 一块三毛钱邮件: zhongts@163.com日期: 2004.12.29    远程线程技术被大量的使用在木马、蠕虫等软件当中,通过在别的进程中插入线程的方式运行代码,具有相当高的隐蔽性。比如常见的 Explorer.exe 进程中有十几个线程同时运行,在其中插入一个线程后,谁也分辨不出来哪个就是插入的远程线程。本文提供了一种方法可以监视远程线程的创建活动,记录下来远程线程的 ID 等

Kendiv's Box 2427

win32相关(远程线程和远程线程注入)

作用:创建在另一个进程的虚拟地址空间中运行的线程。

weixin_43754657的博客 1124

逆向工程核心原理——DLL注入——创建远程线程

什么是DLL注入? dll注入是一种将Windows动态链接库注入到目标进程中的技术,具体的说,就是将dll文件加载到一个进程的虚拟地址空间中。对某个进程进行dll注入,也就意味着dll模块与该进程共用一个进程空间,则这个dll文件就有了操纵这个进程空间的能力,以达到执行dll模块中的代码修改进程数据的能力。dll注入技术在逆向工程,病毒,外挂,调试等技术领域都有广泛的应用,它也是Windows API hook技术的基础。 改善功能与修复Bug改善功能与修复Bug DLL注入技术可用于改善功.

weixin_46601374的博客 3759
上一篇: 终于又可以写Blog了
下一篇: 往往在一念之间!
brain_
博客等级 码龄22年 4粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值