def LoadVirusDB():
buf = DecodeKMD('virus.kmd')
fp = BytesIO(buf)
while True:
line = fp.readline()
if not line: break
line = line.strip().decode('utf-8')
VirusDB.append(line)
print(VirusDB)
fp.close()
virus.kmd 라는 DB파일을 암호화해서 만들어준 파일이다.
그 파일을 읽어서 검사하는 파일과 비교할 수 있도록 VirusDB 리스트에 추가해 준다.
fp = open(tname, 'rb')
buf = fp.read()
fp.close()
buf2 = zlib.compress(buf)
buf3 = b''
for c in buf2:
buf3 += bytes([c ^ 0xFF])
buf4 = b'KAVM' + buf3
f = buf4
for _ in range(3):
md5 = hashlib.md5()
md5.update(f)
f = md5.hexdigest().encode('utf-8')
buf4 += f
kmd_name = fname.split('.')[0] + '.kmd'
fp = open(kmd_name, 'wb')
fp.write(buf4)
fp.close()
zlib.compress() 함수로 압축된 데이터는 바이트 배열이므로 각 요소는 정수형이 된다.
그렇기에 이 정수 값을 XOR 연산을 수행할 때, 각 정수 값을 바이트로 변환하여 XOR 연산을 수행해야 한다.
bytes([c ^ 0xFF]) # 이렇게
update() 메서드는 바이트열이나 바이트 배열을 받는다.
f는 바이트열로 되어있기에 문제가 없다.
f가 문자열이었으면 update(f.encode('utf-8'))을 해주면된다.
update() 메서드에서 바이트열이나 바이트 배열을 받기에 맞춰서 넣었으며,
hexdigest() 메서드는 문자열로 변환해서 출력해주는 것으로 알고 있었다.
하지만, TypeError: Strings must be encoded before hashing 에러가 발생하면서 문제가 발생했다.
어찌저찌 하다가 밑에 코드처럼 수정했더니 잘 작동되었다.
해시된 결과를 바이트열 형태로 유지하면서, 해당 결과를 다시 해싱하는 방식으로 바꾸었다.
md5.hexdigest().encode('utf-8')
이 부분은 아직 잘 이해가 덜 되었다... (ㅜ.ㅜ)
fp = open(fname, 'rb')
buf = fp.read()
fp.close()
buf2 = buf[4:-32]
fmd5 = buf[-32:]
f = b'KAVM' + buf2
for _ in range(3):
md5 = hashlib.md5()
md5.update(f)
f = md5.hexdigest().encode('utf-8')
if f != fmd5:
raise SystemError
buf3 = b''
for c in buf2:
buf3 += bytes([c ^ 0xFF])
buf4 = zlib.decompress(buf3)
return buf4
buf2에서 'KAVM' 문자열을 제외하지 않았기에 복호화 과정에서 오류가 날 수 있다.
그래서 buf2[4:]를 사용해서 일부를 XOR 연산하지 않았다.
악성코드 패턴 파일을 별도로 분리해서 패턴만 추가하여 패턴 파일만 배포 가능하도록 해보았다.
분리된 악성코드 패턴 파일은 외부 사용자에 의해 조작될 수 있기 때문에 암호화가 필요하며 암호화된 악성코드 패턴 파일을 보호화하여 사용할 수 있도록 하였다.