RVA与Offset的换算函数
function RVAToFileOffset(FileName:string; RVA: Cardinal): Cardinal;
var
MemPE: TFileStream;
PEDosHead: TImageDosHeader;
PENtHead: TImageNtHeaders;
Section : TImageSectionHeader;
i, SectionsCount: Integer;
begin
Result := RVA;
MemPE:=TFileStream.Create(FileName,fmOpenReadWrite);
try
MemPE.Seek(0, soFromBeginning);
MemPE.Read(PEDosHead, SizeOf(PEDosHead));
MemPE.Seek(PEDosHead._lfanew, soFromBeginning);
MemPE.Read(PENtHead, SizeOf(PENtHead));
SectionsCount := PENtHead.FileHeader.NumberOfSections;
if SectionsCount <> 0 then
for i := 0 to SectionsCount - 1 do
begin
MemPE.Read(Section, SizeOf(Section));
if (RVA >= Section.VirtualAddress) and (RVA < Section.VirtualAddress + Section.SizeOfRawData) then
begin
Result := RVA - Section.VirtualAddress + Section.PointerToRawData;
Break;
end;
end;
finally
FreeAndNil(MemPE);
end;
end;
function FileOffsetToRVA(FileName:string; Offset: Cardinal): Cardinal;
var
MemPE: TFileStream;
PEDosHead: TImageDosHeader;
PENtHead: TImageNtHeaders;
Section : TImageSectionHeader;
i, SectionsCount: Integer;
begin
Result :=Offset;
MemPE:=TFileStream.Create(FileName,fmOpenReadWrite);
try
MemPE.Seek(0, soFromBeginning);
MemPE.Read(PEDosHead, SizeOf(PEDosHead));
MemPE.Seek(PEDosHead._lfanew, soFromBeginning);
MemPE.Read(PENtHead, SizeOf(PENtHead));
SectionsCount := PENtHead.FileHeader.NumberOfSections;
if SectionsCount <> 0 then
for i := 0 to SectionsCount - 1 do
begin
MemPE.Read(Section, SizeOf(Section));
if (Offset >= Section.PointerToRawData) and (Offset < Section.PointerToRawData + Section.SizeOfRawData) then
begin
Result := Offset - Section.PointerToRawData + Section.VirtualAddress;
Break;
end;
end;
finally
FreeAndNil(MemPE);
end;
end;
程序源代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button2: TButton;
Edit5: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function FileOffsetToRVA(FileName:string; Offset: Cardinal): Cardinal;
var
MemPE: TFileStream;
PEDosHead: TImageDosHeader;
PENtHead: TImageNtHeaders;
Section : TImageSectionHeader;
i, SectionsCount: Integer;
begin
Result :=Offset;
MemPE:=TFileStream.Create(FileName,fmOpenReadWrite);
try
MemPE.Seek(0, soFromBeginning);
MemPE.Read(PEDosHead, SizeOf(PEDosHead));
MemPE.Seek(PEDosHead._lfanew, soFromBeginning);
MemPE.Read(PENtHead, SizeOf(PENtHead));
SectionsCount := PENtHead.FileHeader.NumberOfSections;
if SectionsCount <> 0 then
for i := 0 to SectionsCount - 1 do
begin
MemPE.Read(Section, SizeOf(Section));
if (Offset >= Section.PointerToRawData) and (Offset < Section.PointerToRawData + Section.SizeOfRawData) then
begin
Result := Offset - Section.PointerToRawData + Section.VirtualAddress;
Break;
end;
end;
finally
FreeAndNil(MemPE);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := string(FileOffsetToRVA(Edit5.Text,Cardinal(Edit1.Text)));
end;
function RVAToFileOffset(FileName:string; RVA: Cardinal): Cardinal;
var
MemPE: TFileStream;
PEDosHead: TImageDosHeader;
PENtHead: TImageNtHeaders;
Section : TImageSectionHeader;
i, SectionsCount: Integer;
begin
Result := RVA;
MemPE:=TFileStream.Create(FileName,fmOpenReadWrite);
try
MemPE.Seek(0, soFromBeginning);
MemPE.Read(PEDosHead, SizeOf(PEDosHead));
MemPE.Seek(PEDosHead._lfanew, soFromBeginning);
MemPE.Read(PENtHead, SizeOf(PENtHead));
SectionsCount := PENtHead.FileHeader.NumberOfSections;
if SectionsCount <> 0 then
for i := 0 to SectionsCount - 1 do
begin
MemPE.Read(Section, SizeOf(Section));
if (RVA >= Section.VirtualAddress) and (RVA < Section.VirtualAddress + Section.SizeOfRawData) then
begin
Result := RVA - Section.VirtualAddress + Section.PointerToRawData;
Break;
end;
end;
finally
FreeAndNil(MemPE);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit4.Text := string(RVAToFileOffset(Edit5.Text,Cardinal(Edit3.Text)));
end;
end.
程序界面:

