向PE文件中添加一个Section
背景
之前说过直接向类HelloWorld.exe的可执行文件添加一个MessageBox弹窗, 但有时候, 需要添加的内容太多了, 因为数据与代码一起插入, 以至于可执行文件本身没有足够的空闲空间存放这些内容时, 就需要添加一个Section.确认节区头后面还有空间
用工具查看一下最后一个节区头后面是否还有多余的空间, 一般情况都会有的. 但若没有的话, 就要移动节区头后面的文件内容, 这个比较复杂, 在这里不说. 一般会结合PE View 和 WinHex 这两个工具, 如之前的HelloWorld.exe

框选的部分就是最后一个节区头的内容 可以看到红框中的部分, 有足够的空间去添加一个节区头信息. 因为这个需要确保添加一个节区头后, 后面还有一个节区头的空间, 并且其值全为0
覆写一个节区头信息
接下来就是添加一个节区头信息, 我的做法是复制一下可执行文件原有的最后一个节区头的内容, 再覆写到其后面. 在WinHex中框选内容后, 右键 -> Edit



修改Number Of Sections的值
完成上面的工作, 用PE View查看的时候, 还是不会看到新添的这个节区头的信息的.
所以需要去修改一下Number Of Sections 的值, 其实就是对其值加1 还是要用PE View查到Number Of Sections 的文件偏移 ( 000000D6 )

再用WinHex去到 000000D6 看一下(至于为什么不是 0003 而是0300的问题, 去看基础知道 )



重复的.data节区头, 我习惯改一下新节区头的名称


这时, 会发现节区也多了一个, 但点开节区, 会发现, .dx节区和.data节区其实是同样的, 看文件偏移就知道


获取 File Alignment 和 Section Alignment的值
用PE View, 点开 PE可选头信息:
File Alignment 的值为 00001000
上面的值都是十六进制的, 先记下来, 后面会用到的在文件中为.dx节区头添加节区
这个时候是需要用到File Alignment的值了, 因为节区在文件中的空间大小必须是FileAlignment的整数倍, 为了方便, 在这里就弄一个FileAlignment的文件空间. 因为在用WinHex添加节区的时候, 是以整数个字节添加的, 换算一下: 00001000(十六进制) = 4096(十进制) 具体操作是把WinHex拉到最低部, 在文件最后的一个字节上 右键 -> Edit -> Paste Zero Bytes


设置新节区头的Size of Raw Data和Pointer to Raw Data
还是先用PE View看一下这两个属性的文件偏移量:

把Size of Raw Data的值改为 00001000, 其实就是把其实的3改为1就可以了. Pointer to Raw Data的值改为0000A000, 前面一步已经记下来的. 其实就是把7改为A



这样就和前面看到的不一样了, 也证明修改成功了!
设置新节区的RVA
首先要查看两个参数, 分别是前一个节区头的 Virtual Size 和 RVA 的值:

找到文件中的0000024C, 修改上面的值为 0000B000, 再保存:


设置新节区的Virtual Size
Virtual Size 指定的是对应节区加载到内存后, 所占用的内存空间大小, 但它的值是Section Alignment的整数倍. 在这例程里, Section Alignment是00001000, 而且也应该不需要更多的内存空间了, 所以直接设置Virtaul Size为00001000就好: 先用PE View 找位置, 熟悉了后应该就不用了:

找到并直接修改保存. 就好了!

修改Size of Image的值
这个参数是在IMAGE_OPTIONAL_HEADER中的, 它的作用是指定所有节区加载内存后, 一共需要多少内存空间大小. 修改起来问题不大, 就是找到指定的地址, 00000120


到这里, 把程序运行起来, 不报错, 基本上都证明是操作正确了!!
修改新节区的属性(权限)
上面的操作是成功添加了一个节区, 还没上, 我们是需要向里面插入可执行代码和数据的. 但节区头信息里有一个参数会限定这个节区所能做的事, 下面看看这个参数:





更多精彩