首页
社区
课程
招聘
[求助]一个PE文件从系统到CPU解析的全部过程?
发表于: 2009-11-2 15:47 4346

[求助]一个PE文件从系统到CPU解析的全部过程?

2009-11-2 15:47
4346
PE文件就是EXE文件,它是怎么样一步一步被CPU解释的。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 100
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
e 什么东东。。。。
2009-11-2 16:03
0
雪    币: 273
活跃值: (64)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
说起来是相当麻烦的!其实就是一个内存映射和页机制!你看一下核心编程中的内存管理部分就行了!
2009-11-2 18:11
0
雪    币: 371
活跃值: (67)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
4
可以试着学习操作系统等知识.一步一步来...不要一下就想那么大...先找到一个细节点去学习...:)
2009-11-3 08:17
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
PE通过加载器加载到内存 cpu只能读一条一条的指令
2009-11-3 09:09
0
雪    币: 273
活跃值: (64)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
整理一下思路!
一个C++程序的执行过程
1:编辑
  写C++代码
2:预处理
g++ -E参数可以看到这个过程
3:汇编
g++ -S可以看到这个过程,只所以要有这个过程因为编译器的开发复杂工作量大的问题,最早的C++代码也只是通过cfront程序来翻译成C代码实现编译的!
4:编译:
转换成机器码
5:链接
  将相关的库 obj文件(VC)中链接成一个可装入模块!
到这里一个C++程序被制作成了一个可装入模块!我们运行的时候发生如下事情

6:系统分配PCB(EPROCESS)也就是建立一个空白内核对象
7:C/C++运行期库分配虚拟地址空间(虚拟的地址空间)
8:内存映射将EXE文件载入到地址空间
9:读取.rdata节,找到需要的DLL文件,DLL文件进入虚拟地址空间,这个过程采用的是装入时动态链接,WINDOWS还采用了一种机制——运行时动态链接,也就是说当程序执行发现需要DLL文件时候才会将真正的DLL文件载入到物理内存中如下面的函数
#include <windows.h>
#include <iostream>
using namespace std;
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
int main()
{
bool a;
if(cin>>a)
{
  MessageBox(NULL,"hello world!","MB_OK",MB_OK);

}
return 0;
}
  如果我们输入的BOOL值是0,则程序不会执行MessageBox函数,也就是说程序不需要USER32。DLL这时候它就会不将DLL文件载入!
  当然这是一个理想的情况,一般来说DLL文件是通过文件映射的来实现共享的!

10:初始化操作
初始化内核对象:EPROCESS结构,这个过程主要填写一些结构成员,也包括页表的物理地址!
初始化CPU状态:将EIP指向第一条指令,将ESP指令栈顶
初始化控制信息:包括进程的状态等!
  当然这些初始化操作都是用的虚拟地址!

11:建立主线程
  进程的调度是不效率的,所以WINDOWS采用线程调度的方法!建立主线程,线程进入任务队列!

12:将页表压入到PTR寄存器中(CR3)
当真正的主线程建立后,这时候才会将页表压入到CR3寄存器中

13:缺页中断
  当EIP指向第一条指令的时候,会发现是一个虚拟地址,于是产生缺页中断!

14:地址转换
  缺页中断后系统会通过地址转换也就是查询CR3寄存器所指向的页表物理地址,查询出虚拟地址所对应的物理地址,知道了物理地址后,通过SWAP交换技术将需要的页载入到物理内存!

15:执行指令
  这个过程中如果需要DLL文件中的函数,则可能会产生共享,在核心编程中有一个COPY-ON-WRITE的机制可以规结到这里
  这个过程主线程得到CPU时间片,时间到后,会将当前的执行现chang保存到内核对象的CONTEXT结构中,用于下一次的执行!
16:从程序来说,这个过程是行执行,启动函数而后执行主函数
  为什么要启动函数是因为主函数也有相关的参数,而这些参数必须通过类似的PUSH操作才可以入栈,这之前需要启动函数来获得!

17:其它的线程共同执行的问题

  这些是线程同步的一些内容!

18:结束
  return 0;
进程主线程内核对象的撤消等事情的完成!这个0用于设置EXITCODE等成员!

当然过程还可以更复杂,每一部分都需要用一大部的内容来写!总的来说一个PE文件的执行过程可以简单的理解为两部分
内存管理和CPU管理

对于CPU管理必然要解决进程控制、线程控制、线程调度、线程同步、线程通信这几方面的问题,每一部分都有所学的内容

对于内存管理,一般来说都可以划分为如下几个问题,第一内存分配,内存分配后必须解决内存保护的问题,不能出现乱访问的问题,内存扩展,也就是说虚拟内存的支持!
ps:和人感觉定位很关键,比如微机原理中的计算机系统层次结构,它给我们如下信息!
指令系统的学习:这个就是针对硬件来说的了
操作系统的学习:包括操作系统原理,算法,数据结构等等
系统软件的学习:包括编译原理 数据库等
应用程序的学习:包括主流的编程方法

  把一个层次结构弄好,然后再想一个问题,操作系统——用户与硬件之间的媒介程序,既然起媒介作用,所以任务有二,其一方便用户操作,其二有效管理硬件,你所说的执行过程就在操作系统的有效管理硬件部分,更确切的说就是操作系统的CPU与内存管理,因为计算机是一种存储程序原理,与人的大脑有一拼,当然,还包括I/O设备的管理,这些其实源于一种人机模型的逻辑,内容太多了,也不知道写了写什么,总之别人怎么说过程也是别人理解的,关键是你自己能够系统,21世界信息处理能力将成为一种人才必备的技能!
2009-11-3 20:41
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
LS 强悍~~~~~~~~~~~~~~~·
2009-11-3 20:56
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
个人建议:最好看看PE文件的格式,因为除了PE Header以外,大部分Segement是映射到内存中去的,所以找到第一条命令的入口地址,下面就是反汇编的过程了。 推荐工具:dumppe.exe和dumpbin.exe
2009-11-3 21:16
0
雪    币: 37
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢大家的回答,PE格式我是知道的,要解析这个格式,应该是系统底层来解析吧,不是某个程序吧,不然这个程序也是PE结构,那要谁来解析啊。
2009-11-4 14:12
0
雪    币: 347
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
Windows Loader
2009-11-4 14:38
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习中,大家讲解很仔细~
2009-11-4 15:24
0
游客
登录 | 注册 方可回帖
返回
//