main.c
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #define ENV_OFFSET 0x5f004 #define ENV_LENGTH (0x1000 - 4) static char buf[512 * 1024] = {0}; void dump_mtd(void) { system("dd if=/dev/mtdblock0 of=m0.backup"); system("dd if=/dev/mtdblock1 of=m1.backup"); system("dd if=/dev/mtdblock2 of=m2.backup"); system("dd if=/dev/mtdblock3 of=m3.backup"); system("dd if=/dev/mtdblock4 of=m4.backup"); system("dd if=/dev/mtdblock5 of=m5.backup"); system("dd if=/dev/mtdblock6 of=m6.backup"); system("dd if=/dev/mtdblock7 of=m7.backup"); } int parse_string(const char *p) { while (*p) { printf("\"%s\"\n", p); p += strlen(p) + 1; } return 0; } unsigned int crc32b(unsigned char *buf, int len) { int i = 0, j = 0; unsigned int byte = 0, crc = 0, mask = 0; crc = 0xffffffff; for (i=0; i<len; i++) { byte = buf[i]; crc = crc ^ byte; for (j = 7; j >= 0; j--) { mask = -(crc & 1); crc = (crc >> 1) ^ (0xedb88320 & mask); } } return ~crc; } int main(int argc, char **argv) { dump_mtd(); int len = 0, fd = open("m0.backup", O_RDONLY); if(fd < 0){ printf("failed to open m0.backup\n"); return -1; } len = read(fd, buf, sizeof(buf)); close(fd); parse_string(&buf[ENV_OFFSET]); printf("crc32: 0x%x\n", crc32b(&buf[ENV_OFFSET], ENV_LENGTH)); return 0; }
編譯
$ /opt/miyoo/bin/arm-linux-gcc main.c -o dump -static
執行
# ./dump "SdUpgradeImage=miyoo354_fw.img" "baudrate=115200" "bootargs=console=ttyS0,115200 root=/dev/mtdblock4 rootfstype=squashfs ro init=/linuxrc LX_MEM=0x7f00000 mma_heap=mma_heap_name0,miu=0,sz=0x1500000 mma_memblock_remove=1 highres=off mmap_reserved=fb,miu=0,sz=0x300000,max_start_off=0x7C00000,max_end_off=0x7F00000" "bootcmd=gpio output 85 1; bootlogo 0 0 0 0 0; mw 1f001cc0 11; gpio out 8 0; sf probe 0;sf read 0x22000000 ${sf_kernel_start} ${sf_kernel_size}; gpio out 8 1; sleepms 1000; gpio output 4 1; bootm 0x22000000" "bootdelay=0" "cpu_part_start=14270000" "dispout=K101_IM2BVL" "ethact=sstar_emac" "ethaddr=00:30:1b:ba:02:db" "filesize=1774c" "miyoo_version=202303262339" "sf_kernel_size=200000" "sf_kernel_start=60000" "sf_part_size=20000" "sf_part_start=270000" "stderr=serial" "stdin=serial" "stdout=serial" "usb_folder=images" crc32: 0x47a7e93c