Bugfix: Fix broken segment table. Manually enforce original layout

This commit is contained in:
Mario Hüttel 2022-10-25 22:02:11 +02:00
parent baa34c7525
commit dafd51a376

View File

@ -232,6 +232,9 @@ static int elf_patch_update_info(elfpatch_handle_t *ep)
{
Elf_Kind ek;
const char *type_string = "unrecognized";
size_t header_count = 0ull;
GElf_Phdr phdr;
size_t i;
ret_val_if_ep_err(ep, -1001);
@ -273,7 +276,19 @@ static int elf_patch_update_info(elfpatch_handle_t *ep)
return -1;
}
/* Get program headers */
if ( elf_getphdrnum(ep->elf, &header_count) != 0) {
print_err("Error reading count of program headers: %s\n", elf_errmsg(-1));
return -1;
}
for (i = 0ull; i < header_count; i++) {
if (gelf_getphdr(ep->elf, (int)i, &phdr) != &phdr) {
print_err("Error reading program header (%zu): %s\n", i, elf_errmsg(-1));
return -1;
}
print_debug("Read program header %zu\n", i);
}
return 0;
}
@ -305,6 +320,9 @@ elfpatch_handle_t *elf_patch_open(const char *path, bool readonly)
goto close_fd;
}
/* Prewvent Libelf from relayouting the sections, which would brick the load segments */
elf_flagelf(ep->elf, ELF_C_SET, ELF_F_LAYOUT);
if (elf_patch_update_info(ep)) {
print_err("File malformatted. Cannot use for CRC patching\n");
goto close_elf;