linuxで考課用のFAT 32ファイルを生成するシステム構造例(二)


実験FAT 32-2説明:FAT 32-2目次のxxx.tar.gz解凍後はFAT 32ファイルシステムのパーティションミラーで、DBRとバックアップのパラメータエラーがあります.winhexで手動でDBRを修復し、修正後のDBRのmd 5 HASH値に答えてください.
要件:
1、WINHEXで手動で読み取る.
2、WINHEXテンプレート機能を使用してはいけません.
3、WINHEXファイルシステム解析機能を使用してはいけない.
4、エラー部分はDBR保留セクタ、FATテーブル部数、FATテーブルサイズ、ファイルシステムセクタ総数、クラスタ当たりセクタ数、有効終了フラグのみであり、残りの部分は変更できない.
5、ファイルシステムのセクタ総数は利用可能な最大値、すなわちミラーファイル全体のセクタ総数である.
6、記入したMD 5 HASH値はすべて大文字で、0 xヘッドマークまたはHテールマークを含まない.中間にスペース、タブ、'-'などの記号を含む任意の間隔記号があってはならない.WINHEXソフトウェアで演算したHASH値を基準とする.
実験目的:
1.FAT 32 DBRの構成を理解する.
2.FAT 32構造間の組合せ関係を理解する.
3、データエリアを通じてファイルシステムのパラメータを分析する方法を学ぶ.
4、WINHEXを使いこなす
問題ライブラリ(例):
1、  FAT32-2 ,     fat32-2-8.img    DBR    ,
      FAT   2  ,    DBR MD5 HASH 0x___,  
      FAT   1,    DBR MD5 HASH 0x___。
   //3ECB03CC3C8F3D3ED6DC4D502F1ADB31#78036840280382773A7F3C564A21A3F0//  。。
2、  FAT32-2 ,     fat32-2-9.img    DBR    ,
      FAT   2  ,    DBR MD5 HASH 0x___,  
      FAT   1,    DBR MD5 HASH 0x___。
   //30EA11DED5DA720351B8EA40603A2880#C9F6D77E941423A0900FEDDC11E43999//  。。
... ...

添付:実験環境生成スクリプト(python 3):
#!/usr/bin/python3
import os
import random
import hashlib
import struct

r=os.system
rc=random.choice
ri=random.randint
md5=hashlib.md5

sdata=[8,16,32,64]
#val = r("ls ~")
#print("val")
r("cd ~/FAT32-2")
r("ls")
fkaoti = open("FAT32-2-kaoti.txt",'w+')
for i in range(1,101):
  fd = ("fat32-2-%d.img" % i)
  r("qemu-img create -f raw %s %dM" % (fd,ri(10,200)+400))
  r("losetup /dev/loop0 %s" % fd)
  r("mkfs.fat -F 32 -s %d -R %d /dev/loop0" % (rc(sdata),ri(8,128)) )
  r("mount /dev/loop0 /mnt")
  #100 dirs
  for ii in range(1,100):
    dir1=ri(100,999999)
    r("mkdir /mnt/%d" % dir1)
    filenum=ri(10,100)
    for iii in range(1,filenum):
      file1=ri(1000000,9999999999)
      r("dd if=/dev/zero of=/mnt/%d/%d.txt seek=%d count=1 bs=512 2>/dev/null" % (dir1,file1,ri(8,16)) )
  r("umount /dev/loop0")
  r("losetup -d /dev/loop0")
  r("cd ~/FAT32-1")
  #     FAT    DBR HASH,      
  f = open("%s" % fd,'rb+')
  dbr = f.read(512)
  pad1,SecPerClus,ResevSecs,Fats,pad2,Sectors,SecPerFat,pad3,Sign=struct.unpack('<13sBHB15sII470sH',dbr)
  dbrMD5 = md5(dbr)
  Fats_t = 1
  ResevSecs_t = SecPerFat + ResevSecs
  dbr_1 = struct.pack('<13sBHB15sII470sH',pad1,SecPerClus,ResevSecs_t,Fats_t,pad2,Sectors,SecPerFat,pad3,Sign)
  dbrMD5_1 = md5(dbr_1)
  dbr_zero = struct.pack('<13sBHB15sII470sH',pad1,0,0,0,pad2,0,0,pad3,0)
  f.seek(0)
  f.write(dbr_zero)
  f.seek(6*512)
  f.write(dbr_zero)
  f.close()
  fkaoti.write("  FAT32-2 ,     %s    DBR    ,   FAT   2  ,    DBR MD5 HASH 0x___,\
     FAT   1,    DBR MD5 HASH 0x___。//%s#%s//  。。
"\    % (fd,dbrMD5.hexdigest().upper(),dbrMD5_1.hexdigest().upper()))   fkaoti.flush()   r("tar -zcf %s.tar.gz %s" % (fd[:-4],fd))   r("rm %s" % fd)   f_dbr = open("%s.dbr" % fd[:-4],'wb+')   f_dbr.write(dbr)   f_dbr.close() fkaoti.close()

導入プロセス:
1.liunxで上記スクリプトを実行する、FAT 32-2を生成する.imgとFAT 32-2-kaoti.txt(2部生成でき、1部は練習用、1部は試験用).そのうち、*.tar.gzは試験ミラー、FAT 32-2-kaoti.txtは生成された問題ファイル、run_fat32-2.pyは、上記のスクリプトファイル、*である.dbrはFATテーブル2部を例にとるべきdbrバックアップである.
2、試験問題ごとにFAT 32-2-kaoti.txtは試験システムを導入する.
3、試験問題ごとにFAT 32-2.imgは試験システム指定ディレクトリに入れます.
4、試験用の直接答案に関する書類を試験システムのディスクに入れてはいけない.