在源码中指定PE节
Win32ASM在定义段时指定节:
.386
.model stdcall, flat
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
sfdata segment ;指定节名为 'sfdata'
string db 'hello world!', 0
sfdata ends
sfcode segment ;指定节名为 'sfcode'
start:
mov eax, offset string
invoke MessageBox, 0, eax, eax, MB_OK
ret
sfcode ends
end start
编译之后,用工具查看生成的节:
CPP中指定节:
//指定节为"mysec",属性为可读可写
//在"..\Microsoft Visual Studio 9.0\VC\crt\src\sect_attribs.h"中,
//出现含有'$'的节名,如".CRT$XIZ",
//其中.CRT是真正节名, XIZ只是用于obj文件
#pragma section("mysec",read,write)
//把buf存放在"mysec"节中
__declspec(allocate("mysec"))
char buf[] = "hello world!";
//如果未引用节中的数据,PE中可能不生成相应的节,数据可以在main中引用
int main() {}

可以用下面指令将两个节合并,合并之后,取后者节名:
#pragmacomment(linker,"/merge:mysec=.data") //合并后,使用.data做节名
mysec被合并之后: