-
-
[原创]咬文嚼字·浅说OEP和EP
-
发表于:
2021-4-8 16:23
16505
-
使用工具:CFF、PETool、IDA、WinHex;
有一个老哥问我OEP和EP的知识点,睡意朦胧中回复的可能不太清晰,水一帖论述一下问题;
先说结论:
EP
:原名EnterPointer
,就是入口点的意思,对应的是PE文件中的AddressOfEntryPoint
字段,这里的字段是一个RVA(理解就是在内存中从ImageBase
(依旧是PE文件中的字段)开始算起的偏移大小),这里是程序的入口点 ;
OEP
:原名OriginEnterPointer
,就是原始入口点的意思;
一般有两种情况:
一种就是程序被加壳了,EP
的位置被写成了别的地址,在运行程序之前,先跳转运行解壳或者检测程序,然后再跳转到原本我们正确的程序入口地址(OEP
);
一种情况就是入口点被hook(劫持),同样的道理;
说完结论,我们来看一下老哥的问题,我从老哥那要来的工具PETool
,查看一下[原创] 小试牛刀·手动构建HelloWorld弹窗可执行文件中制作的文件,或者随便找个可执行文件 ;
入口点EP(RVA)
显示的0x00001080
,我们再使用CFF
看一看;
这两个地址是一样的;
那么在PETool
中的OEP
指的是啥呢?
原来PETool
工具中的OEP
指的是EP
在文件中的偏移位置,跟真正OEP
没有太大的关系,所以才会用RAW
注明;
其实,工具中RVA
和RAW
已经说的很清楚了;
所以,这就是一场乌龙
对于这个程序有没有加壳,还是需要更细致的跟程序,或者使用PEiD
以及exeinfoPE
之类的工具了;
说到OEP
,不得不说一下常见入口点OEP
特征;
这里我们不能使用手动制作的文件了,先用VC++
写一个helloworld吧;
这就是我们用VC++
编译器的入口特征;
在一般情况下,我们可以通过常见的入口特征来查找在程序中藏匿的程序(并不能用来查找shellcode
,因为shellcode
是硬编码,没有程序入口);
还有一些其它编译器的入口特征,可以自行百度或者实验;
因为我搜到的入口特征并没有得到我自己的验证(没有安装相应编译环境),所以我就不放在这个帖子上了,有兴趣的兄die可以自行实验;
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-4-9 12:42
被平头猿小哥编辑
,原因: 补充说明