Debian簡易MBRチェック

■昨日の2つ目の更新は以下。
 ※Windowsでなんとかしようと考えない方が良い事が改めて分かりました。

 Squidログの検索結果のURLデコード
 http://labunix.hateblo.jp/entry/2012/02/04/224407

■MBRの確認方法
 ※以下の内、fdiskで見れる情報は除外する。

 MBR関連コマンド-debian
 http://d.hatena.ne.jp/labunix/20110107

■dfから得られるパーティション情報を基に自動的にチェックする。
 ※対象のディスクのマウントが必要、実行すると以下のような出力になる。

$ sudo ./mbrchk.sh
INFO:root check ok.

INFO:/dev/sda   0xaa55
INFO:/dev/sda1  0x80
INFO:JUMP       0x48eb
INFO:GRUB       0x0203
#Stage2
INFO:load       0x2000
INFO:Secter     0x00000000
INFO:Segment    0x0202

INFO:/dev/sdb   0xaa55
ERROR:Not Found Active Partition /dev/sdb
ERROR:/dev/sdb MBR first jump
ERROR:Other bootloader version 0x0000
#Stage2
INFO:load       0x0000
INFO:Secter     0x00000000
INFO:Segment    0x0000

■スクリプト
 ・ファイルに残しても滅多に使わないので、必要なときだけ実行するようにした。
 ・ddの細かい設定の出来ないシステムでは使えない。
 ・以外と長いが大したことはしていない。

$ cat mbrchk.sh
#!/bin/bash

if [ `id -u` -eq "0" ];then
  echo "INFO:root check ok."
  echo ""
else
  echo "ERROR:Please run as root"
  exit 1
fi

# example : /dev/sda /dev/hda
devlist=$(df -h | grep '^/dev/[hs]d' | awk '{print $1}' | sed s/[0-9]//g | sort | uniq)


for bootdev in ${devlist};do
  #MBR enable check, Signature = 0xAA55
  BOOTSIG=$(dd if=${bootdev} bs=2 skip=255 count=1 2> /dev/null | od -tx1 | \
    awk '{print "0x" $3$2}' | grep '0xaa55')
  if [ ${BOOTSIG} == '0xaa55' ];then
    echo -e "INFO:${bootdev} \t${BOOTSIG}"
  else
    echo "ERROR:Not found boot signature ${bootdev}"
  fi

  #MBR boot Partition check, /dev/[hs]d[abcd] = 0x80
  BOOTFLAG=$(dd if=${bootdev} bs=2 skip=223 count=32 2> /dev/null | od -tx1 | \
    awk '{print $2}' | nl | grep '80' | awk '{print $1 " " $2}')
  echo ${BOOTFLAG} | grep 80 > /dev/null 2>&1 && \
    echo "INFO:${bootdev}${BOOTFLAG}" | awk '{print $1 " \t0x" $2}' || \
    echo "ERROR:Not Found Active Partition ${bootdev}"

  #MBR first binary check, 0x48eb
  JUMP=$(dd if=${bootdev} bs=2 count=1 2> /dev/null | od -tx1 | \
    awk '{print "0x" $3$2}' | grep '48eb')
  echo ${JUMP} | grep '48eb' > /dev/null 2>&1 && \
    echo -e "INFO:JUMP\t${JUMP}" || \
    echo "ERROR:${bootdev} MBR first jump ${JUMP}"

  # boot loader version check
  VERSION=$(dd if=${bootdev} bs=2 skip=31 count=1 2> /dev/null | od -tx1 | \
    awk '{print "0x" $3$2}' | grep "0x[0-9a-f]")
  if [ ${VERSION} == "0x0203" ];then
    echo -e "INFO:GRUB \t${VERSION}"
  else
    echo -e "ERROR:Other bootloader version ${VERSION}"
  fi

  echo "#Stage2"
  STAGE2LOAD=$(dd if=${bootdev} bs=2 skip=33 count=1 2> /dev/null | od -tx1 | \
    awk '{print "0x" $3$2}' | grep "0x[0-9a-f]")
  echo -e "INFO:load\t${STAGE2LOAD}"

  STAGE2SECT=$(dd if=${bootdev} bs=2 skip=34 count=2 2> /dev/null | od -tx1 | \
    awk '{print "0x" $5$4$3$3}' | grep "0x[0-9a-f]")
  echo -e "INFO:Secter\t${STAGE2SECT}"

  STAGE2SEG=$(dd if=${bootdev} bs=2 skip=36 count=1 2> /dev/null | od -tx1 | \
    awk '{print "0x" $3$3}' | grep "0x[0-9a-f]")
  echo -e "INFO:Segment\t${STAGE2SEG}"


  # End loop
  echo ""
done