파이썬 unpack 오류 해결좀... 부탁드립니다.

조회수 1139회
#-*- coding: utf-8 -*-
from winreg import *
from os.path import basename
import re, struct

net = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\AppCompatCache"
reg = ConnectRegistry(None,HKEY_LOCAL_MACHINE)
key = OpenKey(reg, net)

a,b,c = EnumValue(key,0)
bin_size = len(b)
print(bin_size)
binary = b

n = 0
header_size = binary[0]
while n < bin_size:
    bin = binary[n+header_size:]
    signature = bin[0:4].decode()
    unknown = bin[4:8].hex()
    entry_size = struct.unpack('i',bin[8:12])[0]
    path_len = struct.unpack('h',bin[12:14])[0]
    path_str = bin[14:path_len+14].decode('UTF-16')
    time = bin[path_len+14:path_len+14+8]
    data_size = struct.unpack('i',bin[path_len+22:path_len+26])[0]
    #data = bin[path_len+14+12:path_len+14+12+data_size]

    print("\nSignatue : " + signature)
    print("\nEntrySize : ",entry_size)
    print("\nPath Length : ",path_len)
    print("\nPath : " + path_str)
    print("\nTime : " ,time)
    print("\nDataSize : " ,data_size)

    n += path_len+12+14+data_size

이미지

코드를 실행하면 결과의 맨 마지막에 에러가 뜨는데 왜 에러가 뜨는지 감이 안잡힙니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 디버거 사용법을 익히세요

    에러가 나는 이유는 bin = binary[n+header_size:] 슬라이싱후 결과가 없습니다.

    data size 이후부터 무조건 자르겠다는 식인데 끝까지 진행하면 더 이상 값이 없을 수도 있다(헤더만 있음)는 것을 놓친겁니다.

    간단한 해결방법은 아래와 같이 검증로직을 넣는 겁니다.

    while n < bin_size:
        bin = binary[n+header_size:]
        if not bin:break    # bin 값이 없으면 중지
        signature = bin[0:4].decode()
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)