今天学习IDA的时候,视频中提到了EP
这个词,之前学习的时候我还特意记了一下OEP
和EP
的区别以及两者之间的关系(差值很有规律),但是今天遇到了有突然想不起来了。问了很多朋友都没有get到我心中的的那个点,百度上的答案也是五花八门,解释看起来比较专业的是下边两个:
a、EP
是EntryPoint
简称,就是入口点。如果程序加壳后,程序会有个入口点,就是EntryPoint
。但加壳前的程序入口点就称为OEP
(Original EntryPoint
),
b、如果源程序被加了壳或者入口函数被劫持,则会产生OEP
。
其实上边两个回答都不对,一个200+KB的PE解析工具能有这么玄乎?还能分析出来程序有没有被改动过?我又老老实实的找了一下笔记,原来之前海哥讲过,下边我就讲一下OEP
和EP
。
查看PE结构,我经常要用到PE解析工具PETool
,已打开记事本程序为例,打开之后是这样:
上边的箭头指向的就是EP
和OEP
。
EP
是IMAGE_OPTIONAL_HEADER32
结构体中的AddressOfEntryPoint
属性,表示在内存中,程序入口函数相对于imagebase
的偏移(内存偏移)。见下图:
那什么是OEP
?OEP
是在文件中,程序入口函数相对于imagebase
的偏移(文件偏移偏移)。
以第一个图为例:
EP
:0x0000739d
(已经不用验证了,看上边第2个图,PETool
已经给出来了)
OEP
:0x0000679d
下边来验证我上边的解释:OEP
是在文件中,程序入口函数相对于imagebase
的偏移(文件偏移偏移),下图为笔记本程序的节信息:
0x0000739d>0x00001000
并且0x0000739d<0x00009000
,这就表明入口点在第一个节中;
下边计算在内存中,入口点相对于第一个节起始点的偏移;
RVA=0x0000739d-0x00001000
;
既:RVA=0x0000639d
。
因为入口点在内存中相对于第一个节起点的偏移==入口点在文件中相对于第一个节起点的偏移,因此入口点在文件中的偏移=RVA
+第一个点在文件中的偏移,计算如下:
RVA+0x00000400既0x0000639d+0x00000400
;
结果:入口点在文件中的偏移=0x0000679d
,结果就是第一张图上的OEP
的值!
这涉及到文件对齐值和内存对齐值是否一致,见下图:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)