샤오미 공기청정기 필터 리셋
샤오미 공기청정기의 초기 버전은 필터 유효기간 타이머를 사용자가 임의로 리셋 시킬 수 있었는데, 세대가 점점 올라가더니 현재는 그것이 불가능하다.
이 타이머의 문제는 공기 청정기 필터의 오염도와 무관하게 단순히 시간만으로 필터의 수명을 계산하기 때문에, 거의 오염이 없는 필터라 하더라도 총 가동 시간이 교체 주기 날짜를 초과하면 아래처럼 필터 교체 알림이 지속적으로 발생한다.
다음은 필터 날짜 정보가 저장된 NFC 태그의 교체주기를 리셋 시키는 방법에 대한 설명이다.
플레이스토어에서 아래 앱을 설치한다. (무료앱)
https://play.google.com/store/apps/details?id=com.wakdev.wdnfc
앱 실행 > 읽기를 선택해둔 후, 공기청정기 필터 하단의 NFC 스티커 부분에 폰을 갖다대어 정보를 읽는다.
참고로 먼저 NFC 옵션에서 태그 읽기/쓰기 옵션이 ON 되어있는지 확인하자.
제대로 태그가 읽히면 아래와 같은 형태로 정보가 표시된다.
04로 시작하는 14자리 시리얼 번호를 복사해서 PC로 가져오자.
아래 파이썬 스크립트를 실행하면 시리얼 번호 입력 프롬프트가 표시된다.
복사해온 14자리 숫자를 입력한다.
만약 파이썬 코드 실행에 어려움이 있어서 NFC 패스워드를 얻어내기 어려운 분들은 아래 출처에 표기된 원 저작자의 웹 페이지에서 패스워드 생성 UI를 제공해주고 있으므로 그것을 이용하는 것이 좋다.
import hashlib
def generate_password_from_user_input():
# 사용자 입력으로부터 시리얼값 받기
uid = input("시리얼 번호를 입력하세요: ")
# UID를 바이트 배열로 변환
byte_array = bytearray.fromhex(uid)
# SHA-1 해시 함수 적용
sha1_hash = hashlib.sha1(byte_array).hexdigest()
# SHA-1 해시의 첫 번째 바이트를 기반으로 인덱스 결정
first_byte = int(sha1_hash[:2], 16) # 첫 두 개의 16진수를 10진수로 변환
indices = [
first_byte % 20,
(first_byte + 5) % 20,
(first_byte + 13) % 20,
(first_byte + 17) % 20
]
# SHA-1 해시에서 바이트 추출 및 16진수 문자열로 변환
password_bytes = [sha1_hash[i*2:i*2+2] for i in indices]
# 비밀번호 형성을 위해 바이트 연결
password = ''.join(password_bytes)
# 원하는 형식으로 결과 출력
print(f"시리얼 번호: {uid}\n실행 결과: 1B{password.upper()},3008,A20800000000")
# 함수 호출
generate_password_from_user_input()
# 참고: 이 코드는 대화형 입력을 포함하므로, 로컬 파이썬 환경에서 실행해야 합니다.
시리얼 번호가 04:XX:XX:XX:XX:XX:XX 형태로 표시되는데
콜론을 제외하고 붙여서 "04XXXXXXXXXXXX" 형태로 입력하면 된다.
실행하면 다음과 같은 결과를 얻을 수 있다.
시리얼 번호를 입력하세요: 12345678901234
시리얼 번호: 12345678901234
실행 결과: 1B011853E8,3008,A20800000000
실행 결과를 복사한 후, NFC Tools -> 기타 > 고급 NFC 명령에 그대로 붙여넣는다.
ex) 1B011853E8,3008,A20800000000
붙여넣기만 한다.
휴대폰을 공기청정기 필터 NFC 스티커에 다시 대고 명령 전송을 눌러 NFC 데이터를 Write 한다.
필터 유효기간이 초기화 되었다.
출처
https://unethical.info/2024/01/24/hacking-my-air-purifier/