改造小蚁摄像头支持免费无限容量云储存(支持小容量SD卡篇)

通过上一篇的操作,我们成功将网盘挂载到了小蚁摄像头上,同时也避免了内存卡的频繁读写。但是现在又引申出另一个问题,原本我们为了尽可能多的保存视频文件选用的都是大容量内存卡。现在视频文件不存内存卡上了,再插这么大的内存卡也没什么意义了。刚好家里翻出来几张十几年前1G容量的内存卡,是不是可以拿它废物利用?


实际测试下来发现,小蚁官方固件对小于4G容量的内存卡做了限制,一旦插入根本不录制视频了,同时也导致上一步的云存储失去了作用。所以破解限制势在必行。

同样通过分析摄像头启动流程,我们发现/home/base/init.sh含有这样一段逻辑

mount tmpfs /tmp -t tmpfs -o size=16m
mkdir /tmp/sd

#rtctime=$(/home/base/tools/rtctool -g time)
#date -s $rtctime

checkdisk

umount -l /tmp/sd
mount /dev/mmcblk0p1 /tmp/sd
#rm /tmp/sd/record/*.tmp
rm /tmp/sd/*.REC
find /tmp/sd/record -name "*.tmp" -exec rm {} \;

在初始化摄像头的时候,固件会执行checkdisk命令校验内存卡容量和文件系统是否满足要求。通过反编译checkdisk得到以下代码


  tfcard_size_v2 = get_tfcard_size_v2();
  if ( *(_DWORD *)(g_sysconf_ptr + 296) == 1 )
  {
    system_cmd_withret_timeout("fdisk /dev/mmcblk0 < /home/base/tools/fdisk.input", v13, 10240, 60);
    if ( tfcard_size_v2 >= 0x8000 )
      v9 = "/home/base/tools/mkexfatfs /dev/mmcblk0p1";
    else
      v9 = "/home/base/tools/mkfs.fat /dev/mmcblk0p1";
    system_cmd_withret_timeout(v9, v13, 10240, 120);
    *(_DWORD *)(g_sysconf_ptr + 296) = 0;
  }
  if ( tfcard_size_v2 >= 3072 )
  {
    fs_type = get_fs_type();
    if ( (unsigned int)(fs_type - 1) > 1 )
    {
      dump_string("checkdisk.c", "main", 318, (struct tm *)"FS format error.");
      system_cmd_withret_timeout("rmmod exfat.ko", v13, 10240, 60);
      if ( !*(_DWORD *)(g_sysconf_ptr + 296) )
      {
        v3 = 10002;
        *(_DWORD *)(g_sysconf_ptr + 220) = 10002;
        goto LABEL_12;
      }
      umount("/tmp/sd");
      v3 = 10002;
    }
    else
    {
      umount("/tmp/sd");
      if ( fs_type == 1 )
      {
        v11 = mount("/dev/mmcblk0p1", "/tmp/sd", "vfat", 0, 0);
      }
      else
      {
        if ( fs_type != 2 )
        {
          umount("/tmp/sd");
          goto LABEL_10;
        }
        v11 = mount("/dev/mmcblk0p1", "/tmp/sd", "exfat", 0, 0);
      }
      if ( v11 == -1 )
      {
        dump_string("checkdisk.c", "main", 341, &stru_B520);
        v3 = 10011;
        goto LABEL_12;
      }
    }
    umount("/tmp/sd");
    if ( tfcard_size_v2 > 0x8000 && fs_type == 1 )
    {
      dump_string("checkdisk.c", "main", 349, (struct tm *)"FS format error.");
      v3 = 10002;
      goto LABEL_12;
    }
    if ( fs_type == 1 )
    {
      v3 = check_partion_vfat();
    }
    else if ( fs_type == 2 )
    {
      v3 = check_partion_exfat();
    }
LABEL_10:
    if ( *(_DWORD *)(g_sysconf_ptr + 296) == 1 )
      *(_DWORD *)(g_sysconf_ptr + 296) = 0;
    goto LABEL_12;
  }

阅读代码我们可以了解到固件使用cat /sys/block/mmcblk0/size 命令检测内存卡容量是否大于3072,如果不满足就停止录制。

所以这里的改造思路已经很清晰了,

1.要么修改chkdisk文件,把3072改小。

2.要么通过hook cat 命令,让它不管什么时候都返回大于3072的数字。

cat /sys/block/mmcblk0/size

经过测试,这两种方案都可行。

这里为了方便演示,我们选择方案2改造.

1.把以下命令保存为shell脚本cat.hook。把脚本放到后台的环境变量可执行目录里,这里是放到/home/base/tools/下

#!/bin/sh

# location:/home/base/init.sh
# location:/home/base/tools/cat
# hook system cat command for support < 4GB sd card
if [ "$1" == "/sys/block/mmcblk0/size" ]; then
    echo 7802880
else
    /bin/cat "$@"
fi

2.修改/home/base/init.sh,在执行chkdisk命令的前后加上以下逻辑,这里的思路是检测内存卡之前替换掉正版的cat命令 使它永远输出大于4GB的容量误导固件,检测完之后再把cat还原。

mv /home/base/tools/cat.hook /home/base/tools/cat
chmod +x /home/base/tools/cat

checkdisk

mv /home/base/tools/cat /home/base/tools/cat.hook

到了这里我们的改造步骤就全部结束了。成功的对老旧内存卡进行了废物利用。

以上脚本已经全部上传至github yi-hack-v5-plugins 希望大家帮忙点个star!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值