EXE文件的RSCS里取得的资源RVA怎么转化为文件里的位置?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EXE文件的RSCS里取得的资源RVA怎么转化为文件里的位置?相关的知识,希望对你有一定的参考价值。
得到的ResourceDataEntry里,size是对的(用另外的EXE工具看见比较的SIZE),SIZE前面那个DWORD的地址看到一篇文章说是相对于imageBase的。在OptionalHeader里,那里有一个imageBase能找到,但是加起来是资源在程序加载以后的位置吧。
现在要找的是,资源在文件里的位置,而不是加载到内存里的位置。
手里有2个文件。
一个是ICL,纯图标,没有程序段。读取到位置ResourceDataEntry.offset例如是0x468,数据就真的在那儿。
一个是自己写的很小的EXE,读取到位置ResourceDataEntry.offset例如是0xf168,实际位置是0xbb68。有10个资源是我能从二进制文件里肉眼识别的,ICON和GROUPICON,这10个资源都是读取的RVA位置和实际文件内位置差-0x3600,OptionalHeader里没有哪个值是这个数。
语言不是C,不能用Windows带的FindResource之类的,也不知道哪儿去查这个函数的源代码。
有人知道么:取得的资源RVA怎么转化为文件里的位置?(或者说例子里的0和-0x3600怎么计算得到?)
查资料,查到了文件是按照每个section放进内存的,按照定义的对齐方式对齐。那么这个文件imageBase=0x400000,sectionAlignment=0x1000,fileAlignment=0x200,sizeOfHeaders=0x400,section分别为.text=0x8000,.rdata=0x2800,.data=0xe00,..rsrc=0x3e00,.reloc=0xe00
我认为的运算是:
header按照sizeOfHeaders=0x400和sectionAlignment=0x1000放入,多余0xc00
.text没有多余
.rdata的0x2800和0x1000,多余0x800
.data的0xe00和0x1000,多余0x200
那么到了.rsrc,节偏移应该是0x1600,问题就是,为什么实际的节偏移是0x3600呢?
其实计算是很简单的
比如内存的地址为0x408100,文件偏移为0x300
那么在文件里的地址就是0xx4081000-0x400000-0x8000+0x300=1300
就是用地址减掉在内存中的偏移,然后加上在文件中的偏移
文件中的偏移也叫FileOffset可以用工具看
再不明白可以hi我追问
我要写一个工具,而不是用工具看,已经自己试出结果了。
最后用的解决方法是头文件里读出section在文件和内存里的对齐大小,然后对每个section算出它在文件和内存里的位置差。例如第一section大小为300byte,文件对齐为256byte,内存对齐为1024byte,那么第一section在文件里占了512byte,在内存里占了1024byte,那么第二section在文件和内存里的位置差就是1024-512=512byte,就得到你说的要工具看的那2个偏移的差了。
感谢关注
C语言中,如何更改.EXE文件的图标
我用的是VC++ 6.0 ,不知道如何在资源文件里导入硬盘里的.ICO图标。
求详解!!
HICON LoadIcon(
HINSTANCE hInstance, // handle to application instance
LPCTSTR lpIconName // icon-name string or icon resource
// identifier
);
用这个函数就可以了。
资源文件里面要有ico图标。然后
Parameters
hInstance
Handle to an instance of the module whose executable file contains the icon to be loaded. This parameter must be NULL when a standard icon is being loaded.
lpIconName
(第一个参数要是null)
Pointer to a null-terminated string that contains the name of the icon resource to be loaded. Alternatively, this parameter can contain the resource identifier in the low-order word and zero in the high-order word. Use the MAKEINTRESOURCE macro to create this value.
第二个参数要是一个指向图标源文件的指针。也就是图标的路径和名称 参考技术A 要是不想麻烦的话,直接右键,然后再封装 参考技术B 具体依赖于编译器。部分编译器不支持exe图标更改。
以VC为例:
1
打开工程。
2
新建文件,选择resource类型文件(资源类)。
3
选择add
resource(新增资源)。
4
选择icon(图标)。
5
选择一个.ico文件导入。ico即图标文件。可以选择系统自带的,也可以自己制作。
6
编译工程。会发现exe的图标已经更换了。
补充说明:已经生成的exe文件无法修改图标。
以上是关于EXE文件的RSCS里取得的资源RVA怎么转化为文件里的位置?的主要内容,如果未能解决你的问题,请参考以下文章
在Delphi如何将exe文件加入到资源文件中,如何进行调用?
VB.NET将一个已有的A.EXE文件添加到项目资源,如何在项目生成的EXE文件中运行它?