为PE文件添加资源节
来源:互联网 发布:vivo网络助手在哪里? 编辑:程序博客网 时间:2024/04/20 11:16
<!-- /* Font Definitions */ @font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:"/@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-parent:"";margin:0in;margin-bottom:.0001pt;mso-pagination:widow-orphan;font-size:12.0pt;font-family:"Times New Roman";mso-fareast-font-family:宋体;}@page Section1{size:8.5in 11.0in;margin:1.0in 1.25in 1.0in 1.25in;mso-header-margin:.5in;mso-footer-margin:.5in;mso-paper-source:0;}div.Section1{page:Section1;}-->
为PE文件添加资源节
为什么想到要为PE文件添加资源节呢?最初的需要将gui.exe,添加到console.exe的尾巴上,将2个文件打包成一个文件out.exe(其中console.exe没有资源节,gui.exe有资源节,有程序图标和文件属性声明等)。out.exe运行时释放并运行gui.exe。显然按图示方式打包成的out.exe不能显示图标,要是out.exe能显示出和gui.exe一样的程序图标,文件属性声明那就更爽了。
于是想到了将gui.exe整个文件当成资源数据添加到console.exe的末尾,然后修改数据目录(DATA_DIRECTORY), 使打包后的文件out.exe有资源节,并能显示出gui.exe的图标,文件声明等,如下图:
可以使用stud_pe和utraEdit手工为程序添加资源节,也可以写个程序来完成。以下是手工修改方法。
第一步,将console.exe的文件数据拷贝到out.exe中,再将gui.exe的文件数据添加到out.exe的末尾,如果gui.exe的数据量不是console.exe文件对齐(fileAlignment)的整数倍的话,还需要在out.exe再填充数据。本例中console.exe的文件对齐是0x1000,gui.exe的大小是0x00009000,是0x1000的整数倍,所以直接将gui.exe的数据拷贝到out.exe中,不需要填充。保存文件。记下添加的数据大小为0x00009000.
第二步,用stdu_pe打开out.exe,将numberofsection加1。将sizeofimage加上0x00009000.。保存文件。
NumberOfSection = 4
SizeOfImage = 0x00013000
第三步,修改节表头的VirtualOffset/Virtual Size/Raw Offset /Raw Size。
Virtual Offset = (上一节的VirtualOffset + 上一节Virtual Size)根据内存对象修正大小
Virtual Size = 实际节大小,不包括填充数据
Raw Offset = (上一节的RawOffset + 上一节的Raw Size)根据文件对象修正大小
Raw Size = 总共添加的数据大小,包括填充数据。
本例中:
文件对齐是:0x00001000
内存对齐是:0x00001000
上一节VirtualOffset = 0x00008000
上一节VirtualSize = 0x00001c68
上一节Raw Offset= 0x00008000
上一节Raw Size = 0x00001000
计算得出:
Virtual Offset = 0x00008000 +0x00001c68 = 0x0000a000
Virtual Size = 0x00009000
Raw Offset = 0x00008000 + 0x00001000 = 0x00009000
Raw Size = 0x00009000
用双击节,将以上数据写如文件,记得最后要Saveto File
第四步:修改数据目录。资源节的数据目录在IMAGE_DATA_DIRECTORY的第3个位置,包括VirtualAddress 和Size 两个字段。计算方法:
VirtualAddress = 新建资源节的VirtualAddress+ gui.exe的资源节的文件offset
Size = gui.exe 中的大小
VirutalAddress = 0x0000A000 + 0x00007000 = 0x00011000
Size = 0x000018d0
将以上数据写如文件,记得最后要Saveto File
完成以上4步以后,查看Resource发现所有资源的目录结构都出现了。但是图标资源还是不能正确显示。
那是因为资源数据地址000071d0是gui.exe中的RVA,需要对每个资源的数据地址做相应修改。
第五步,修改每个资源的RVA。
OffsetToData是资源数据的RVA,也就是上图中的0x000071d0
Out的OffsetToData= out 资源DATA_DIRECTORY的VirtualAddress + 资源数据相对资源起始位置的偏移
Out的OffsetToData= out 资源的DATA_DIRECTORY的VirtualAddress +gui的OffsetToData – gui资源的DATA_DIRECTORY的VirtualAddress
计算得出OffsetToData= 0x00011000+ 0x000071d0 – 0x00007000 =0x000111d0
只需要将000071d0修改成0x000111d0就可以显示出图标了,但遗憾的是stud_pe无法修改这个值。可以通过utraEdit修改。根据<加密与解密>295页所讲的方法找到OffsetToData一个一个的修改。有一个简便的方法,就是在utraEdit中Ctrl+F查找要修改的数据,如0x000071d0,如果只找到一处的话,那么这里肯定就是OffsetToData的位置,直接修改。修改完了,保存文件,发现out.exe已经可以显示图标了,用stud_pe查看,每个资源都正常。
以上过程已经写程序实现了,代码以后在贴出来了。
- 为PE文件添加资源节
- 为PE文件添加数字签名
- 为PE文件添加数字签名
- 为PE文件添加数字签名 .
- 为PE文件添加新节显示启动信息
- 为PE文件添加新节显示启动信息
- 为PE文件添加CRC32自效验
- 为PE文件添加CRC32自效验
- 小议病毒编写--为PE文件添加新节显示启动信息
- PE文件添加节显示启动信息...
- PE文件添加节显示启动信息
- PE文件操作-末尾添加节
- PE文件添加Overlay
- PE文件格式应用实例__为PE文件添加启动时对话框
- 为Qt程序添加资源文件
- 添加资源文件(Cursor为例)
- 怎么为PE添加输入法
- PE 文件格之资源
- JavaScript获取不重复随机数
- Swing中的线程 --invokeLater
- 白癜风为什么要忌口?
- 正在最流行!酒店蹦床。。。发挥你的极致想象
- 终端tty、虚拟控制台、FrameBuffer的切换过程详解
- 为PE文件添加资源节
- .NET开源项目的前世和今生系列 之 .NET开源压缩文档处理的前世和今生
- 圣诞咯..
- 让JavaScript代码排版得更好看
- SharpZipLib
- JSP内置对象(9个常用的内置对象)
- php mysql回滚示例
- ORACLE 安装目录介绍
- c调用api打开文件对话框