pe框架跳转html页面,关于pe中的入口点和跳转问题

关于pe中的入口点和跳转问题

作者:admin 日期:2009-08-27

字体大小: 小 中 大

05817a2f642b442431922eb1c82520af.gif

6463e41b1d622002f5941cc109fc4784.gif

314f094ba565406a49b1fedc4bb444fa.gif

pe里面的入口点和跳转问题。在我一开始学习pe的时候曾经就被这两个问题困惑过,可能很多朋友在学习的过程中也会遇到,所以我想在这里把这两个问题说清楚一点。没什么技术含量大牛飘过啦。

大家知道pe的入口点是在IMAGE_FILE_HEADER里面AddressOfEntryPoint指定的。其实这个说得挺清楚的,是address而不是offset,当然指的是内存里面的地址。那为什么会搞错呢?因为我用vb和vc++分别编译了一个简单的程序李测试,这时候我发现只要入口点的内存地址-映像基址=文件中的偏移量(因为OD载入厚就停留在入口点的),所以我误以为AddressOfEntryPoint就是一个文件偏移值,结果在写一个文件感染的程序的时候就只能感染这两个文件,其他像windows计算器还有资源管理器都出错。于是我就开始摸索,发现计算器的入口点减去映像基址并不等于入口点在文件里面的偏移,所以程序根本跳转不到我想要的地方。那我就纳闷了,装载器怎么找到要执行的地方呢?后来我又看到内存里面的入口点地址-映像基址就=AddressOfEntryPoint,于是我就想是不是AddressOfEntryPoint指的就是这个。我把入口点的地址放到oc转化器里面转换得到文件中的偏移,这个地方的数据果然和内存里面的是一样的。

所以结论就是:内存中程序开始执行的地址=映像基址+AddressOfEntryPoint,而在文件中偏移为AddressOfEntryPoint的地方不一定是程序的入口点数据。因为windows的pe文件是有对齐的,在很多时候文件对齐和内存对齐是不一样的,AddressOfEntryPoint要经过一定的转换才能得到offset。为什么上面用vb和vc++编译出来的程序刚好一样呢?因为这两个程序的文件对齐系数和内存对齐系数刚好是一样的,而且代码段刚好都在第一个节。

接着说说跳转问题

简单说跳转有远跳和近跳,对应的机器码分别为e9,和eb。不管是那种跳转,本质就是对eip的一个操作,加多少或减多少。但直接add eip,10是不允许的。当开始执行一条指令的时候eip自动指向下一条指令的地址,所以在我们执行jmp语句的时候eip就已经指向下一条语句的地址了,所以要jmp的距离是下一条指令的地址与目标指令地址的距离而不是本条jmp语句的地址和目标指令地址的距离。

EB FE就是不断地循环这句jmp而不是忘前面跳。

好了,就说这么多了。

1117eac87184b25d2dcbb158d61504ca.gif文章来自: 本站原创

d9e8765734a5833e8f66525c43af2d93.gifTags:

评论: 0 | 查看次数: 9484

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值