1.a.c预处理为a.i编译为a.s汇编为a.o链接为a.exe。

2.进程是动态的,有生命周期,动态生成,动态消亡。程序是静态的,是指令与代码的集合。一个程序至少有一个进程,一个进程至少有一个线程,进程是资源分配的基本单位,线程是调度的基本单位。

3.windows中.exe .dll .sys均为pe格式,Linux中.elf为pe格式.

4.eop为程序的入口点,oep为原入口点。程序可能套壳,壳的入口点为eop。壳运行时还会到原入口点执行,称原入口点为oep。imagebase为内存基地址,默认为0x000000。VA为pe文件在内存的虚拟地址。RVA是相对于imagebase的虚拟地址。RVA=VA-imagebase。VOFFSET是pe文件节的起始地址相对于imagebase的偏移(内存中相对于imagebase的偏移)。Roffset相对于文件在磁盘首地址的偏移。Voffset(内存)=节的起始地址(虚拟地址)-imagebase地址。Roffset(磁盘)=节的起始地址-文件的首地址(磁盘)

PE文件是一种Windows可执行文件格式,包含了程序代码、数据和资源等信息。在PE文件中,以下是一些相关概念:

  • VA(Virtual Address):虚拟地址,是程序在内存中的地址。VA是相对于进程的基地址(Image Base)的偏移量,进程的基地址由操作系统决定。在内存中,程序的代码和数据被映射到VA指向的地址空间中。
  • RVA(Relative Virtual Address):相对虚拟地址,是相对于模块基地址(Module Base)的偏移量,模块基地址是PE文件在内存中的起始地址。RVA通常用于描述PE文件中各种数据结构的地址,如PE头、节表、导入表、导出表等。
  • Voffset:虚拟偏移量,是一个虚拟地址相对于文件头的偏移量。例如,一个VA为0x4000的代码段在PE文件中的偏移量为Voffset = 0x4000 - Image Base。
  • Roffset:相对偏移量,是一个RVA相对于文件头的偏移量。例如,一个RVA为0x1000的代码段在PE文件中的偏移量为Roffset = 0x1000。

总的来说,VA和RVA是描述程序在内存中的位置,而Voffset和Roffset是描述程序在PE文件中的位置。需要注意的是,对于不同的PE文件,Image Base和模块基地址可能不同,因此VA和RVA也会不同。

5.VA对应的文件偏移量(Offset)

Offset = VA - ImageBase + ROffset

Offset = 0x00049586 - 0x00040000 + 0x00000540

Offset = 0x00009526

.text段的起始地址 = ImageBase + ROffset - VOffset

.text段的起始地址 = 0x00040000 + 0x00000540 - 0x0000540

.text段的起始地址 = 0x00040000

因此,该VA对应的文件地址为:.text段的起始地址 + Offset,即:

FileAddress = .text段的起始地址 + Offset

FileAddress = 0x0000540 + 0x00009526

FileAddress = 0x0000E066