zoukankan      html  css  js  c++  java
  • 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中的东西

    这时候发现进程只是一个空间的概念,真正用的人是线程

  • 相关阅读:
    VC++MFC对话框程序中给对话添加背景图片
    C++中的引用
    64位Ubuntu 13.04 安装Bochs 2.3.5
    笔记
    ORG 07C00H的意思
    编译三思
    《黑客与画家》笔记
    linux 2.6up的设备和设备驱动模型
    linux嵌入式系统驱动程序的阻塞与异步
    【转】PWM占空比和分辨率
  • 原文地址:https://www.cnblogs.com/0x7e/p/13814697.html
Copyright © 2011-2022 走看看