RVA与Offset的换算函数的更多相关文章
- excel中的单位换算函数convert()
有时,我们在处理数据的时候,需要进行单位换算,比如“7小时24分”换算成小时,可以直接除以或乘以相应的进制来计算,但是在excel中,有一个convert()函数更加方便: 此函数属于工程函数,平时可 ...
- 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...
- RVA与RWA的关系
RVA与RWA的关系 原理比较简单:首先判断这个地址是否在PE头中,如果在,文件偏移和内存偏移相等,如果存在于文件的区段中,则利用以下公式: 内存偏移 - 该段起始的RVA(VirtualAddres ...
- 【python cookbook】【数据结构与算法】19.同时对数据做转换和换算
问题:我们需要调用一个换算函数(例如sum().min().max()),但是首先需对数据做转换或者筛选处理 解决方案:非常优雅的方法---在函数参数中使用生成器表达式 例如: # 计算平方和 num ...
- C语言中fseek函数
C语言fseek()函数:用来设定文件的当前读写位置 头文件: #include <stdio.h> 定义函数: int fseek(FILE * stream, long offset, ...
- 【Linux C中文函数手册】文件内容控制函数
文件内容控制函数 1)clearerr 清除文件流的错误旗标 相关函数 feof表头文件 #include<stdio.h>定义函数 void clearerr(FILE * stream ...
- C语言文件函数
FILE *fp: 其中的FILE应该大写,它实际上是系统定义的一个结构,在stdio.h文件中.该结构中有文件名,文件状态,文件当前的读写信息等. fp是指向FILE结构的指针变量,通过fp可以找到 ...
- C语言文件操作函数
C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...
- fseek/ftell/rewind/fgetpos/fsetpos函数使用-linux
程序: #include<stdio.h> int main(int argc,char *argv[]) { FILE * stream; fpos_t pos; stream = fo ...
随机推荐
- ubuntu 下安装极点五笔
安装完Ubuntu后先更新软件,我的Ubuntu的键盘输入方式系统是ibus 在终端中执行如下操作 sudo wget http://www.unicom-china.com/download/vis ...
- php或js判断网站访问者来自手机或者pc
php或js判断网站访问者来自手机或者pc机 2013年9月26日,在弄wtuonline的时候为了区分用户是来自手机版浏览器还是pc,针对不同平台选择不同的网站版本,最终总结如下: ...
- php 判断table 是否存在 根据返回值继续下一步的操作
根据sql命令创建数据库或者数据表时候,判断库或者表是否存在比较重要. //要创建的表是否已经存在 function isHaveTable( $dbName,$tableN, $con) //数据 ...
- Vmware为Ubuntu安装VmTools
From:http://www.cnblogs.com/killerlegend/p/3632443.html Author:KillerLegend 1:首先打开Vmware并运行里面的Ubuntu ...
- DIV JS CSS 轻量级弹出层 兼容各浏览器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- jquery跨域调用wcf
使用jquery跨域调用wcf服务的时候会报如下错误 $.ajax({ url: 'http://localhost:28207/Service1.svc/GetData', method: 'get ...
- 数据结构学习笔记05图(最小生成树 Prim Kruskal)
最小生成树Minimum Spanning Tree 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 树: 无回路 |V|个顶 ...
- 安装wampserver出现“The Program can't start because MSVCR110.dll is missing from your computer. Try reinstalling the program to fix this problem”
问题描述: 今天安装wampserver的时候出现"The Program can't start because MSVCR110.dll is missing from your com ...
- Python核心编程--学习笔记--6--序列(上)字符串
本章研究Python中的序列:字符串.列表和元组.因为这些类型其实都是由一些成员共同组成的一个序列整体,所以我们把它们统称为序列.序列的存储结构可以表示为: 1 序列 序列类型有着相同的访问模式:按下 ...
- 菜鸟学习Hibernate——配置Hibernate环境
一.概念. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库.既然学习Hibernate那么第 ...