Skip to content

Refactor bin_bootimg.c to remove RZ_PACKED #5814

@wargio

Description

@wargio

Currently struct boot_img_hdr (a.k.a. BootImage) in librz/bin/p/bin_bootimg.c uses RZ_PACKED.

The idea is to rewrite the load_buffer function to not call rz_buf_read_at but instead use the rz_buf_offset_* APIs.

Also this plugins is probably missing tests, which should be added to the test suite.

how to use the RzBuffer api.

Define a structure in a normal way (so no RZ_PACKED, etc...):

typedef struct foo_s {
   ut32 num32;
   char name[10];
   ....
   ut16 val16;
} foo_t;

Then you use the offset API that i mention:

static bool parse_foo(RzBuffer *b, foo_t *foo, bool big_endian) {
    ut64 offset = 0;
    return rz_buf_read_ble32_offset(b, &offset, &foo->num32, big_endian) &&
               rz_buf_read_offset(b, &offset, foo->name, sizepf(foo->name)) &&
               ...
              rz_buf_read_ble16_offset(b, &offset, &foo->val16, big_endian) ;
}

This parses the same structure as the packed one via memcpy(foo, buffer, sizeof(foo)); but is portable.

Real world example:

static bool nds_read_header(RzBuffer *buf, NDSHeader *hdr) {
ut64 offset = 0;
return rz_buf_read_offset(buf, &offset, (ut8 *)hdr->title, sizeof(hdr->title)) &&
rz_buf_read_offset(buf, &offset, (ut8 *)hdr->gamecode, sizeof(hdr->gamecode)) &&
rz_buf_read_offset(buf, &offset, (ut8 *)hdr->makercode, sizeof(hdr->makercode)) &&
rz_buf_read8_offset(buf, &offset, &hdr->unitcode) &&
rz_buf_read8_offset(buf, &offset, &hdr->devicetype) &&
rz_buf_read8_offset(buf, &offset, &hdr->devicecap) &&
rz_buf_read_offset(buf, &offset, hdr->reserved1, sizeof(hdr->reserved1)) &&
rz_buf_read8_offset(buf, &offset, &hdr->romversion) &&
rz_buf_read8_offset(buf, &offset, &hdr->reserved2) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_rom_offset) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_entry_address) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_ram_address) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_size) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_rom_offset) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_entry_address) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_ram_address) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_size) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->fnt_offset) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->fnt_size) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->fat_offset) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->fat_size) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_overlay_offset) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_overlay_size) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_overlay_offset) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_overlay_size) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->rom_control_info1) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->rom_control_info2) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->banner_offset) &&
rz_buf_read_le16_offset(buf, &offset, &hdr->secure_area_crc) &&
rz_buf_read_le16_offset(buf, &offset, &hdr->secure_transfer_timeout) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_autoload) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_autoload) &&
rz_buf_read_le64_offset(buf, &offset, &hdr->secure_disable) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->ntr_region_rom_size) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->rom_header_size) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x88) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x8C) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x90) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x94) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x98) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x9C) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xA0) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xA4) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xA8) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xAC) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xB0) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xB4) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xB8) &&
rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xBC) &&
rz_buf_read_offset(buf, &offset, hdr->logo, sizeof(hdr->logo)) &&
rz_buf_read_le16_offset(buf, &offset, &hdr->logo_crc) &&
rz_buf_read_le16_offset(buf, &offset, &hdr->header_crc);
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions