sol229 发表于 2018-8-11 12:32:39

python解释NTFS runlist的代码

#!/usr/bin/python3  
#http://www.frombyte.com 张宇
  
import os
  
import sys
  
import random
  
import hashlib
  
import struct
  
import zlib
  
import re
  

  
def help_exit():
  
    print("命令格式:")
  
    print("python3 %s <File name> <Start bytes> <Start LCN> <Start VCN>:" % sys.argv)
  
    print("      File name:要解释的包含runlist的文件名称")
  
    print("      Start bytes:文件中要解释runlist的起始位置")
  
    print("      Start LCN:runlist开始的参考LCN值,如果是一段完整的runlist,这个值应为0.")
  
    print("      Start VCN:runlist开始的参考VCN值,如果是一段没有0x20的runlist,这个值多数为0.")
  
    print("      *返回值:一个二维队列,打印结果。\n")
  
    exit()
  
#通过抛出异常判断第一个参数是否是A-F
  
def is_num_by_except(s):
  
    try:
  
      a=int(s,16)
  
      if (a>0 and a<=16): return True
  
      else: return False
  
    except ValueError:
  
      return False
  

  
if len(sys.argv)!= 5 :
  
    print("***参数数量或格式错误!")
  
    help_exit()
  

  
if sys.argv.isdigit():
  
    spoi = int(sys.argv)
  
    if spoi<0:
  
      print("***错误,起始字节位置不能取负值")
  
      help_exit()
  
else:
  
    print("***错误,起始字节位置应为非负整数")
  
    help_exit()
  

  
if sys.argv.isdigit():
  
    slcn = int(sys.argv)
  
    if slcn<0:
  
      print("***错误,起始LCN不能取负值")
  
      help_exit()
  
else:
  
    print("***错误,起始LCN应为非负整数")
  
    help_exit()
  

  
if sys.argv.isdigit():
  
    svcn = int(sys.argv)
  
    if svcn<0:
  
      print("***错误,起始VCN不能取负值")
  
      help_exit()
  
else:
  
    print("***错误,起始VCN应为非负整数")
  
    help_exit()
  

  
def get_i(vl,ilen):
  
    q=0
  
    for i in range(0,ilen):
  
      q = q | ( vl << i*8 )
  

  
    #若为负数
  
    if vl > 0x80:
  
      q = q - (1 << ilen*8 )
  
    return q
  

  
f = open("%s"%sys.argv,'rb')
  
f.seek(spoi)
  
data = f.read(1024)
  
v1 = 1
  
i = 0
  
lists = [ ]
  
del lists
  

  
while True:
  
t = struct.unpack_from('B',data,i)
  
v1 = t
  
if v1 == 0:
  
    break
  

  
v1_p = (v1 & 0xF0) >> 4
  
v1_l = (v1 &0xF)
  
if (v1_l >=8) or (v1_p >=8) or (v1_l == 0):
  
    print("***偏移%d:run list长度和位置字节有错误!***"%(i+spoi))
  
    break
  

  
i = i+1
  
if (i+8) >= 1024:
  
    break
  
t = struct.unpack_from('8s',data,i)
  
v1_dl = get_i(t,v1_l)
  
if v1_dl < 0:
  
    print("***偏移%d:run片断长度不能为负!***"%(i+spoi))
  
    break
  

  
i = i+ v1_l
  
if (i+8) >= 1024:
  
    break
  
t = struct.unpack_from('8s',data,i)
  
v1_dp = get_i(t,v1_p)
  
slcn = slcn + v1_dp
  
lists.append()
  

  
i = i + v1_p
  
#print("%x,%x:%x,%x"%(v1_l,v1_p,v1_dl,slcn))
  

  
print("Runlist(共%d个片断):"%len(lists))
  
print("%20s%20s%20s"%("VCN","LCN","LEN"))
  
for i in lists:
  
print("%20d%20d%20d"%(svcn,i,i))
  
svcn += i
  

  
f.close()
页: [1]
查看完整版本: python解释NTFS runlist的代码