程序基础概念
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