예제 #1
0
파일: PEFormat.cpp 프로젝트: yzx65/Packer
size_t PEFormat::estimateSize() const
{
	size_t size = 0x400;
	for(auto &i : sections_)
		size += multipleOf(i.data->size(), 0x200);
	return size;
}
예제 #2
0
ResampleFilter::ResampleFilter(int samplingRate, int bitDepth)
:
	m_binary(lamexp_lookup_tool("sox.exe"))
{
	if(m_binary.isEmpty())
	{
		THROW("Error initializing SoX filter. Tool 'sox.exe' is not registred!");
	}

	m_samplingRate = (samplingRate > 0) ? qBound(8000, samplingRate, 192000) : 0;
	m_bitDepth = (bitDepth > 0) ? qBound(8, multipleOf(bitDepth, 8), 32) : 0;

	if((m_samplingRate == 0) && (m_bitDepth == 0))
	{
		qWarning("ResampleFilter: Nothing to do, filter will be NOP!");
	}
}
예제 #3
0
파일: PEFormat.cpp 프로젝트: yzx65/Packer
void PEFormat::save(SharedPtr<DataSource> target)
{
	//1. Preparation
	List<IMAGE_SECTION_HEADER> sectionHeaders;
	Map<uint32_t, uint32_t> rawDataMap;

	const uint32_t sectionAlignment = 0x1000;
	const uint32_t fileAlignment = 0x200;
	uint32_t imageSize = 0;
	uint32_t dataOffset = 0x400;
	for(auto &i : sections_)
	{
		IMAGE_SECTION_HEADER sectionHeader;
		zeroMemory(&sectionHeader, sizeof(sectionHeader));
		copyMemory(sectionHeader.Name, &i.name[0], i.name.length() + 1);
		sectionHeader.VirtualAddress = static_cast<uint32_t>(i.baseAddress);
		sectionHeader.VirtualSize = static_cast<uint32_t>(i.size);
		sectionHeader.SizeOfRawData = multipleOf(i.data->size(), fileAlignment);
		if(sectionHeader.SizeOfRawData)
			sectionHeader.PointerToRawData = dataOffset;
		else
			sectionHeader.PointerToRawData = 0;
		sectionHeader.Characteristics = 0;
		if(i.flag & SectionFlagData)
			sectionHeader.Characteristics |= IMAGE_SCN_CNT_INITIALIZED_DATA;
		if(i.flag & SectionFlagUninitializedData)
			sectionHeader.Characteristics |= IMAGE_SCN_CNT_UNINITIALIZED_DATA;
		if(i.flag & SectionFlagCode)
			sectionHeader.Characteristics |= IMAGE_SCN_CNT_CODE;
		if(i.flag & SectionFlagRead)
			sectionHeader.Characteristics |= IMAGE_SCN_MEM_READ;
		if(i.flag & SectionFlagWrite)
			sectionHeader.Characteristics |= IMAGE_SCN_MEM_WRITE;
		if(i.flag & SectionFlagExecute)
			sectionHeader.Characteristics |= IMAGE_SCN_MEM_EXECUTE;

		sectionHeaders.push_back(sectionHeader);
		rawDataMap.insert(sectionHeader.VirtualAddress, dataOffset);
		dataOffset += sectionHeader.SizeOfRawData;
		imageSize = multipleOf(sectionHeader.VirtualAddress + sectionHeader.VirtualSize, sectionAlignment);
	}

	//2. Write headers
	uint8_t *originalHeader = header_->get();
	uint8_t *targetMap = target->map(0);
	IMAGE_DOS_HEADER *dosHeader = getStructureAtOffset<IMAGE_DOS_HEADER>(originalHeader, 0);
	IMAGE_FILE_HEADER fileHeader;
	IMAGE_OPTIONAL_HEADER_BASE optionalHeaderBase;
	const uint32_t ntSignature = IMAGE_NT_SIGNATURE;

	copyMemory(&fileHeader, getStructureAtOffset<IMAGE_FILE_HEADER>(originalHeader, dosHeader->e_lfanew + sizeof(uint32_t)), sizeof(IMAGE_FILE_HEADER));
	copyMemory(&optionalHeaderBase, getStructureAtOffset<IMAGE_OPTIONAL_HEADER_BASE>(originalHeader, dosHeader->e_lfanew + sizeof(uint32_t) + sizeof(IMAGE_FILE_HEADER)), sizeof(IMAGE_OPTIONAL_HEADER_BASE));

	fileHeader.NumberOfSections = sections_.size();

	size_t offset = 0;
	copyMemory(targetMap, originalHeader, dosHeader->e_lfanew); offset += dosHeader->e_lfanew;
	copyMemory(targetMap + offset, &ntSignature, sizeof(ntSignature)); offset += sizeof(ntSignature);
	copyMemory(targetMap + offset, &fileHeader, sizeof(IMAGE_FILE_HEADER)); offset += sizeof(IMAGE_FILE_HEADER);

	if(info_.architecture == ArchitectureWin32)
	{
		IMAGE_OPTIONAL_HEADER32 optionalHeader;
		copyMemory(&optionalHeader, getStructureAtOffset<IMAGE_OPTIONAL_HEADER32>(originalHeader, offset), sizeof(IMAGE_OPTIONAL_HEADER32));
		optionalHeader.SizeOfImage = imageSize;
		optionalHeader.FileAlignment = fileAlignment;
		optionalHeader.SectionAlignment = sectionAlignment;

		copyMemory(targetMap + offset, &optionalHeader, sizeof(IMAGE_OPTIONAL_HEADER32)); offset += sizeof(IMAGE_OPTIONAL_HEADER32);
	}
	else if(info_.architecture == ArchitectureWin32AMD64)
	{
		IMAGE_OPTIONAL_HEADER64 optionalHeader;
		copyMemory(&optionalHeader, getStructureAtOffset<IMAGE_OPTIONAL_HEADER64>(originalHeader, offset), sizeof(IMAGE_OPTIONAL_HEADER64));
		optionalHeader.SizeOfImage = sectionAlignment;
		optionalHeader.FileAlignment = fileAlignment;
		optionalHeader.SectionAlignment = sectionAlignment;

		copyMemory(targetMap + offset, &optionalHeader, sizeof(IMAGE_OPTIONAL_HEADER64)); offset += sizeof(IMAGE_OPTIONAL_HEADER64);
	}
	
	for(auto &i : sectionHeaders)
	{
		copyMemory(targetMap + offset, &i, sizeof(IMAGE_SECTION_HEADER)); 
		offset += sizeof(IMAGE_SECTION_HEADER);
	}

	for(auto &i : sections_)
	{
		dataOffset = rawDataMap[static_cast<uint32_t>(i.baseAddress)];
		copyMemory(targetMap + dataOffset, i.data->get(), i.data->size());
	}

	target->unmap();
}