Dump fix

eXeL@B DVD

Материал из Справочник исследователя программ

Перейти к: навигация, поиск

Что такое Dumpfixer (фикс дампа)?

Не думайте, что это какая-то программа! Это термин. Dumpfixer - это установка параметра Raw Offset, каждой секции файла, равному Virtual Offset. После загрузки, все секции в памяти размещаются так, как это указано в Virtual Offset и Size полях описания секций. Но при дампе память сохраняется на диск, и для чтения уже используются Raw Offset и Size, которые уже не будут соответствовать дампу. Проще говоря, это нужно для того, чтобы смещение секции в памяти соответствовало смещению данной секции в файле.


Пример кода для автоматического исправления параметров секций

C

#define MAKE_PTR(Type, Base, Offset) ((Type)((DWORD)Base + (DWORD)(Offset)))

BOOL CorrectSection(LPVOID lpBase)
{
	if (IsBadReadPtr(lpBase, 1024))
		return FALSE;

	PIMAGE_DOS_HEADER lpDosHeader = (PIMAGE_DOS_HEADER)lpBase;
	if (lpDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
		return FALSE;

	PIMAGE_NT_HEADERS lpNtHeaders = MAKE_PTR(PIMAGE_NT_HEADERS, lpBase, lpDosHeader->e_lfanew);
	if (lpNtHeaders->Signature != IMAGE_NT_SIGNATURE)
		return FALSE;

	// фиксим файловые смещения в секциях
	PIMAGE_SECTION_HEADER lpSections = MAKE_PTR(PIMAGE_SECTION_HEADER, &lpNtHeaders->OptionalHeader, lpNtHeaders->FileHeader.SizeOfOptionalHeader);
	USHORT SectionCount = lpNtHeaders->FileHeader.NumberOfSections;
	for (SIZE_T i = 0; i < SectionCount; i++) {
		lpSections[i].SizeOfRawData    = lpSections[i].Misc.VirtualSize;
		lpSections[i].PointerToRawData = lpSections[i].VirtualAddress;

		// на всякий случай выравниваем размер секции
		if (lpSections[i].SizeOfRawData % lpNtHeaders->OptionalHeader.SectionAlignment)
			lpSections[i].SizeOfRawData = ((lpSections[i].SizeOfRawData/lpNtHeaders->OptionalHeader.SectionAlignment)+1)*lpNtHeaders->OptionalHeader.SectionAlignment;
	}

	// фиксим размер образа
	lpNtHeaders->OptionalHeader.SizeOfImage = lpSections[SectionCount-1].SizeOfRawData + lpSections[SectionCount-1].PointerToRawData;
	return TRUE;
}
Источник — «https://exelab.ru/faq/Dump_fix»