41 lines
2.0 KiB
JavaScript
41 lines
2.0 KiB
JavaScript
|
import ArrayFormatBase from './ArrayFormatBase.js';
|
||
|
import FormatBase from './FormatBase.js';
|
||
|
import ImageDataDirectoryArray from './ImageDataDirectoryArray.js';
|
||
|
import ImageDirectoryEntry from './ImageDirectoryEntry.js';
|
||
|
import ImageDosHeader from './ImageDosHeader.js';
|
||
|
import ImageFileHeader from './ImageFileHeader.js';
|
||
|
import ImageNtHeaders from './ImageNtHeaders.js';
|
||
|
import ImageOptionalHeader from './ImageOptionalHeader.js';
|
||
|
import ImageOptionalHeader64 from './ImageOptionalHeader64.js';
|
||
|
import ImageSectionHeaderArray from './ImageSectionHeaderArray.js';
|
||
|
export { ArrayFormatBase, FormatBase, ImageDataDirectoryArray, ImageDirectoryEntry, ImageDosHeader, ImageFileHeader, ImageNtHeaders, ImageOptionalHeader, ImageOptionalHeader64, ImageSectionHeaderArray, };
|
||
|
export function getImageDosHeader(bin) {
|
||
|
return ImageDosHeader.from(bin);
|
||
|
}
|
||
|
export function getImageNtHeadersByDosHeader(bin, dosHeader) {
|
||
|
return ImageNtHeaders.from(bin, dosHeader.newHeaderAddress);
|
||
|
}
|
||
|
export function getImageSectionHeadersByNtHeaders(bin, dosHeader, ntHeaders) {
|
||
|
return ImageSectionHeaderArray.from(bin, ntHeaders.fileHeader.numberOfSections, dosHeader.newHeaderAddress + ntHeaders.byteLength);
|
||
|
}
|
||
|
export function findImageSectionBlockByDirectoryEntry(bin, dosHeader, ntHeaders, entryType) {
|
||
|
var arr = ImageSectionHeaderArray.from(bin, ntHeaders.fileHeader.numberOfSections, dosHeader.newHeaderAddress + ntHeaders.byteLength);
|
||
|
var len = arr.length;
|
||
|
var rva = ntHeaders.optionalHeaderDataDirectory.get(entryType).virtualAddress;
|
||
|
for (var i = 0; i < len; ++i) {
|
||
|
var sec = arr.get(i);
|
||
|
var vaEnd = sec.virtualAddress + sec.virtualSize;
|
||
|
if (rva >= sec.virtualAddress && rva < vaEnd) {
|
||
|
var ptr = sec.pointerToRawData;
|
||
|
if (!ptr) {
|
||
|
return null;
|
||
|
}
|
||
|
return bin.slice(ptr, ptr + sec.sizeOfRawData);
|
||
|
}
|
||
|
if (rva < sec.virtualAddress) {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
return null;
|
||
|
}
|