为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_peutraEdit手工为程序添加资源节,也可以写个程序来完成。以下是手工修改方法。

第一步,将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,将numberofsection1。将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发现所有资源的目录结构都出现了。但是图标资源还是不能正确显示。

那是因为资源数据地址000071d0gui.exe中的RVA,需要对每个资源的数据地址做相应修改。

 

第五步,修改每个资源的RVA

OffsetToData是资源数据的RVA,也就是上图中的0x000071d0

OutOffsetToData= out 资源DATA_DIRECTORYVirtualAddress + 资源数据相对资源起始位置的偏移

OutOffsetToData= out 资源的DATA_DIRECTORYVirtualAddress +guiOffsetToData – gui资源的DATA_DIRECTORYVirtualAddress

计算得出OffsetToData=  0x00011000+ 0x000071d0 – 0x00007000 =0x000111d0

只需要将000071d0修改成0x000111d0就可以显示出图标了,但遗憾的是stud_pe无法修改这个值。可以通过utraEdit修改。根据<加密与解密>295页所讲的方法找到OffsetToData一个一个的修改。有一个简便的方法,就是在utraEditCtrl+F查找要修改的数据,如0x000071d0,如果只找到一处的话,那么这里肯定就是OffsetToData的位置,直接修改。修改完了,保存文件,发现out.exe已经可以显示图标了,用stud_pe查看,每个资源都正常。

 

以上过程已经写程序实现了,代码以后在贴出来了。