设为首页 收藏本站
查看: 1576|回复: 0

[经验分享] python解释NTFS runlist的代码

[复制链接]

尚未签到

发表于 2018-8-11 12:32:39 | 显示全部楼层 |阅读模式
#!/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[0])
  
    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[2].isdigit():
  
    spoi = int(sys.argv[2])
  
    if spoi<0:
  
      print("***错误,起始字节位置不能取负值")
  
      help_exit()
  
else:
  
    print("***错误,起始字节位置应为非负整数")
  
    help_exit()
  

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

  
if sys.argv[4].isdigit():
  
    svcn = int(sys.argv[4])
  
    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[0] << i*8 )
  

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

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

  
while True:
  
  t = struct.unpack_from('B',data,i)
  
  v1 = t[0]
  
  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([slcn,v1_dl])
  

  
  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[0],i[1]))
  
  svcn += i[1]
  

  
f.close()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-550149-1-1.html 上篇帖子: python list unicode转中文显示 下篇帖子: python连接数据库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表