壞檔的製作方式:修訂間的差異

出自 snowiki
前往: 導覽搜尋
(腳本)
 
(未顯示同一使用者於中間所作的 5 次修訂)
行 2: 行 2:
 
壞檔的製作共有兩種方式,一種是刪除部分檔案區塊,而另一種是取代部分檔案區塊,實現方式要靠python的腳本來達到目的。
 
壞檔的製作共有兩種方式,一種是刪除部分檔案區塊,而另一種是取代部分檔案區塊,實現方式要靠python的腳本來達到目的。
  
==刪除區塊==
+
=刪除區塊=
 
一般情況下,下載的檔案不會只出現某個區塊遺失的狀況,因此製作此種壞檔只是單純測試修復能力。
 
一般情況下,下載的檔案不會只出現某個區塊遺失的狀況,因此製作此種壞檔只是單純測試修復能力。
  
===腳本===
+
==腳本==
#開啟腳本後填寫刪除區塊的起始點(數值請填大於500)以即刪除區塊的長度(數值請填大於80)兩個參數,單位為byte
+
*開啟腳本後填寫刪除區塊的起始點(數值請填大於500)以及刪除區塊的總長度(數值請填大於80)兩個參數,單位為byte
#[http://pastebin.com/rAkbALvC 腳本備份]
+
*[http://pastebin.com/rAkbALvC 腳本備份]
 
<pre>
 
<pre>
 
#!/usr/bin/python3
 
#!/usr/bin/python3
行 47: 行 47:
 
     slice_file(source_filename, dest_filename, slice_from, slice_to, block)
 
     slice_file(source_filename, dest_filename, slice_from, slice_to, block)
 
</pre>
 
</pre>
===範例===
+
 
 +
==範例==
 
*檔案大小:12539482 byte
 
*檔案大小:12539482 byte
 
*區塊刪除起始點:location 509  
 
*區塊刪除起始點:location 509  
 
*區塊刪除長度:50byte
 
*區塊刪除長度:50byte
 
*結果:location 0x200~ 0x400 被刪除,因為block size為512byte,故採用無條件進入的方式計算來說結果合理。
 
*結果:location 0x200~ 0x400 被刪除,因為block size為512byte,故採用無條件進入的方式計算來說結果合理。
{{Warning|腳本上設計的缺失,前512 byte的資料無法透過這個腳本刪除,參數填的過小會導致檔案沒有更動}}
+
{{Warning|腳本上設計的限制,前512 byte的資料無法透過這個腳本刪除,參數填的過小會導致檔案沒有更動。}}<br />
 
+
{{Note|CLI可連續調用腳本實現一行指令同時刪除不同區塊的,但是腳本是以後方區塊刪除後往前堆疊的角度來設計故location的填寫必須先指定大才能指定小,舉例 '''cut.py test.rar test2.rar 4096 512 && cut.py test2.rar test3.rar 2048 512'''}}<br />
{{Note|CLI可連續調用腳本實現一行指令同時刪除不同區塊的,但是腳本是以後方區塊刪除後往前堆疊的角度來設計故location的填寫必須先指定大才能指定小,舉例 '''cut.py test.rar test2.rar 4096 512 && cut.py test2.rar test3.rar 2048 512'''}}
+
  
 
http://blessing.bdmv.info/tutorial/corrupt001.png
 
http://blessing.bdmv.info/tutorial/corrupt001.png
  
==區塊損壞==
+
=區塊損壞=
===腳本===
+
==腳本==
#開啟腳本後填寫改寫區塊的起始點以及改寫資料的長度共兩個參數,單位為byte,
+
*開啟腳本後填寫改寫區塊的起始點以及改寫資料的長度共兩個參數,單位為byte,
 
*[http://pastebin.com/dqqsRiMs 腳本備份]
 
*[http://pastebin.com/dqqsRiMs 腳本備份]
 
<pre>
 
<pre>
行 107: 行 107:
 
</pre>
 
</pre>
  
===範例===
+
==範例==
 
*檔案大小:12539482 byte
 
*檔案大小:12539482 byte
*區塊刪除起始點:location 0x00
+
*資料修改起始點:location 0x00
*區塊刪除長度:50byte
+
*資料修改長度:50byte
 
*結果:location 0x00~0x200資料被改寫,因為block size為512byte,故結果合理。
 
*結果:location 0x00~0x200資料被改寫,因為block size為512byte,故結果合理。
  
 
http://blessing.bdmv.info/tutorial/corrupt002.png
 
http://blessing.bdmv.info/tutorial/corrupt002.png

於 2014年6月22日 (日) 20:57 的最新修訂

簡介

壞檔的製作共有兩種方式,一種是刪除部分檔案區塊,而另一種是取代部分檔案區塊,實現方式要靠python的腳本來達到目的。

刪除區塊

一般情況下,下載的檔案不會只出現某個區塊遺失的狀況,因此製作此種壞檔只是單純測試修復能力。

腳本

  • 開啟腳本後填寫刪除區塊的起始點(數值請填大於500)以及刪除區塊的總長度(數值請填大於80)兩個參數,單位為byte
  • 腳本備份
#!/usr/bin/python3

default_block_size = 512

def slice_file(source_filename, dest_filename, slice_from, slice_to, block):
    f_in = open(source_filename, 'rb')
    f_out = open(dest_filename, 'wb')
    read_count = 0
    eof = False
    while not eof:
        read = f_in.read(block)
        if(len(read) < block): eof = True
        if(read_count < slice_from or read_count >= slice_to):
            f_out.write(read)
        read_count += block
    f_in.close()
    f_out.close()


if __name__ == '__main__':
    import sys
    if(len(sys.argv) < 3):
        print('missing arguments:')
        print(sys.argv[0] + ' source_filename dest_filename [slicing_starts_from slicing_length [block_size]]')
        quit()
    source_filename = sys.argv[1]
    dest_filename = sys.argv[2]
    if(len(sys.argv) < 4):
        slice_from = int(input('slicing starts from: '))
        slice_to = slice_from + int(input('slicing length: '))
    else:
        slice_from = int(sys.argv[3])
        slice_to = int(sys.argv[3]) + int(sys.argv[4])
    if(len(sys.argv) >= 6):
        block = int(sys.argv[6])
    else: block = default_block_size
    slice_file(source_filename, dest_filename, slice_from, slice_to, block)

範例

  • 檔案大小:12539482 byte
  • 區塊刪除起始點:location 509
  • 區塊刪除長度:50byte
  • 結果:location 0x200~ 0x400 被刪除,因為block size為512byte,故採用無條件進入的方式計算來說結果合理。

WarningGraphic.png 腳本上設計的限制,前512 byte的資料無法透過這個腳本刪除,參數填的過小會導致檔案沒有更動。


NoteGraphic.png CLI可連續調用腳本實現一行指令同時刪除不同區塊的,但是腳本是以後方區塊刪除後往前堆疊的角度來設計故location的填寫必須先指定大才能指定小,舉例 cut.py test.rar test2.rar 4096 512 && cut.py test2.rar test3.rar 2048 512


corrupt001.png

區塊損壞

腳本

  • 開啟腳本後填寫改寫區塊的起始點以及改寫資料的長度共兩個參數,單位為byte,
  • 腳本備份
#!/usr/bin/python3

default_block_size = 512

def slice_file(source_filename, dest_filename, slice_from, slice_to, block):
    f_in = open(source_filename, 'rb')
    f_out = open(dest_filename, 'wb')
    read_count = 0
    eof = False
    import random
    random.seed()
    while not eof:
        read = f_in.read(block)
        if(len(read) < block): eof = True
        if(read_count < slice_from or read_count >= slice_to):
            f_out.write(read)
        else:
            for i in range(block):
                f_out.write(bytes(chr(random.randint(0,127)), encoding = 'utf-8'))
        read_count += block
    f_in.close()
    f_out.close()


if __name__ == '__main__':
    import sys
    if(len(sys.argv) < 3):
        print('missing arguments:')
        print(sys.argv[0] + ' source_filename dest_filename [slicing_starts_from slicing_length [block_size]]')
        quit()
    source_filename = sys.argv[1]
    dest_filename = sys.argv[2]
    if(len(sys.argv) < 4):
        slice_from = int(input('slicing starts from: '))
        slice_to = slice_from + int(input('slicing length: '))
    else:
        slice_from = int(sys.argv[3])
        slice_to = int(sys.argv[3]) + int(sys.argv[4])
    if(len(sys.argv) >= 6):
        block = int(sys.argv[6])
    else: block = default_block_size
    slice_file(source_filename, dest_filename, slice_from, slice_to, block)

範例

  • 檔案大小:12539482 byte
  • 資料修改起始點:location 0x00
  • 資料修改長度:50byte
  • 結果:location 0x00~0x200資料被改寫,因為block size為512byte,故結果合理。

corrupt002.png