Win32之进程创建过程
0x01. 什么是进程?
进程提供程序所需要的资源,如:数据、代码等等
进程扮演的角色仅仅是为当前程序提供资源,或者代码,这就是进程所提供的,当时程序运行的状态和进程没有关系,进程可以看做空间的概念
例子:
进程相当于一个房子,房子里面的东西,这些东西就是进程提供的;房子里面走来走去的人,和使用东西的人,就是线程
你看到的这些东西就是进程
找到最后发现到 0x7FFEF000
结束(这里是个小Tips了)
一、内核空间分布:
在4GB内存的操作系统中,高2G的给内存空间操作系统(也就是内核)使用,这部分内存空间所有进程共享。
低2G的内存给各个进程使用,每个进程占有独立的内存空间,相互进程其内存之间并不影响。
所谓的进程不是一个文件组成,而是多个文件组成
0x02.进程的创建过程
1)、任何进程都是别的进程创建的
系统中的程序都是通过explorer.exe
创建的,这个程序调用了CreateProcess()
函数
2)、进程的创建过程
1、映射EXE文件
2、创建内核对象`EPROCESS`
3、映射系统DLL(ntdll.dll)
4、创建线程内核对象`ETHREAD`
5、系统启动线程
映射DLL(ntdll.LdrlnitializeThunk)
线程开始执行
举个例子,我们点击 A.exe 就会调用 CreateProcess() 函数
第一步:映射EXE文件
通过上面的图片知道我们程序映射的话不能放前64k,也不能在后64k,但是其实PE中就有写到需要放到哪里
假设从这开始,然后我们画图,写入进程A
第二步:创建内核对象 EPROCESS
每个对象都有自己的 EPROCESS 进程对象,也就是结构体
(无需深究)
第三步:映射系统DLL(ntdll.dll)
也就是说,不管什么进程创建的时候,都会有个 ntdll.dll,然后继续把ntdll映射进去
第四步:创建线程内核对象 ETHREAD
每个进程中都会自动创建一个线程,跟进程一样,因为一个进程就得有一个线程,启动一个进程就有EPROCESS 结构体
然后进程自动创建一个线程对象 ETHREAD
第五步:系统启动线程
每一个进程都是由一堆PE来的,比如一个EXE
带了一堆DLL
,然而dll
不是随便乱带的
因为PE创建中可能只使用到了 test.dll
中的某个函数,但是 test.dll
可能又带了 love.dll
中的东西
这时候发现进程只是一个空间的概念,真正用的人是线程
Win32之进程创建过程的更多相关文章
- linux内核学习之六 进程创建过程学习
一 关于linux进程概念的补充 关于进程的基本概念这里不多说,把自己的学习所得作一些补充: 1. 在linux内核中,系统最多可以有64个进程同时存在. 2.linux进程包含的关键要素:一段可执行 ...
- 进程创建过程详解 CreateProcess
转载请您注明出处:http://www.cnblogs.com/lsh123/p/7405796.html 0x01 CreateProcessW CreateProcess的使用有ANSI版本的Cr ...
- Android应用程序的进程创建过程
目录 前言 步骤 step1 Ams发起请求startProcessLocked step2 Zygote收到请求 step3 handleChildProc -- 进入子进程的世界 step4 Ru ...
- windows进程/线程创建过程 --- windows操作系统学习
有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...
- Android应用程序进程启动过程的源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址: http://blog.csdn.net/luoshengyang/article/details/6747696 Android 应用程序框架层创 ...
- Android应用程序进程启动过程(后篇)
前言 在前篇中我们讲到了Android应用程序进程启动过程,这一篇我们来讲遗留的知识点:在应用程序进程创建过程中会启动Binder线程池以及在应用程序进程启动后会创建消息循环. 1.Binder线程池 ...
- Android应用程序进程启动过程(前篇)
在此前我讲过Android系统的启动流程,系统启动后,我们就比较关心应用程序是如何启动的,这一篇我们来一起学习Android7.0 应用程序进程启动过程,需要注意的是“应用程序进程启动过程”,而不是应 ...
- 理解Android进程创建流程(转)
/frameworks/base/core/java/com/android/internal/os/ - ZygoteInit.java - ZygoteConnection.java - Runt ...
- 从整体上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换
学号后三位<168> 原创作品转载请注明出处https://github.com/mengning/linuxkernel/ 1.分析fork函数对应的内核处理过程sys_clone,理解 ...
随机推荐
- HTTP协议学习之Request学习
在开始前,我们首先对HTTP协议做个简单的了解 HTTP协议(Hyper Text Transfer Protocol) 超文本传输协议 名词非常的高大上,如果学过计算机网络这门课(再如果还有一点印象 ...
- NX二次开发-C#使用DllImport调用libufun.dll里的UF函数(反编译.net.dll)调用loop等UF函数
在写这篇文章的时候,我正在头晕,因为下班坐车回家,有些晕车了.头疼的要死.也吃不下去饭. 版本:NX11+VS2013 最近这一年已经由C++过度到C#,改用C#做应用程序开发和NX二次开发. C#在 ...
- SVN合并分支提示不是祖先关系
开发:dev 测试:test 开发完成后,需要合并到test然后部署,进入测试. F:主干 合并到那里,那里就是主干(要合并到的分支)[起始] T:分支 从那里合并那里就是分支[结束] 备注:需要精确 ...
- Python-信号量和线程池-semaphore ThreadPollExector
信号量 其实本质上是锁,Lock是单锁,信号量是指定多把锁,也就是说通过信号量指定多个数线程可以访问相同资源,一般情况下读操作可以有多个,但写操作同时只有一个 信号量模块 semaphore # 使用 ...
- opencv 中从cv::line和resize()函数
转自: https://blog.csdn.net/weixin_36340947/article/details/77095924 转自: https://blog.csdn.net/robinhj ...
- 从远程库github.com克隆代码时遇到了如下的问题:
Warning: Permanently added the RSA host key for IP address '13.250.177.223' to the list of known hos ...
- [学习笔记] Tarjan算法求桥和割点
在之前的博客中我们已经介绍了如何用Tarjan算法求有向图中的强连通分量,而今天我们要谈的Tarjan求桥.割点,也是和上篇有博客有类似之处的. 关于桥和割点: 桥:在一个有向图中,如果删去一条边,而 ...
- c#之task与thread区别及其使用
如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! ! --------------------------- ...
- 多测师讲解自动化测试 _RF模拟鼠标悬停_高级讲师肖sir
test19 Open Browser https://www.ctrip.com/?sid=155952&allianceid=4897&ouid=index gc Maximize ...
- 异步编程新方式async/await
一.前言 实际上对async/await并不是很陌生,早在阮大大的ES6教程里面就接触到了,但是一直处于理解并不熟练使用的状态,于是决定重新学习并且总结一下,写了这篇博文.如果文中有错误的地方还请各位 ...