我编写了一个便携式可执行 (PE) 库,该库还提供了查找覆盖的起始偏移量(未映射到内存的 PE 的附加数据)。
到目前为止,我的算法找到覆盖偏移量如下所示:
public long getOverlayOffset() throws IOException {
if (offset == null) {
SectionTable table = data.getSectionTable();
offset = 0L;
for (SectionTableEntry section : table.getSectionEntries()) {
long pointerToRaw = section.get(POINTER_TO_RAW_DATA);
long sizeOfRaw = section.get(SIZE_OF_RAW_DATA);
long virtSize = section.get(VIRTUAL_SIZE);
//see https://code.google.com/p/corkami/wiki/PE#section_table: "if bigger than virtual size, then virtual size is taken. "
//and: "a section can have a null VirtualSize: in this case, only the SizeOfRawData is taken into consideration. "
if(virtSize != 0 && sizeOfRaw > virtSize) {
sizeOfRaw = virtSize;
}
long endPoint = pointerToRaw + sizeOfRaw;
if (offset < endPoint) {
offset = endPoint;
}
}
}
if(offset > file.length()) {
offset = file.length();
}
return offset;
}
我使用corkami作为来源来了解计算叠加偏移的一些几率。我不仅希望它健壮,而且要准确。我错过了什么?我还需要考虑什么?
注意:这里有一个类似的问题:How can one extract the appended data of a Portable Executable? 但到目前为止,它还没有涵盖可靠的算法。据我了解,在这个问题上使用工具就足够了。