标 题: 再写手工打造可执行程序
作 者ID: yulongying
时 间: 2011-03-03

最近在公司时间比较闲暇,所以一直都在论坛闲逛,前段时间看了dncwbc一篇文章
《再写手工打造可执行程序》
http://bbs.pediy.com/showthread.php?t=130261
还写了一篇读后感 《再写手工打造可执行程序 读后感 》
http://bbs.pediy.com/showthread.php?t=130261

含金量比较低,但是对于新手还是有价值的,这里在前两篇文章基础上,探讨下怎么手动添加一个以0填充的section,其实原理都是一样,含金量也是比较低 呵呵 高手莫笑!
要修改的一共有以下几处
1、PE头结构中的 NumberOfSections +1 = 3+1=4



2、然后就是optional header中的SizeOfImage(加载到内存中的总大小)之前是(1+3)*1000=4000,这里再解释下此表达式1代表就是文件头 3代表pe文件中使用了3个section,1000就是SectionAlignment了;现在应该是(1+4)*1000=5000



3、在之前的.text .rdata  .data三个sectionheader后面的空白文件段添加添加一个section header,对此section header分别域进行填充
section name  8个字节:.hawk
加载到内存中的大小 4个字节:1000
VA:最后一个section的VA+1000=3000+1000=4000
在文件中的大小还是:200
文件偏移:最后一个section文件便宜+其大小=800+200=A00
PointerToRelocations PointerToLinenumbers NumberOfRelocations NumberOfLinenumbers 依然均为0
Characteristics 我随便填了40 00 00 40


4、从 新增的section起始便宜A00一直填充0到BFF(大小为200h)


补充:
1、
添加一个section header我们发现是在file header与sections之间对齐之后产生的空隙中,如果不存在空隙或者空隙控件不够40(之前笔误写了40h 谢谢jsjnwms提醒)此方法就不使用了,应该就比较麻烦了,难道要重组pe?这里还请高手解答。
2、我们pe fileheader总大小dncwbc那篇文章计算过了原话:“我们的PE文件头总大小为:64 + 112 + 4 + 20 + 224 = 424,3个节表头的总大小 3 * 40 =120。424 + 120 = 544 byte 转化成十六进制为220h”,现在我们已经添加过一个section header 现在应该为544+40=584 转化成十六进制为248h经过file alignment 200h对齐之后还是400,在这里不需要修改,如果对齐之后有变化那这块也需要修改。




上面仅仅是一个做为菜鸟的见解,如有遗漏之处还请各位多多抛砖指引哈。
上传的文件跟《再写手工打造可执行程序读后感》中的文件用UE简单对比以下就知道那些改动了。

上传的附件 add_myHelloworld.rar