【逆向】PE结构分析和关于PE的一些问题及解决

目录

前言:

开始需要大概了解一些名词:

程序的装入(地址的变换)

分页机制:

大概带着这些知识后,再来看PE的结构:

一些结构的定义

关于地址计算的一些问题

经典例题:

例题分析

☆如何在PE中查找并计算这些地址?

计算:解决地址转换问题(使用PEView)

①计算每个节区在内存中的位置、大小:

②每个节区在文件中的偏移

 ③每个节区在内存中的大小?每个节区在文件中的大小?

顺便一提,在这里要注意的一些点:

导入表

导入表在哪?定位导入表在源文件中的位置。

什么是INT、IAT、IDT?

IAT(Import Address Table)、INT(Import Name Table)、IDT(Import Directory Table)

从Import_Descriptor得到IAT的步骤:

导出表

对一个动态链接库里导出的函数的调用,既可以通过函数名称来进行,也可以通过函数在导出表的索引来进行。

重定位表


前言:

可以从这里入门https://www.cnblogs.com/milantgh/p/3953713.html

配合这个博客查找上面不懂的https://www.cnblogs.com/bokernb/articles/6116512.html 

开始需要大概了解一些名词:

关于地址和一些名词的理解,这个博客非常细致:https://blog.csdn.net/hguisu/article/details/5713099

需要知道的一些地址(后面会再来分析):

  • VA:virtrual address  虚拟地址,也就是内存中的地址:
  • RVA:relative virtrual address   相对虚拟地址,等于VA-ImageBase
  • ImageBase:基地址

虚拟内存不考虑物理内存的大小和信息存放的实际位置,只规定进程中相互关联信息的相对位置。每个进程都拥有自己的虚拟内存,且虚拟内存的大小由处理机的地址结构和寻址方式决定。

关于程序如何运行

  •          首先是要编译,由编译程序(Compiler)将用户源代码编译成cpu可执行的目标代码,产生了若干个目标模块(Object  Module)(即若干程序段),
  •         其次是链接,由链接程序(Linker)将编译后形成的一组目标模块(程序段),以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load  Module);
  •          最后是装入,由装入程序(Loader)将装入模块装入内存

程序的装入(地址的变换)

绝对装入方式:程序中的逻辑地址与实际内存地址完全相同

静态地址重定位(可重定位装入方式) :多道程序环境下,编译程序不可能预知所编译的目标模块应放在内存的何处,所得到的目标模块的起始地址通常是从 0 开始的,程序中的其它地址也都是相对于起始地址计算的,根据内存的当前情况,将装入模块装入到内存的适当位置。                              静态地址重定位即在程序开始运行前,程序中指令和数据的各个地址均已完成重定位,即完成虚拟地址到内存地址映射。地址变换通常是在装入时一次完成的,以后不再改变。                    采用可重定位装入程序将装入模块装入内存后, 会使装入模块中的所有逻辑地址与实际装入内存的物理地址不同

可以看个例题:

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值