最近发现一个比较有趣的事情,不知道是不是很常见,在windows NT6.X里面,对bootmgr.exe的签名,其签名数据直接附加在PE文件末尾,其偏移地址和大小由 optional header -> data directories -> SecurityDirectoryRVA SecurityDirectorySize 指定,而SecurityDirectoryRVA 的值直接为PE文件的实际长度。
这导致像 CFF Explorer VII这样的工具打开bootmgr.exe时认为SecurityDirectoryRVA 这个字段值无效,被标记为红色,貌似是他去sections里面找地址发现没有匹配的。
通过一个叫 wimboot 的开源项目,在他的peloader.c里发现了一段注释:
/* Load copy of raw image into memory immediately after loaded * sections. This seems to be used for verification of X.509 * signatures. */ raw_base = ( pe->base + pe->len ); memcpy ( raw_base, data, len ); pe->len += len; DBG2 ( "...raw copy to %p+%#zx\n", raw_base, len );