이 WeChat (위챗) 복호화 방안을 보고 나서야 99%의 사람들이 문제 해결 방식부터 처음부터 틀렸다는 것을 깨달았습니다.
정말로 그의 기술이 남들보다 뛰어나서도 아니고, 아무도 모르는 취약점(Vulnerability)을 찾아냈기 때문도 아닙니다. 반대로 그는 사고의 층위(Level)를 바꾸어, 모두가 매달리고 있는 문제를 직접적으로 우회했습니다.
저도 처음에는 그저 새로운 메모리 오프셋(Memory Offset)을 찾아낸 평범한 기술 과시용 게시물이라고 생각했습니다. 하지만 그의 사고 흐름을 따라 전체 과정을 훑어보고 나서야, 정말 대단한 것은 코드가 아니라 문제를 생각하는 방식이라는 것을 깨달았습니다.
이전의 많은 사람들의 사고 방식은 매우 통일되어 있었습니다. 바로 기존의 키(Key)를 찾는 것이었죠. 메모리를 스캔하고, 데이터베이스(Database)를 끊고, 구조체(Structure)를 뒤지며, 이미 생성된 키를 건져내기 위해 온갖 방법을 다 동원했습니다.
결과적으로 WeChat은 키를 매우 엄격하게 보호하여, 파일로 저장하지 않고(Not landing) 사용 즉시 삭제하며, 최신 버전에서는 메모리에서도 흔적을 찾을 수 없게 만들어 시중의 주요 방안들이 기본적으로 모두 무력화되었습니다.
그는 완전히 다른 방향으로 전환했습니다. 키를 저장하지 않는다면 상관없습니다. 키를 만들어내기는 할 것 아닙니까?
WeChat 스스로 키 유도(Key Derivation)를 하지 않고 반드시 시스템 내장 함수를 호출하여 키를 생성해야 한다면, 저는 키를 찾는 대신 키를 만드는 공장 문 앞을 지키겠습니다. 키가 만들어질 때마다 하나씩 복사하면 됩니다.
이 한 수로 이전의 모든 방어 체계는 무용지물이 되었습니다. 남은 것은 타이밍(Timing)과 서명(Signature) 문제를 해결하는 엔지니어링 문제일 뿐입니다. 프로세스(Process)를 먼저 동결시키고 후킹(Hooking)을 건 뒤에 실행시키고, 원본에는 손대지 않은 채 프로그램을 따로 복사하여 서명하는 방식은 매우 견고하게 구현되었습니다.
하지만 이 일의 진정한 가치는 매우 고전적이고 전형적인 사고 모델을 제공했다는 점에 있다고 생각합니다. 최종 결과물을 얻을 수 없을 때는, 그것이 생성되는 과정을 가로채면 됩니다.
로컬 인지 시스템(Local Cognitive System)을 만드는 사람들에게 이는 가장 핵심적인 단계를 뚫어준 것입니다. 그룹 채팅의 정보를 지식 베이스(Knowledge Base)로 자동 정리하고 싶을 때, 첫 번째 단계는 언제나 안정적인 평문(Plaintext) 데이터를 확보하는 것입니다. 이전에는 이 길이 통하지 않거나 불안정했지만, 이제 재사용 가능한 해결책이 생겼습니다.
제가 채팅 소프트웨어를 해킹하라고 권장하는 것도 아니고, 이 방안이 영원히 유효할 것이라는 뜻도 아닙니다. 제 결론은, 막다른 길처럼 보이는 많은 문제들도 사고의 층위를 바꾸어 해결하면 종종 아주 쉽게 풀린다는 것입니다.