#!/usr/bin/perl use strict; use warnings; my $mem = ""; my ($section, $load_id, $offset_to_next_load, $load_size, $load_path, $crc32_load_path); my $hex_data = "54424c004100001300000BAD2F62696E2F7465737432302E64666C376F6B0F42000013000000042F62696E2F7465737430312E64666C376D6C0F43000013000000042F62696E2F7465737430322E64666C376D6D0F44000013000000042F62696E2F7465737430332E64666C376D6E0F45000013000000042F62696E2F7465737430342E64666C376D6F0F46000013000000042F62696E2F7465737430352E64666C376D700F47000013000000042F62696E2F7465737430362E64666C376D710F48000013000000042F62696E2F7465737430372E64666C376D720F49000013000000042F62696E2F7465737430382E64666C376D730F4A000013000000042F62696E2F7465737430392E64666C376D740F4B000013000000042F62696E2F7465737431302E64666C376E6B0F4C000013000000042F62696E2F7465737431312E64666C376E6C0F4D000013000000042F62696E2F7465737431322E64666C376E6D0F4E000013000000042F62696E2F7465737431332E64666C376E6E0F4F000013000000042F62696E2F7465737431342E64666C376E6F0F50000013000000042F62696E2F7465737431352E64666C376E700F51000013000000042F62696E2F7465737431362E64666C376E710F52000013000000042F62696E2F7465737431372E64666C376E720F53000013000000042F62696E2F7465737431382E64666C376E730F54000013000000042F62696E2F7465737431392E64666C376E740F55000011000000042F6574632F74657374322E73683B0C08495600000D000000082F477053772E63686B1175D3BB"; # put hex data into memory $mem = pack('H*', $hex_data ); # unpack null terminated section name from memory $section = unpack('Z*', $mem); $mem = substr($mem, length($section) + 1 ); # print section name print $section . ":\n"; for (1 .. length($section) + 1){print "-"} print "\n\n"; # unpack and print load id, offset, size, path (length of path is "offset - 4") and crc32 of each load entry while (length($mem) > 0) { ($load_id, $offset_to_next_load, $load_size) = unpack('n n N', $mem); $mem = substr($mem, 8); print "Load ID : " . $load_id . "\n"; print "Offset to next load : " . $offset_to_next_load . "\n"; print "Load Size : " . $load_size . "\n"; ($load_path, $crc32_load_path) = unpack('A' . ($offset_to_next_load-4) . 'N', $mem); $mem = substr($mem, $offset_to_next_load); print "Load Path : " . $load_path . "\n"; print "CRC32 of Load Path : " . $crc32_load_path . "\n"; print "\n\n"; }