2017-06-23 6 views
0

this answerからコードをテストする場合、私は出力を受け取る行う、しかし、それはいくつかの成果物を持っているようだ...Pythonのショートカット(.lnk)からターゲットパスを読み込むと、ファイルパスのアーティファクトが発生しますか?

これは私がテストしたコードです:

import locale 
import struct 

def __readLink(path): 
    target = '' 

    try: 
     with open(path, 'rb') as stream: 
      content = stream.read() 

      # skip first 20 bytes (HeaderSize and LinkCLSID) 
      # read the LinkFlags structure (4 bytes) 
      lflags = struct.unpack('I', content[0x14:0x18])[0] 
      position = 0x18 

      # if the HasLinkTargetIDList bit is set then skip the stored IDList 
      # structure and header 
      if (lflags & 0x01) == 1: 
       position = struct.unpack('H', content[0x4C:0x4E])[0] + 0x4E 

      last_pos = position 
      position += 0x04 

      # get how long the file information is (LinkInfoSize) 
      length = struct.unpack('I', content[last_pos:position])[0] 

      # skip 12 bytes (LinkInfoHeaderSize, LinkInfoFlags, and VolumeIDOffset) 
      position += 0x0C 

      # go to the LocalBasePath position 
      lbpos = struct.unpack('I', content[position:position+0x04])[0] 
      position = last_pos + lbpos 

      # read the string at the given position of the determined length 
      size= (length + last_pos) - position - 0x02 
      temp = struct.unpack('c' * size, content[position:position+size]) 
      target = ''.join([chr(ord(a)) for a in temp]) 
    except: 
     # could not read the file 
     pass 

    return target 

print(__readLink('test.lnk')) 

出力は下記リンクされている、など何らかの理由で完全にコピーしません。

私が見る別の問題は、完全なファイル拡張子を出力しないということですか?それは.MP4する必要がありますが、それは は、多くの固定オフセット値にある、MS-SHLLINK仕様に従っていません「.mpという」

Image of output

答えて

0

質問からコードで終了します。

MS-SHLLINK: Shell Link (.LNK) Binary File Format
別のデータオブジェクトにアクセスするために使用できる情報が含まれているシェルリンクバイナリファイル形式を指定します。シェルリンクバイナリファイル形式は、拡張子 "LNK"を持つWindowsファイルの形式です。

次のコードでは、固定オフセットとしてLinkFlags 0x14LinkTargetIDList 0x4cのみを使用しています。

def LocalBasePath(path): 
    def unpack(offset, size): 
     m = 'I' 
     if size == 2: m = 'H' 
     return struct.unpack(m, content[offset:offset+size])[0] 

    target = '' 
    try: 
     with open(path, 'rb') as fh: 
      content = fh.read() 

     # Read the LinkFlags 4 bytes 
     LinkFlags = unpack(0x14, 4) 

     position = 0x4c 
     # Skip LinkTargetIDList if HasLinkTargetIDList 
     if (LinkFlags & 0x01) == 1: 
      position += unpack(position, 2) 

     position += 0x02 # TerminalID 2 bytes 
     LinkInfo_offset = position 
     LinkInfoSize = unpack(position, 4) 

     # Skip 4 * 4 bytes in LinkInfo 
     LokalBasePathOffset = LinkInfo_offset + (4 * 4) 
     LocalBasePath = LinkInfo_offset + unpack(LokalBasePathOffset, 4) 

     # Read LocalBasePath String 
     size = ((LinkInfo_offset + LinkInfoSize) - LocalBasePath) -2 
     target = ''.join([chr(ord(a)) for a in struct.unpack('c' * size, content[LocalBasePath:LocalBasePath+size])]) 

    except Exception as exp: 
     print(exp) 

    return target 

は、Pythonでテスト:3.4.2

関連する問題