[Anti-Virus] VirusDB 인/디코딩

SMONGS·2024년 4월 4일

백신

목록 보기
3/4

악성코드 패턴 분리

악성코드 패턴 로딩

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 연산하지 않았다.

정리

악성코드 패턴 파일을 별도로 분리해서 패턴만 추가하여 패턴 파일만 배포 가능하도록 해보았다.

분리된 악성코드 패턴 파일은 외부 사용자에 의해 조작될 수 있기 때문에 암호화가 필요하며 암호화된 악성코드 패턴 파일을 보호화하여 사용할 수 있도록 하였다.

profile
반갑습니당~😄

0개의 댓글