mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-28 04:43:54 -06:00
contrib/elf2dmp: add PE name check and Windows Server 2022 support
Since its inception elf2dmp has checked MZ signatures within an address space above IDT[0] interrupt vector and took first PE image found as Windows Kernel. But in Windows Server 2022 memory dump this address space range is full of invalid PE fragments and the tool must check that PE image is 'ntoskrnl.exe' actually. So, introduce additional validation by checking image name from Export Directory against 'ntoskrnl.exe'. Signed-off-by: Viktor Prutyanov <viktor@daynix.com> Tested-by: Yuri Benditovich <yuri.benditovich@daynix.com> Reviewed-by: Annie Li <annie.li@oracle.com> Message-id: 20230222211246.883679-4-viktor@daynix.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
06ac60b73e
commit
d399d6b179
2 changed files with 41 additions and 2 deletions
|
@ -17,6 +17,7 @@
|
|||
|
||||
#define SYM_URL_BASE "https://msdl.microsoft.com/download/symbols/"
|
||||
#define PDB_NAME "ntkrnlmp.pdb"
|
||||
#define PE_NAME "ntoskrnl.exe"
|
||||
|
||||
#define INITIAL_MXCSR 0x1f80
|
||||
|
||||
|
@ -405,6 +406,25 @@ static int write_dump(struct pa_space *ps,
|
|||
return fclose(dmp_file);
|
||||
}
|
||||
|
||||
static bool pe_check_export_name(uint64_t base, void *start_addr,
|
||||
struct va_space *vs)
|
||||
{
|
||||
IMAGE_EXPORT_DIRECTORY export_dir;
|
||||
const char *pe_name;
|
||||
|
||||
if (pe_get_data_dir_entry(base, start_addr, IMAGE_FILE_EXPORT_DIRECTORY,
|
||||
&export_dir, sizeof(export_dir), vs)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
pe_name = va_space_resolve(vs, base + export_dir.Name);
|
||||
if (!pe_name) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return !strcmp(pe_name, PE_NAME);
|
||||
}
|
||||
|
||||
static int pe_get_pdb_symstore_hash(uint64_t base, void *start_addr,
|
||||
char *hash, struct va_space *vs)
|
||||
{
|
||||
|
@ -489,6 +509,7 @@ int main(int argc, char *argv[])
|
|||
uint64_t KdDebuggerDataBlock;
|
||||
KDDEBUGGER_DATA64 *kdbg;
|
||||
uint64_t KdVersionBlock;
|
||||
bool kernel_found = false;
|
||||
|
||||
if (argc != 3) {
|
||||
eprintf("usage:\n\t%s elf_file dmp_file\n", argv[0]);
|
||||
|
@ -536,11 +557,14 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
if (*(uint16_t *)nt_start_addr == 0x5a4d) { /* MZ */
|
||||
break;
|
||||
if (pe_check_export_name(KernBase, nt_start_addr, &vs)) {
|
||||
kernel_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!nt_start_addr) {
|
||||
if (!kernel_found) {
|
||||
eprintf("Failed to find NT kernel image\n");
|
||||
err = 1;
|
||||
goto out_ps;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue