内存地址换算问题!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存地址换算问题!相关的知识,希望对你有一定的参考价值。

内存按字节编址,地址为0B4000H~0DBFFFH,共有多少的容量?怎么算?

存储容量为32k*8bit的存储器芯片表示什么意思?

你举的数字看得我头疼。。我自己举个好算的数字。方法都一样。。
比如内存按字节编址,地址为0000-1111 二进制的哈。。换成10进制,也就是它的地址从0到15.。内存按字节编址。所以该容量就是16B。。。上面你的问题,也就是这样类似解决的。。

而第二个问题。32K*8bit 意思就是。。该存储结构有用32K个字节空间。。32K=32*1024.。

好好理解下。。学程序这个都不理解清楚。。不好混的。。。
参考技术A 0DBFFFH-0B4000H=027FFFH

逆向调试入门-PE中的VA与RVA换算04/07


区块特点:


1、内存页的属性

2、节的偏移地址

3、节的尺寸

4、不进行映射的节


节事实上就是相同属性数据的组合。



逆向调试入门-PE中的VA与RVA换算04/07_PE结构文件


文件与内存映射的关系


公式为


逆向调试入门-PE中的VA与RVA换算04/07_PE结构文件_02


RVA是相对虚拟地址(RelativeVirtualAddress)的缩写。RVA是当PE文件被装载到内存中后,某个数据位置相对于文件头的偏移量。


参考文章:

https://javajgs.com/archives/44114


在实际情况下,我们常常会遇到将代码段中访问的RVA转换成PA,在这种情况下需要读取⽂件头来做相应的转换。


逆向调试入门-PE中的VA与RVA换算04/07_PE结构文件_03



转换过程


转换的⼀般步骤为:

1、将exe⽂件映射⼊内存中,读取Dos MZ Header,在这个结构中,我们能够通过e_lfanew来获取NT⽂件头相对于Dos⽂件头的偏移。


逆向调试入门-PE中的VA与RVA换算04/07_逆向调试入门_04


MZ头部


逆向调试入门-PE中的VA与RVA换算04/07_PE结构文件_05


DOS头部相对于PE头部的偏移


2、获取到了NT⽂件头的地址,NT⽂件头中包含了两个⽂件头,⼀个是FILE⽂件头,⼀个是Optional可选⽂件头,在FILE⽂件头中我们可以读取到段的数量,在转换RVA地址的时候,我们只需要得到这个数量。


逆向调试入门-PE中的VA与RVA换算04/07_逆向调试入门_06


段的数量为8




3、将NT⽂件头之后紧跟着的就是SECTION TABLE,这是段描述头,在这个段描述头中,我们⼏乎可以获取到全部的段的资料。


VritualAddress: 这个是⼀个RVA地址,代表的意义是告诉PE加载器该段存在于RVA地址为VritualAddress处


逆向调试入门-PE中的VA与RVA换算04/07_PE结构文件_07


VA为1000H


PointerToRawData: 这是⼀个物理偏移地址,告诉PE加载器将物理⽂件偏移PointerToRawData处的数据映射⼊VritualAddress处

VirtualSize: 该段的⼤⼩

SizeOfRawData: 该段的物理⼤⼩。由于存在对齐问题,所以该⼤⼩为不⼩于VirtualSize⼤⼩的对齐⼤⼩的整数倍。



4.通过遍历SECTION TABLE,判断要转换的RVA地址是否处于所有段的RVA地址范围内。该段的RVA范围为: VritualAddress + SizeOfRawData,当然更精确点是VirtualAddress + VirtualSize。


5.假如存在于地址范围内,那么我们可以通过要转换的RVA地址减去该段的VirtualAddress算出相对于该段的偏移量


6.将偏移量加上PointerToRawData,即可算出物理地址。


算法比较复杂。

我们使用OD工具分析。


逆向调试入门-PE中的VA与RVA换算04/07_逆向调试入门_08


我们看下地址00400200


逆向调试入门-PE中的VA与RVA换算04/07_PE结构文件_09


果然这地址为code的代码块。

以上是关于内存地址换算问题!的主要内容,如果未能解决你的问题,请参考以下文章

服务监控-开发眼里的内存是什么

计算机中的内存

逆向调试入门-PE中的VA与RVA换算04/07

深入理解Linux内核 - 第二章 内存寻址 04

按字寻址和按字节寻址

存储系统字节单位的换算