壞檔的製作方式:修訂間的差異
出自 snowiki
(→腳本) |
|||
| (未顯示同一使用者於中間所作的 3 次修訂) | |||
| 行 6: | 行 6: | ||
==腳本== | ==腳本== | ||
| − | + | *開啟腳本後填寫刪除區塊的起始點(數值請填大於500)以及刪除區塊的總長度(數值請填大於80)兩個參數,單位為byte | |
| − | + | *[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 | ||
| 行 52: | 行 53: | ||
*區塊刪除長度:50byte | *區塊刪除長度:50byte | ||
*結果:location 0x200~ 0x400 被刪除,因為block size為512byte,故採用無條件進入的方式計算來說結果合理。 | *結果:location 0x200~ 0x400 被刪除,因為block size為512byte,故採用無條件進入的方式計算來說結果合理。 | ||
| − | {{Warning| | + | {{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'''}}<br /> | ||
| 行 59: | 行 60: | ||
=區塊損壞= | =區塊損壞= | ||
==腳本== | ==腳本== | ||
| − | + | *開啟腳本後填寫改寫區塊的起始點以及改寫資料的長度共兩個參數,單位為byte, | |
*[http://pastebin.com/dqqsRiMs 腳本備份] | *[http://pastebin.com/dqqsRiMs 腳本備份] | ||
<pre> | <pre> | ||
| 行 108: | 行 109: | ||
==範例== | ==範例== | ||
*檔案大小:12539482 byte | *檔案大小:12539482 byte | ||
| − | * | + | *資料修改起始點:location 0x00 |
| − | * | + | *資料修改長度: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,故採用無條件進入的方式計算來說結果合理。
腳本上設計的限制,前512 byte的資料無法透過這個腳本刪除,參數填的過小會導致檔案沒有更動。
CLI可連續調用腳本實現一行指令同時刪除不同區塊的,但是腳本是以後方區塊刪除後往前堆疊的角度來設計故location的填寫必須先指定大才能指定小,舉例 cut.py test.rar test2.rar 4096 512 && cut.py test2.rar test3.rar 2048 512
區塊損壞
腳本
- 開啟腳本後填寫改寫區塊的起始點以及改寫資料的長度共兩個參數,單位為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,故結果合理。