본문으로 바로가기

Firmware header changer

category 프로그래밍/Python 2019.03.14 17:56

오늘 급조해서 1시간만에 firmware header changer를 만들어 보았다.


특별한 기능이 있는 것은 아니지만, 사업자가 이전 버전의 SW로 다시 되돌려 테스트하기를 원한다고 이전 버전의 SW를 다운로드 가능한지 문의가 들어왔다. 어려운 일은 아니지만 자주 발생하면 매우 귀찮은 작업이다.


물론 가능하다. firmware header에 version check flag를 설정하면 STB는 버전에 상관없이 무조건 다운로드를 할 수 있지만, firmware header를 수정해야 하는데 사업자가 변경할 수가 없다. DishTV는 firmware header도 encrypt 되어 있는 것도 문제지만, integrity check도 해야 하기 때문에 수동으로 변경하는 것은 어렵다. 그렇다고 매번 이런 요청이 있을 때마다 우리가 해주는 것도 귀찮기 때문에 사업자가 언제든지 사용할 수 있게 간단히 만들어 보았다.

firmware header가 aes cbc 방식으로 encrypt 되어 있기 때문에 우선 decrypt 기능이 있어야 하며, firmware upgrade 할 때 어떤 정보를 무시할 것인지 선택하는 옵션을 추가하였다. 그리고 사업자가 원하는 옵션으로 firmware header가 변경되면, md5 hmac으로 digest를 생성하여 firmware header를 업데이트 한 후, 다시 aes cbc로 encrypt하여 저장하도록 한다.


이것을 만들면서 파이썬 hash 라이브러리를 처음으로 사용해 보았다. hashlib 및 hmac 라이브러리를 사용하면 매우 쉽게 여러 해쉬에 대한 digest를 얻을 수 있다. 아래의 코드는 md5 hmac의 digest를 얻는 것이다.

import hmac
import hashlib
def hmac_md5(handan_image):
	...
	handan_image[0:64] = header
	hmac_key = bytes([i for i in range(16)])
	digest = hmac.new(md5_key, handan_image, hashlib.md5).digest()
	handan_image[2:18] = digest
...

정말이지, 파이썬 배열과 관련된 문법을 보면 정말 학을 땔 정도로 놀랍고 당황스러울 때가 많이 생긴다. 어떻게 저런 문법이 가능할까...?


어쨌든, 이렇게해서 두번째로 만든 파이썬 윈도우 프로그램이다. ㅎㅎ;;

'프로그래밍 > Python' 카테고리의 다른 글

Pyinstaller - 파이썬 프로그램 배포  (0) 2019.04.19
Firmware header changer  (0) 2019.03.14
OTA TS Generator  (0) 2019.03.08
AES CBC decrypt  (0) 2019.02.26
List Comprehension  (0) 2019.01.17
String to Hex 변환  (0) 2019.01.13