星绽紫辉(rawdata)的Blog
快乐地学习,快乐地工作!
C++博客
::
首页
::
联系
::
聚合
::
管理
16 Posts :: 0 Stories :: 37 Comments :: 0 Trackbacks
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(5)
给我留言
查看公开留言
查看私人留言
我参与的团队
随笔档案
(16)
2012年9月 (1)
2012年2月 (1)
2011年11月 (3)
2009年3月 (2)
2009年2月 (2)
2009年1月 (4)
2008年12月 (3)
精品文章
Windows XP系统中如何屏蔽 Ctrl+Alt+Del、Alt+Tab以及Ctrl+Esc键序列
喜好链接
CCTV
谷歌搜索
我的蓝月博客
中鸣机器人
搜索
最新评论
1. re: 如何将.spl剥离成.emf文件格式
在吗?楼主现在的新联系方式有吗?
--dabao
2. re: 浅谈静态dll注入PE[未登录]
评论内容较长,点击标题查看
--none
3. re: 如何将.spl剥离成.emf文件格式
我的电脑生成的SPL文件是raw格式的? 修改打印处理器为winprint emf格式也不好使。怎么才能导出emf的SPL格式呢?
--申丽玲
4. re: 如何将.spl剥离成.emf文件格式
我在虚拟机上生成的SPL可以生成EMF文件, 但是安装到我的电脑以后, 用国外的SPL Viewer 也说是invalid SPL File 是为什么呢?
--申丽玲
5. re: 如何将.spl剥离成.emf文件格式 [未登录]
想要这个程式,怎么联系你,我的QQ号是1079436838
--dd
阅读排行榜
1. 如何将.spl剥离成.emf文件格式 (8079)
2. 如何卸载 IP GUARD 2.82.0824 客户端(7244)
3. 给PE文件增加多个区段(sections)(3297)
4. 将RVA(相对虚拟地址)地址转化成Offset VA(偏移地址)(2417)
5. 浅谈静态dll注入PE(1975)
评论排行榜
1. 给PE文件增加多个区段(sections)(13)
2. 如何将.spl剥离成.emf文件格式 (10)
3. 到底该不该降低本硕毕业生的工资?(6)
4. 如何卸载 IP GUARD 2.82.0824 客户端(5)
5. 浅谈静态dll注入PE(2)
将RVA(相对虚拟地址)地址转化成Offset VA(偏移地址)
原创:星绽紫辉 2009-1-4 转载请注明出处:
http://www.cppblog.com/rawdata
RVA(reverse virtual address) 和 VA 地址的概念我就不说了,网上一大堆,就看你有没有心去找了。在解析PE文件格式时,需要将RVA地址转化成VA地址,才能对如:IMAGE_IMPORT_DESCRIPTOR类的结构进行正确访问。这样,exe/dll等导出的函数和导入的函数等重要信息你就可以获得了。
我写的这段函数是参考罗云彬的汇编主页上的PE文件格式的汇编代码,是由GuFeng翻译
Iczelion
的,现在我写成C/C++的形式,以供参考。
//
RVA To Offset
DWORD CPEReaderDlg::RVAToOffset(DWORD pMapping,DWORD dwRVA)
{
//
Defines
DWORD pNTDst
=
0
;
IMAGE_DOS_HEADER
*
pidh
=
(IMAGE_DOS_HEADER
*
)pMapping;
pNTDst
=
pMapping
+
pidh
->
e_lfanew;
DWORD pSeDst
=
pNTDst;
IMAGE_NT_HEADERS
*
pinh
=
(IMAGE_NT_HEADERS
*
)pNTDst;
IMAGE_SECTION_HEADER
*
pish
=
NULL;
//
First Session
pSeDst
=
pNTDst
+
sizeof
(IMAGE_NT_HEADERS);
pish
=
(IMAGE_SECTION_HEADER
*
)pSeDst;
//
Session Count
UINT nCount
=
pinh
->
FileHeader.NumberOfSections;
DWORD dwPosTmp
=
0
;
//
Scan
for
(UINT i
=
0
;i
<
nCount;i
++
)
{
if
(dwRVA
>=
pish
->
VirtualAddress)
{
dwPosTmp
=
pish
->
VirtualAddress;
dwPosTmp
+=
pish
->
SizeOfRawData;
}
if
(dwRVA
<
dwPosTmp)
{
dwRVA
=
dwRVA
-
pish
->
VirtualAddress;
return
dwRVA
+
pish
->
PointerToRawData;
}
pish
=
pish
+
1
;
//
sizeof(IMAGE_SECTION_HEADER);
}
return
-
1
;
}
其中的pMapping 是目标exe/dll文件的内存映像指针,由(MapViewOfFile返回),dwRVA为相对地址,返回的是该PE程序在内存的对应dwRVA的偏移地址,得到VA就很简单了:VA = pMapping + 返回值. (返回-1标识无效.)
如果代码有什么谬误或者待完善的地方,请留言或EmailToMe:xiaolu69soft@yahoo.com.cn.
2009-1-4 星绽紫辉(rawdata)
posted on 2009-01-04 12:41
星绽紫辉
阅读(2417)
评论(1)
编辑
收藏
引用
Feedback
#
re: 将RVA(相对虚拟地址)地址转化成Offset VA(偏移地址)
2012-03-03 16:18
凭凡 fire_the_hole@163.com
NICE,我直接复制走了~~~谢谢哈
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Copyright @ 星绽紫辉
Powered by:
.Text
and
ASP.NET
Theme by:
.NET Monster