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

조회수 81회
#-*- 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 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    디버거 사용법을 익히세요

    에러가 나는 이유는 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()
    
    • 와! 간단한 답변 감사드립니다. ㅠㅠ 정진규 2020.10.10 21:52

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

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.